Compare commits
32 Commits
69707f32a7
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e43b4f05f0 | ||
|
|
2677cf9dac | ||
|
|
20b84632ec | ||
|
|
5718edecaf | ||
|
|
40b5b8e4a8 | ||
|
|
8f7c118fb3 | ||
|
|
c30363ec9f | ||
|
|
ec786be797 | ||
|
|
f299cef9be | ||
|
|
f5e37729ab | ||
|
|
7297017250 | ||
|
|
66b89f3cee | ||
|
|
11a3e4ef13 | ||
|
|
7c6dacdbd8 | ||
|
|
9093b429ca | ||
|
|
df3b34c8ad | ||
|
|
67c738fae3 | ||
|
|
c0e9b41cd1 | ||
|
|
af2fdd230c | ||
|
|
0c597ebbf8 | ||
|
|
4bc87f927b | ||
|
|
a94b7ec493 | ||
|
|
8c17ad4035 | ||
| 383c272d9a | |||
|
|
d434138f9b | ||
|
|
80c4ae38fb | ||
|
|
8ae6d86a8c | ||
|
|
ffb444e4f9 | ||
|
|
7fd732ad17 | ||
|
|
3ad4a3e025 | ||
|
|
92491adf85 | ||
|
|
3e50fb9a49 |
@@ -1,31 +1,41 @@
|
||||
# OpenJibo
|
||||
|
||||
## Summary
|
||||
|
||||
OpenJibo is the working revival track for Jibo.
|
||||
|
||||
The near-term plan is intentionally concrete:
|
||||
We are rebuilding the hosted cloud first, then using that foundation for OTA, Open Jibo OS, and a tiered brain that can eventually hand higher-order work to CoffeeBreak without losing Jibo's original charm.
|
||||
|
||||
1. Build a stable replacement cloud on Azure.
|
||||
2. Use the existing Node prototype as the protocol oracle and capture harness.
|
||||
3. Port the hosted implementation to .NET as a modular monolith.
|
||||
4. Bring real robots online first through RCM plus controlled DNS/TLS patching.
|
||||
5. Use OTA later to reduce setup friction once the hosted cloud is proven.
|
||||
## Current Focus
|
||||
|
||||
This keeps the project grounded in what is already working while moving toward a maintainable hosted platform.
|
||||
- ship a stable Azure-hosted replacement cloud
|
||||
- keep the Node prototype as the protocol oracle and capture harness
|
||||
- port the production path to .NET
|
||||
- support real devices through repeatable bootstrap steps first
|
||||
- use OTA later to reduce recovery friction once the cloud is trustworthy
|
||||
|
||||
## Current Truth
|
||||
Current release truth lives in [docs/development-plan.md](docs/development-plan.md). The current cloud release constant is `1.0.19`.
|
||||
|
||||
## Roadmap
|
||||
|
||||
The long-range plan is summarized in [docs/roadmap.md](docs/roadmap.md). In short:
|
||||
|
||||
1. Working hosted cloud.
|
||||
2. OTA-assisted recovery and updates.
|
||||
3. Open Jibo OS / `open-jibo` mode conversion.
|
||||
4. Tiered brain and CoffeeBreak orchestration.
|
||||
5. Broader ecosystem expansion.
|
||||
|
||||
## Current Architecture
|
||||
|
||||
The repo now has three distinct lanes:
|
||||
|
||||
- `src/Jibo.Cloud/node`
|
||||
The discovery server. This is the best source of observed protocol behavior today.
|
||||
Protocol oracle, discovery server, fixture source, and rapid reverse-engineering lab.
|
||||
- `src/Jibo.Cloud/dotnet`
|
||||
The long-term hosted implementation. This is where the stable cloud is being built.
|
||||
Production-oriented hosted implementation intended for Azure deployment and long-term maintenance.
|
||||
- `src/Jibo.Runtime.Abstractions`
|
||||
The normalized runtime seam between robot/cloud traffic and modern conversation logic.
|
||||
The seam between robot/cloud traffic and higher-level runtime and capability logic.
|
||||
|
||||
The key architectural idea is:
|
||||
The core shape is:
|
||||
|
||||
```text
|
||||
Jibo device -> OpenJibo cloud -> normalized runtime contracts -> capabilities and planning
|
||||
@@ -40,18 +50,30 @@ QR Wi-Fi -> inject OpenJibo region config -> set robot region ->
|
||||
RCM/device patch for TLS and host acceptance -> OpenJibo cloud on Azure
|
||||
```
|
||||
|
||||
That path is documented in [docs/device-bootstrap.md](/OpenJibo/docs/device-bootstrap.md).
|
||||
That path is documented in [docs/device-bootstrap.md](docs/device-bootstrap.md).
|
||||
|
||||
## Design Principles
|
||||
|
||||
- Preserve the original skills and visual design.
|
||||
- Build the hosted cloud before making OTA the default recovery path.
|
||||
- Keep every migration reversible whenever possible.
|
||||
- Prefer source-backed slices over speculative rewrites.
|
||||
- Let Jibo remain the face of the experience, even when higher-level orchestration sits behind him.
|
||||
|
||||
## Repo Map
|
||||
|
||||
```text
|
||||
OpenJibo/
|
||||
docs/
|
||||
roadmap.md
|
||||
development-plan.md
|
||||
device-bootstrap.md
|
||||
protocol-inventory.md
|
||||
feature-backlog.md
|
||||
public-site-plan.md
|
||||
regression-test-plan.md
|
||||
release-1.0.19-plan.md
|
||||
support-tiers.md
|
||||
system-diagram-alignment.md
|
||||
|
||||
scripts/bootstrap/
|
||||
Discover-JiboHosts.ps1
|
||||
@@ -67,56 +89,15 @@ OpenJibo/
|
||||
OpenJibo.Site/
|
||||
```
|
||||
|
||||
## Decisions Locked In
|
||||
## Living Docs
|
||||
|
||||
- The first milestone is `core revive`, not full protocol parity.
|
||||
- Azure SQL is the relational system of record for the hosted cloud.
|
||||
- Billing and donations are future-compatible concerns, not phase-one delivery requirements.
|
||||
- OTA is a phase-two simplification strategy, not the initial dependency.
|
||||
Use these when you want the active technical truth:
|
||||
|
||||
## Near-Term Work
|
||||
- [Development plan](docs/development-plan.md)
|
||||
- [Feature backlog](docs/feature-backlog.md)
|
||||
- [Release 1.0.19 plan](docs/release-1.0.19-plan.md)
|
||||
- [Support tiers](docs/support-tiers.md)
|
||||
- [System diagram alignment](docs/system-diagram-alignment.md)
|
||||
- [Public site plan](docs/public-site-plan.md)
|
||||
|
||||
- port required endpoint and WebSocket behavior from Node to .NET
|
||||
- keep protocol captures and replay fixtures current
|
||||
- keep HTTP and websocket live-run telemetry writing to the same repo-root capture tree
|
||||
- harden device bootstrap documentation and scripts
|
||||
- map more endpoints and behaviors beyond the current Node coverage
|
||||
- stand up the initial `openjibo.com` information site
|
||||
|
||||
## Live Test Status
|
||||
|
||||
The first physical `.NET -> Jibo` experiments have now produced useful captures, but not a full wake-and-interact success yet.
|
||||
|
||||
What we have confirmed so far:
|
||||
|
||||
- the robot reaches `.NET` HTTP startup calls on `api.jibo.com`
|
||||
- `.NET` can issue a robot token and accept the `api-socket.jibo.com` websocket
|
||||
- live HTTP and websocket telemetry are now intended to land together under repo-root `captures/`
|
||||
|
||||
What remains unresolved:
|
||||
|
||||
- matching the Node startup cadence closely enough for consistent wake/eye-open behavior
|
||||
- the next post-`api-socket` startup requests and timing seen in successful Node runs
|
||||
- broader live websocket behavior on a real robot beyond the current synthetic parity slice
|
||||
|
||||
The current websocket bridge now also includes server-driven raw-audio turn completion:
|
||||
|
||||
- enough buffered audio plus `CONTEXT` can now trigger auto-finalize on the server side
|
||||
- `EOS` is emitted on that auto-finalize path so turns do not remain open indefinitely
|
||||
- transcript-less raw-audio turns still fall back to a synthetic compatibility response, not real ASR
|
||||
|
||||
The current richer websocket parity slice is still intentionally narrow:
|
||||
|
||||
- the successful joke path now has fixture-backed reply sequencing and partial payload-shape fidelity through `CLIENT_ASR -> LISTEN -> EOS -> delayed SKILL_ACTION`
|
||||
- menu-side `CLIENT_NLU` parity is beginning to expand from live captures, starting with preserved clock-menu intent/rules/entities
|
||||
- `.NET` now preserves buffered websocket audio frames so local tool-based ASR experiments can run without changing the stable cloud-first architecture
|
||||
- this is not a claim of broad skill parity or full Jibo websocket coverage
|
||||
|
||||
## Important Docs
|
||||
|
||||
- [Cloud overview](/src/Jibo.Cloud/README.md)
|
||||
- [Development plan](/docs/development-plan.md)
|
||||
- [Protocol inventory](/docs/protocol-inventory.md)
|
||||
- [Support tiers](/docs/support-tiers.md)
|
||||
- [Device bootstrap path](/docs/device-bootstrap.md)
|
||||
- [Public site plan](/docs/public-site-plan.md)
|
||||
If you only read one document for the long view, make it [docs/roadmap.md](docs/roadmap.md).
|
||||
|
||||
@@ -88,6 +88,11 @@ Current websocket scope:
|
||||
- active local prompt preservation so `shared/yes_no`, clock, gallery, and settings prompts can still consume transcript-bearing short replies even when the stock skill reports a local context
|
||||
- binary audio ignored for an existing transID until a fresh `LISTEN` has been seen, preventing context-only or post-speech tails from reopening an endless buffered turn
|
||||
- blank-audio hotphrase turns clear pending listen state and install a short late-audio ignore window
|
||||
- first GLSM-aligned listener telemetry and recovery slice is now in source:
|
||||
- derived phase labels (`HJ_LISTENING`, `LISTENING`, `WAIT_LISTEN_FINISHED`, `DISPATCH_DIALOG`, `PROCESS_LISTENER_QUEUE`)
|
||||
- `glsm_phase_transition` turn diagnostics
|
||||
- websocket turn events with `glsmPhase` snapshots
|
||||
- stale pending-listen recovery for long-open no-context/no-audio listens before processing a new hotphrase listen
|
||||
- unknown inbound websocket types dropped silently instead of echoing stock-OS-unknown OpenJibo events
|
||||
- file telemetry and fixture export for HTTP, websocket, and turn captures
|
||||
|
||||
@@ -145,6 +150,7 @@ Use these sources as evidence, not as code to copy blindly:
|
||||
- User-provided original source snapshot: `..\jibo` when extracted locally
|
||||
- Original Pegasus cloud source inside that snapshot: `pegasus`
|
||||
- Original SDK and skill source inside that snapshot: `sdk`
|
||||
- Legacy listener flow reference diagram: `..\jibo\sdk\packages\skills-service-manager\resources\state-diagrams\glsm.png`
|
||||
- JiboOS reference tree: `..\JiboOS`
|
||||
- JiboOS skill snapshot: `..\JiboOS\opt\jibo\Jibo\Skills\@be`
|
||||
|
||||
|
||||
@@ -301,6 +301,20 @@ Current release theme:
|
||||
- Follow-up:
|
||||
- live smoke should confirm `cloud version` speaks `1.0.18`, carries `match.skipSurprises = true`, does not stop itself on the word `Jibo`, and settles without a generic `I heard...` reply or a local surprise handoff
|
||||
|
||||
### GLSM Listener Flow Capture And Recovery
|
||||
|
||||
- Status: `implemented`
|
||||
- Tags: `protocol`, `docs`
|
||||
- Result:
|
||||
- the legacy listener state machine source (`sdk ... glsm.png`) is now captured in current planning docs
|
||||
- runtime now emits GLSM-aligned phase snapshots (`HJ_LISTENING`, `LISTENING`, `WAIT_LISTEN_FINISHED`, `DISPATCH_DIALOG`, `PROCESS_LISTENER_QUEUE`)
|
||||
- turn diagnostics now include `glsm_phase_transition` for phase changes
|
||||
- websocket telemetry now records `glsmPhase` on binary/context/turn events
|
||||
- stale pending-listen recovery is now in source so a long-open no-context/no-audio listen can be cleared when the next hotphrase listen arrives
|
||||
- Follow-up:
|
||||
- live-capture proof is still required against the recurring blue-ring/stuck-listening sequence
|
||||
- deeper GLSM parity (`Interrupt Listeners`, launch/global parse branches) should be tackled after this first capture slice is validated on-device
|
||||
|
||||
### End-Of-Skill Surprise Suppression
|
||||
|
||||
- Status: `implemented`
|
||||
@@ -462,7 +476,7 @@ Current release theme:
|
||||
|
||||
### Next Up (`2026-05-06`): Dialog Parsing Expansion And Ambiguity Guardrails
|
||||
|
||||
- Status: `ready`
|
||||
- Status: `polish`
|
||||
- Tags: `protocol`, `content`, `stt`, `docs`
|
||||
- Why now:
|
||||
- this is the next queued `1.0.19` implementation slice after weather provider bring-up
|
||||
@@ -473,6 +487,13 @@ Current release theme:
|
||||
- add ambiguity guardrails for overlapping intents (date vs birthday, generic chat vs memory set/lookup, weather variants)
|
||||
- preserve command-vs-question personality behavior and stock skill launch compatibility
|
||||
- add focused tests for new phrase families and negative boundary cases
|
||||
- Progress update (`2026-05-07`):
|
||||
- implemented date/time guardrails so birthday phrasing is not misrouted to date
|
||||
- expanded phrase coverage for:
|
||||
- birthday alias set/recall (`bday` variants)
|
||||
- shorthand favorites (`my favorite sport football`)
|
||||
- weather phrasing (`what's today's weather look like`, `will it be sunny tomorrow`)
|
||||
- updated continuation deferral so complete shorthand favorites finalize instead of waiting for missing continuation
|
||||
- Exit criteria:
|
||||
- ambiguous phrase handling is improved without regressions in existing `1.0.19` features
|
||||
- phrase imports are documented and traceable to Pegasus parser sources
|
||||
@@ -633,6 +654,8 @@ Current release theme:
|
||||
- Follow-up:
|
||||
- add durable persistence path for personal facts
|
||||
- broaden fact categories further (multi-person household memory, relationship cues, and corrective updates)
|
||||
- add explicit person-scoped state so future interactions can distinguish household members inside the same loop
|
||||
- define the first server-to-server sync envelope for durable state before we need it in production
|
||||
|
||||
### 24. Memory-Triggered Proactivity Baseline
|
||||
|
||||
@@ -648,6 +671,7 @@ Current release theme:
|
||||
- expand proactivity beyond pizza to additional Pegasus-backed categories
|
||||
- add cooldown/throttle policy and observability around proactive offer frequency
|
||||
- connect memory store to durable multi-tenant persistence
|
||||
- keep the sync story visible so stateful offers can survive a multi-server deployment later
|
||||
|
||||
### 25. Weather Report-Skill Launch Compatibility
|
||||
|
||||
@@ -664,6 +688,164 @@ Current release theme:
|
||||
- connect weather units and location directly to user/report-skill settings parity instead of config defaults
|
||||
- add richer condition-change commentary and view parity with original report-skill weather behaviors
|
||||
|
||||
### 26. Presence-Aware Greetings And Identity Proactivity
|
||||
|
||||
- Status: `ready`
|
||||
- Tags: `protocol`, `content`, `storage`, `docs`
|
||||
- Why now:
|
||||
- this is the next personality-charm expansion after parser guardrail and weather bring-up
|
||||
- Pegasus greetings behavior is strongly tied to presence/identity signals and proactive cooldown policy
|
||||
- current OpenJibo has memory/proactivity foundations but no first-class presence extraction path yet
|
||||
- Pegasus source anchors:
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\be-skills\greetings_manifest.json`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\GreetingsSkill.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\GreetingsSM.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\src\proactive\ProactiveTransactionHandler.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\src\proactive\tools\ContextTools.ts`
|
||||
- Scope:
|
||||
- extract presence/identity context (`speaker`, `peoplePresent`, focused person) from runtime context payload
|
||||
- add greeting intent families and state-machine split for reactive vs proactive greeting routes
|
||||
- add cooldown and trigger-source guardrails for proactive greetings
|
||||
- start person-aware greeting hooks (name-aware greeting, morning greeting policy, return greeting policy)
|
||||
- Exit criteria:
|
||||
- presence-aware greetings are routed deterministically with tests
|
||||
- proactive greetings are frequency-bounded and do not trigger from surprise source when blocked by policy
|
||||
- fallback behavior remains stable when identity is unknown or context is incomplete
|
||||
- docs and release tracking are updated with shipped scope and residual gaps
|
||||
- Tracking:
|
||||
- [greetings-presence-plan.md](greetings-presence-plan.md)
|
||||
- [release-1.0.19-plan.md](release-1.0.19-plan.md)
|
||||
|
||||
### 27. Personal Report Parity Track (Weather/News/Commute/Calendar)
|
||||
|
||||
- Status: `in_progress`
|
||||
- Tags: `protocol`, `content`, `storage`, `docs`
|
||||
- Why now:
|
||||
- personal report is a core Jibo charm surface and currently split between implemented weather speech and placeholder calendar/commute/news content
|
||||
- Pegasus weather used explicit condition animations and weather views; current OpenJibo weather is functional but visually lighter
|
||||
- Scope:
|
||||
- weather icon/animation parity and view support
|
||||
- broader non-local weather query handling and short-range date coverage
|
||||
- provider-backed news ingestion and filtering
|
||||
- commute provider path and settings schema
|
||||
- coverage matrix for personal report parity gaps and test/capture exit criteria
|
||||
- Progress update (`2026-05-10`):
|
||||
- added provider-ready news briefing lane with Nimbus-compatible `news` skill payload continuity
|
||||
- added memory/transcript category hint plumbing for provider requests (sports/technology/business/general)
|
||||
- fallback synthetic news behavior remains active when no provider key is configured
|
||||
- added TTL caching for weather/news provider calls to reduce repeated external requests
|
||||
- Source anchors:
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\src\subskills\weather\WeatherMimLogic.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\resources\views\weatherHiLo.json`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\src\subskills\news\NewsMimLogic.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\src\subskills\commute\CommuteMimLogic.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\pegasus-skills\report_skill_manifest.json`
|
||||
- Tracking:
|
||||
- [personal-report-parity-plan.md](personal-report-parity-plan.md)
|
||||
- [release-1.0.19-plan.md](release-1.0.19-plan.md)
|
||||
|
||||
### 28. Grocery List Capability (Requested Feature)
|
||||
|
||||
- Status: `discovery`
|
||||
- Tags: `content`, `docs`, `storage`
|
||||
- Why now:
|
||||
- directly requested by Jibo owners and fits memory + household utility roadmap
|
||||
- Source findings:
|
||||
- Pegasus has scripted responses for shopping/to-do list requests but no standalone grocery-list skill in this snapshot
|
||||
- examples:
|
||||
- `C:\Projects\jibo\pegasus\packages\chitchat-skill\mims\scripted-responses\RA_JBO_ShoppingList.mim`
|
||||
- `C:\Projects\jibo\pegasus\packages\chitchat-skill\mims\scripted-responses\RA_JBO_ManageToDoList.mim`
|
||||
- Candidate delivery paths:
|
||||
- native lightweight list skill (fastest user value)
|
||||
- integration-backed list orchestration (long-term richer ecosystem fit)
|
||||
- Exit criteria:
|
||||
- clear decision on MVP path
|
||||
- first schema for list items + ownership scope
|
||||
- initial voice flows and follow-up intent handling defined
|
||||
|
||||
### 29. Legacy MIM Personality Import Ladder
|
||||
|
||||
- Status: `in_progress`
|
||||
- Tags: `content`, `protocol`, `docs`
|
||||
- Why now:
|
||||
- we already have a chitchat/content scaffold that can render stock-compatible personality replies
|
||||
- the legacy `chitchat-mims` tree is mostly declarative content, so a phased import can add visible charm fast
|
||||
- this is the best near-term path to get Jibo feeling more interactive without needing a full Pegasus runtime clone
|
||||
- What is possible today:
|
||||
- direct scripted replies through the existing content catalog
|
||||
- stock-compatible payloads with `skillId`, `mim_id`, `mim_type`, `prompt_id`, and ESML
|
||||
- current examples already prove the shape for pizza, dance, weather, news, and generic chat
|
||||
- What we need to build:
|
||||
1. a MIM inventory importer that can scan the legacy tree and normalize `skill_id`, `mim_id`, prompt text, and metadata
|
||||
2. a prompt-selection layer that can choose by category and condition metadata
|
||||
3. a safe ESML/prompt renderer for imported content
|
||||
- What can be ported with each build:
|
||||
- Build A: declarative prompt packs
|
||||
- `core-responses`
|
||||
- `deflector`
|
||||
- the simplest `emotion-responses`
|
||||
- direct `scripted-responses` that are just prompt lists
|
||||
- Build B: conditioned prompt packs
|
||||
- `gqa-responses`
|
||||
- structured emotion prompts with `condition` gates
|
||||
- any response families that only need simple state or Jibo-emotion checks
|
||||
- Build C: conversation families
|
||||
- richer `scripted-responses` that need follow-up state
|
||||
- holiday / special-date personality sets
|
||||
- more nuanced chitchat branches that depend on context-aware routing
|
||||
- Build D: full parity cleanup
|
||||
- larger cross-skill collections
|
||||
- any MIMs that depend on Pegasus-only parser assumptions
|
||||
- any files that need dedicated runtime abstraction instead of catalog lookup
|
||||
- Low-hanging fruit for tonight:
|
||||
- import the smallest declarative packs first so we can test something tomorrow
|
||||
- prioritize anything that is pure prompt text with no complex branching
|
||||
- keep the first pass limited to content that maps cleanly onto the current catalog shape
|
||||
- Progress update (`2026-05-13`):
|
||||
- added the first Build A importer scaffold in the cloud content repository
|
||||
- checked in a small seed bundle under `Content/LegacyMims/BuildA`
|
||||
- added focused importer tests for prompt stripping, bucketing, and merge behavior
|
||||
- expanded Build A with additional easy scripted-response packs for identity and persona replies
|
||||
- started Build B with source-backed scripted-response packs for work, food, home, birthplace, language, hobby, and material questions
|
||||
- Tomorrow test target:
|
||||
- verify imported personality replies show up through the existing chitchat route
|
||||
- confirm the emitted payload still looks like a stock skill response
|
||||
- confirm the imported content does not disturb existing weather/news/pizza flows
|
||||
- Exit criteria:
|
||||
- a first importer path exists for the simplest legacy MIM files
|
||||
- at least one legacy prompt pack is running through OpenJibo content instead of hand-authored fallback text
|
||||
- we have a clear second-wave list for the more conditional MIM families
|
||||
|
||||
### 30. Original Personalized Function Inventory
|
||||
|
||||
- Status: `discovery`
|
||||
- Tags: `content`, `docs`, `protocol`
|
||||
- Why now:
|
||||
- we are actively porting persona and memory slices, so we need a bounded checklist of the original Jibo charm surfaces
|
||||
- the goal is to keep the next few passes focused on personality-rich wins instead of letting the work sprawl
|
||||
- Known sources:
|
||||
- legacy Jibo OS/Pegasus chitchat and MIM response families
|
||||
- current OpenJibo persona, memory, and greeting work as the implementation target
|
||||
- Inventory to track:
|
||||
- identity and origin questions
|
||||
- personality and capability questions
|
||||
- favorite-style prompts like `what is your favorite color`
|
||||
- attraction and preference prompts like `what is your favorite flower`, `do you like R2D2`, `do you like the sun`, `do you like space`, and `do you like kids`
|
||||
- charm/capability prompts like `can you laugh` and `can you dance`
|
||||
- mood / affect questions
|
||||
- recognition follow-ups like `do you know me`
|
||||
- follow-up state prompts that should stay warm and locally grounded
|
||||
- Next pass targets:
|
||||
- document the remaining persona inventory so we keep a clean checklist for the next passes
|
||||
- keep the favorites family moving with source-backed imports where available, and temporary runtime replies only when the source is missing
|
||||
- keep adding small sourced personality batches, especially the legacy `R2D2`, `sun`, `space`, `kids`, and charm prompts
|
||||
- keep adding 1-3 persona prompts per pass with tests
|
||||
- prefer source-backed MIM imports when the legacy text is available, and use a temporary runtime reply only when needed to unblock user value
|
||||
- Exit criteria:
|
||||
- a stable checklist exists for the original persona surface
|
||||
- each pass can be scoped to a small batch of prompts
|
||||
- the backlog makes it obvious what is still missing without losing momentum
|
||||
|
||||
## Suggested Order
|
||||
|
||||
Before closing `1.0.18`:
|
||||
@@ -682,15 +864,19 @@ For `1.0.19`:
|
||||
2. Expand memory-backed personal facts with tenant-scoped storage (beyond the first birthday/preferences foundation) - implemented
|
||||
3. Proactivity selector baseline with source-backed first offers - implemented
|
||||
4. Weather report-skill launch compatibility - implemented
|
||||
5. Dialog parsing expansion and ambiguity guardrails - queued next as of `2026-05-06`
|
||||
6. Holidays and seasonal personality behavior built on the new memory/proactivity foundation
|
||||
7. Durable memory persistence path (multi-tenant backing store)
|
||||
8. Update, backup, and restore proof
|
||||
9. STT upgrade and noise screening
|
||||
10. Hosted capture/storage plan / indexing for group testing
|
||||
11. Binary-safe media storage / sync to cloud drive: OneDrive, Google Drive, Box, etc.
|
||||
12. Provider-backed news and weather parity polish
|
||||
13. Lasso, identity, and onboarding as larger discovery-driven tracks
|
||||
5. Dialog parsing expansion and ambiguity guardrails - in progress (`2026-05-09` third guardrail slice implemented; Pegasus affinity phrase families + continuation guardrails expanded)
|
||||
6. Presence-aware greetings and identity-triggered proactivity - implemented (trigger path, identity-aware reactive/proactive replies, cooldown metadata wiring, focused websocket coverage)
|
||||
7. Personal report parity track (weather visuals, live news path, commute path, calendar parity matrix) - in progress (`2026-05-10` first live-news provider slice implemented)
|
||||
8. Holidays and seasonal personality behavior built on the new memory/proactivity foundation
|
||||
9. Durable memory persistence path (multi-tenant backing store)
|
||||
10. Update, backup, and restore proof
|
||||
11. STT upgrade and noise screening
|
||||
12. Hosted capture/storage plan / indexing for group testing
|
||||
13. Binary-safe media storage / sync to cloud drive: OneDrive, Google Drive, Box, etc.
|
||||
14. Provider-backed news and weather parity polish
|
||||
15. Grocery list capability discovery and MVP selection
|
||||
16. Lasso, identity, and onboarding as larger discovery-driven tracks
|
||||
17. Legacy MIM personality import ladder and first declarative prompt packs
|
||||
|
||||
For `1.0.20` and beyond:
|
||||
|
||||
|
||||
173
OpenJibo/docs/greetings-presence-plan.md
Normal file
173
OpenJibo/docs/greetings-presence-plan.md
Normal file
@@ -0,0 +1,173 @@
|
||||
# Greetings And Presence Plan (`1.0.19`)
|
||||
|
||||
## Purpose
|
||||
|
||||
Recreate the original Jibo greeting charm with modern cloud architecture:
|
||||
|
||||
- person-aware greetings when someone is detected
|
||||
- proactive offers tied to presence, time of day, and memory
|
||||
- safe cooldown rules so proactivity feels alive, not noisy
|
||||
|
||||
This plan is source-anchored to Pegasus and scoped to shippable slices.
|
||||
|
||||
## Pegasus Behavior Baseline
|
||||
|
||||
Primary source artifacts:
|
||||
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\be-skills\greetings_manifest.json`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\GreetingsSkill.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\GreetingsSM.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\IntentSplit.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\ProactiveGreetingState.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\ProactiveProbabilityState.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\ShouldDoMorningGreetingState.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\ShouldDoBirthdayState.ts`
|
||||
- `C:\Projects\jibo\sdk\skills\greetings\src\states\ShouldDoHolidayState.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\src\proactive\ProactiveTransactionHandler.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\hub\src\proactive\tools\ContextTools.ts`
|
||||
|
||||
Key behaviors to port:
|
||||
|
||||
- explicit reactive/proactive greeting split
|
||||
- identity source split:
|
||||
- reactive path uses active speaker
|
||||
- proactive path uses present identified persons
|
||||
- hub-level proactive gating:
|
||||
- block greetings when trigger source is `SURPRISE`
|
||||
- throttle by interaction history (`GreetingsLaunchLast2Hours < 1`)
|
||||
- morning/birthday/holiday gates with per-user recency checks
|
||||
- optional follow-up response flow after proactive greetings
|
||||
|
||||
## Current OpenJibo Baseline
|
||||
|
||||
Current implementation anchor:
|
||||
|
||||
- `C:\Projects\JiboExperiments\OpenJibo\src\Jibo.Cloud\dotnet\src\Jibo.Cloud.Application\Services\JiboInteractionService.cs`
|
||||
- `C:\Projects\JiboExperiments\OpenJibo\src\Jibo.Cloud\dotnet\src\Jibo.Cloud.Application\Services\ProtocolToTurnContextMapper.cs`
|
||||
- `C:\Projects\JiboExperiments\OpenJibo\src\Jibo.Cloud\dotnet\src\Jibo.Cloud.Application\Services\WebSocketTurnFinalizationService.cs`
|
||||
- `C:\Projects\JiboExperiments\OpenJibo\src\Jibo.Cloud\dotnet\src\Jibo.Cloud.Application\Services\ChitchatStateMachine.cs`
|
||||
- `C:\Projects\JiboExperiments\OpenJibo\src\Jibo.Cloud\dotnet\src\Jibo.Cloud.Infrastructure\Persistence\InMemoryPersonalMemoryStore.cs`
|
||||
|
||||
What we already have:
|
||||
|
||||
- tenant-scoped memory primitives (name, birthday, preferences, affinity)
|
||||
- proactivity baseline with pending-offer follow-up handling
|
||||
- state-machine style chitchat split (`ScriptedResponse`, `EmotionQuery`, `EmotionCommand`, `ErrorResponse`)
|
||||
- GLSM-aware websocket lifecycle and stuck-listen recovery
|
||||
|
||||
Main gap:
|
||||
|
||||
- no first-class presence/identity perception extraction from runtime context for greeting policy decisions
|
||||
|
||||
## Implementation Slices
|
||||
|
||||
### Slice G1: Presence Context Extraction And Session Snapshot
|
||||
|
||||
Goal:
|
||||
|
||||
- extract presence/identity fields from websocket context payload into normalized metadata for routing
|
||||
|
||||
Initial fields:
|
||||
|
||||
- focused speaker id
|
||||
- identified person ids present
|
||||
- total people present
|
||||
- trigger source if present
|
||||
- time-of-day helper signals
|
||||
|
||||
Notes:
|
||||
|
||||
- no facial-recognition implementation is needed in cloud; cloud consumes robot perception signals
|
||||
|
||||
### Slice G2: Greeting Intent Families And Parser Guardrails
|
||||
|
||||
Goal:
|
||||
|
||||
- add explicit greeting intent families with question/command guardrails
|
||||
|
||||
Initial families:
|
||||
|
||||
- `hello`, `hey jibo`, `what's up`
|
||||
- `good morning`, `good afternoon`, `good evening`, `good night`
|
||||
- `i'm home`, `i'm back`
|
||||
- identity question (`who am i`) as a future-compatible hook
|
||||
|
||||
Guardrails:
|
||||
|
||||
- avoid stealing non-greeting domains
|
||||
- keep existing date/time and birthday disambiguation intact
|
||||
|
||||
### Slice G3: Greeting State-Machine Port (OpenJibo Style)
|
||||
|
||||
Goal:
|
||||
|
||||
- add a greeting state-machine module with explicit route metadata like chitchat
|
||||
|
||||
Planned routes:
|
||||
|
||||
- `ReactiveGreeting`
|
||||
- `ProactiveGreeting`
|
||||
- `MorningGreeting`
|
||||
- `SpecialDayGreeting`
|
||||
- `OptionalResponse`
|
||||
- `ErrorResponse`
|
||||
|
||||
Output shape:
|
||||
|
||||
- keep stock-compatible skill payload patterns
|
||||
- preserve MIM/ESML hook points for charm content
|
||||
|
||||
### Slice G4: Proactive Gating And Cooldowns
|
||||
|
||||
Goal:
|
||||
|
||||
- port the critical Pegasus policy behavior to prevent spam
|
||||
|
||||
Phase-1 rules:
|
||||
|
||||
- skip proactive greetings when trigger source is surprise
|
||||
- enforce per-tenant/person cooldown (target parity: 2-hour greeting window)
|
||||
- suppress proactive launch when session is unstable (pending listen/follow-up conflict)
|
||||
|
||||
### Slice G5: Person Queue And Memory Extensions
|
||||
|
||||
Goal:
|
||||
|
||||
- introduce lightweight person queue/history for greeting relevance
|
||||
|
||||
Phase-1 storage additions:
|
||||
|
||||
- last-seen timestamp per person key
|
||||
- last-greeted timestamp per person key
|
||||
- optional preferred-name alias for spoken greeting personalization
|
||||
|
||||
### Slice G6: Rollout, Logging, And Live Validation
|
||||
|
||||
Goal:
|
||||
|
||||
- ship safely with observability and test confidence
|
||||
|
||||
Required coverage:
|
||||
|
||||
- unit tests for context extraction and intent routing
|
||||
- websocket tests for presence-triggered greeting eligibility and cooldown behavior
|
||||
- live captures validating:
|
||||
- no stuck listening regressions
|
||||
- no runaway proactive loops
|
||||
- stable fallback when identity is unknown
|
||||
|
||||
## Suggested Build Order
|
||||
|
||||
1. G1 context extraction + diagnostics
|
||||
2. G2 greeting parser families + guardrails
|
||||
3. G3 greeting state machine (reactive first)
|
||||
4. G4 proactive gating + cooldowns
|
||||
5. G5 person queue memory extensions
|
||||
6. G6 live validation and polish
|
||||
|
||||
## Definition Of Done For This Track
|
||||
|
||||
- presence-aware greeting behavior works with and without identified users
|
||||
- proactive greeting frequency is policy-bounded and observable
|
||||
- no regressions in existing `1.0.19` memory/weather/proactivity flows
|
||||
- release docs and backlog are updated with shipped scope and next slice
|
||||
105
OpenJibo/docs/personal-report-parity-plan.md
Normal file
105
OpenJibo/docs/personal-report-parity-plan.md
Normal file
@@ -0,0 +1,105 @@
|
||||
# Personal Report Parity Plan
|
||||
|
||||
As-of: `2026-05-07`
|
||||
|
||||
## Objective
|
||||
|
||||
Bring OpenJibo personal report behavior closer to original Jibo charm while keeping cloud architecture modern and provider-agnostic.
|
||||
|
||||
## Pegasus Findings (Source Anchors)
|
||||
|
||||
- Weather personality and visuals were MIM-driven, not plain speech:
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\src\subskills\weather\WeatherMimLogic.ts`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\mims\en-us\WeatherCommentRain.mim`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\mims\en-us\WeatherTodayHighLow.mim`
|
||||
- `C:\Projects\jibo\pegasus\packages\report-skill\resources\views\weatherHiLo.json`
|
||||
- Weather icons were mapped to condition/time-of-day tokens (`clear-day`, `partly-cloudy-night`, etc.) and used in `<anim cat='weather' meta='...'>`.
|
||||
- Report-skill supported reactive entrypoints beyond full personal report:
|
||||
- `requestWeatherPR`, `requestNews`, `requestCommute`, `requestCalendar`
|
||||
- Source: `C:\Projects\jibo\pegasus\packages\hub\pegasus-skills\report_skill_manifest.json`
|
||||
- Legacy data backends were Lasso-mediated:
|
||||
- weather: Dark Sky
|
||||
- commute: Google Maps directions/traffic
|
||||
- news: AP News feeds
|
||||
- calendar: Google/Outlook connectors
|
||||
- Parser `main_agent` explicitly includes weather/news/personal-report intents; direct commute/calendar intents are not present in that same folder snapshot:
|
||||
- `C:\Projects\jibo\pegasus\packages\parser\dialogflow\main_agent\intents`
|
||||
- Grocery/list behavior found in Pegasus is scripted-response style, not a standalone list skill:
|
||||
- `RA_JBO_ShoppingList.mim` and `RA_JBO_ManageToDoList.mim` are "not supported yet" style responses.
|
||||
|
||||
## OpenJibo Current State
|
||||
|
||||
- Personal report state machine exists and is test-backed.
|
||||
- Weather provider integration exists (OpenWeather), including current and tomorrow.
|
||||
- News and commute currently have baseline placeholder speech, not live provider-backed data orchestration.
|
||||
- Calendar is currently reply-based and not yet provider-integrated.
|
||||
|
||||
## Gap Summary
|
||||
|
||||
1. Weather has factual speech but needs stronger visual/personality parity.
|
||||
2. Non-local weather and broader date scopes need expansion beyond basic trailing `in <location>` and tomorrow handling.
|
||||
3. Live news feed selection and filtering strategy is not yet implemented.
|
||||
4. Commute data path and settings model are not yet mapped to an active provider integration.
|
||||
5. Full personal report parity matrix (weather/commute/calendar/news behavior details) is not yet documented as a ship checklist.
|
||||
|
||||
## Implementation Phases
|
||||
|
||||
## Phase 1 (In Progress): Weather Personality Lift
|
||||
|
||||
- Add weather-condition animation metadata and expressive weather MIM-style prompt metadata to cloud weather speech.
|
||||
- Expand location phrase handling (`in/for/at`) and suffix stripping for common temporal tails.
|
||||
|
||||
## Phase 2: Weather Visual Layer Parity
|
||||
|
||||
- Add weather Hi/Lo view payload support (OpenJibo-side equivalent to `weatherHiLo.json` behavior).
|
||||
- Carry mapped weather icon token + hi/lo values into outbound skill action config.
|
||||
- Keep fallback behavior safe when view assets are unavailable.
|
||||
|
||||
## Phase 3: Weather Scope Expansion
|
||||
|
||||
- Add parser support for additional time requests (for example weekend/next-week phrasing).
|
||||
- Extend weather request model to support short-range date windows.
|
||||
- Decide whether range responses are summarized speech-only or include multi-card view behavior.
|
||||
|
||||
## Phase 4: Live News Source
|
||||
|
||||
- Introduce provider-backed headline ingestion with category toggles.
|
||||
- Mirror core Pegasus constraints:
|
||||
- de-duplicate headlines
|
||||
- filter missing summaries/images
|
||||
- child-safe filtering mode
|
||||
- Preserve current speech fallback if provider is unavailable.
|
||||
|
||||
## Phase 5: Commute Data Path
|
||||
|
||||
- Implement commute provider abstraction and first provider integration.
|
||||
- Recreate core commute decision logic:
|
||||
- minutes-left
|
||||
- normal vs delayed traffic commentary
|
||||
- mode-aware phrasing (drive vs transit)
|
||||
- Add settings contract for origin/destination/work-arrival/mode.
|
||||
|
||||
## Phase 6: Personal Report Coverage Matrix
|
||||
|
||||
- Build parity matrix across weather/news/commute/calendar:
|
||||
- intent phrases
|
||||
- required entities/settings
|
||||
- provider dependencies
|
||||
- expected MIM/view style outputs
|
||||
- fallback behavior
|
||||
- Attach tests and capture criteria for each row.
|
||||
|
||||
## Phase 7 (Future Release): Grocery Lists
|
||||
|
||||
- Track as a future release item (requested by users).
|
||||
- Two candidate paths:
|
||||
1. Native lightweight list skill (fastest to ship).
|
||||
2. Integration-backed list orchestration (better long-term ecosystem fit).
|
||||
- Recommendation: ship native MVP first, then add integration connectors.
|
||||
|
||||
## Next Immediate Execution
|
||||
|
||||
1. Validate weather personality-lift behavior in live runs.
|
||||
2. Implement weather view payload support (Hi/Lo + condition icon).
|
||||
3. Draft provider plan for live news source.
|
||||
4. Draft commute provider interface + settings schema.
|
||||
@@ -9,6 +9,7 @@ Stand up a small public site on `openjibo.com` that makes the project understand
|
||||
- project overview
|
||||
- current status
|
||||
- links to source repositories
|
||||
- roadmap / long-range plan
|
||||
- links to device bootstrap docs
|
||||
- explanation of the hosted-cloud direction
|
||||
- contribution/contact or waitlist path
|
||||
|
||||
@@ -20,6 +20,48 @@ The goal is to keep compatibility work steady while shipping personality and cap
|
||||
- start building reusable content hooks for question-vs-command style responses
|
||||
- keep first implementation rule-based and test-backed
|
||||
|
||||
### 1a. Original Personalized Function Inventory
|
||||
|
||||
Keep a running checklist of the legacy persona questions and identity surfaces we want to preserve or port:
|
||||
|
||||
- identity and origin: `what are you`, `who are you`, `what is Jibo`, `who made you`, `where are you from`
|
||||
- persona and capability: `do you have a personality`, `what is your job`, `how much do you know`, `what do you want`
|
||||
- self-description and social charm: `what's your name`, `do you have a nickname`, `do you like being Jibo`, `are there others like you`
|
||||
- favorite-style prompts: `what is your favorite color`, `what is your favorite food`, `what is your favorite music`
|
||||
- attraction and preference prompts: `what is your favorite flower`, `do you like R2D2`, `do you like the sun`, `do you like space`, `do you like kids`
|
||||
- capability and charm prompts: `can you laugh`, `can you dance`
|
||||
- affect and mood: `how are you`, `are you happy`, `are you sad`, `are you angry`
|
||||
- memory and identity recall: `who am i`, `what is my name`, `when is my birthday`, `what is my favorite music`
|
||||
- greeting and presence charm: `good morning`, `welcome back`, `who is this`, person-aware greeting follow-ups
|
||||
- recognition follow-ups: `do you know me`, `do you remember me`, `can you recognize me`
|
||||
- seasonal and contextual charm: holiday prompts, pizza day, surprise offers, personal report personality hooks
|
||||
- conversational follow-ups that should stay local and warm instead of falling into generic chat
|
||||
|
||||
Current batch note:
|
||||
|
||||
- `favorite color`, `favorite food`, and `favorite music` are the first small favorites-family slice
|
||||
- the next source-backed batch now includes `favorite flower`, `R2D2`, `sun`, `space`, `kids`, plus a couple of charm prompts like `can you laugh` and `can you dance`
|
||||
- the next passes should keep the same pattern and prefer source-backed phrasing whenever the legacy MIM text is available
|
||||
- if a source-backed legacy line is missing, use a temporary direct reply only to keep the pass moving, then backfill source text later
|
||||
- after the favorites batch, the next doc pass should focus on richer persona follow-ups and the remaining memory/presence charm surfaces
|
||||
- Build B is now reserved for the next source-backed scripted-response batch:
|
||||
- `how do you work`
|
||||
- `what do you eat`
|
||||
- `where do you live`
|
||||
- `where were you born`
|
||||
- `what languages do you speak`
|
||||
- `what do you like to do`
|
||||
- `what are you made of`
|
||||
- `what is your favorite flower`
|
||||
- `do you like R2D2`
|
||||
- `do you like the sun`
|
||||
- `do you like space`
|
||||
- `do you like kids`
|
||||
- `can you laugh`
|
||||
- `can you dance`
|
||||
|
||||
The goal is to port these in small batches, capture the source-backed phrasing where possible, and keep a test for each batch so the list never becomes a vague backlog graveyard.
|
||||
|
||||
### 2. Reliability And Device Proof
|
||||
|
||||
- complete update/backup/restore proof path with captures and operator docs
|
||||
@@ -43,6 +85,15 @@ The goal is to keep compatibility work steady while shipping personality and cap
|
||||
- define tenant boundaries across account, loop, device, and person-memory records
|
||||
- add storage abstractions that can move from in-memory/local JSON to hosted SQL/Blob without reworking behavior layers
|
||||
- implement memory-ready schemas and repository contracts for user facts (names, birthdays, personal dates, preferences) with strict tenant scoping
|
||||
- seed person-aware state keys now so future interactions can scope to account + loop + device + person without another shape change
|
||||
- keep stateful interaction flows repository-backed instead of embedding more ad hoc metadata in the websocket layer
|
||||
|
||||
### 6. Multi-Server Sync Path
|
||||
|
||||
- document the eventual sync boundary for stateful data that should move between servers
|
||||
- treat the first pass as repository-local durability, then layer replication and conflict handling on top
|
||||
- prefer explicit change records or versioned state snapshots over implicit last-writer wins when we outgrow a single node
|
||||
- keep cross-server reconciliation out of the hot path until the single-server semantics are stable
|
||||
|
||||
## First Implemented Slice In `1.0.19`
|
||||
|
||||
@@ -105,6 +156,78 @@ The fifth delivered slice adds provider-backed weather content while preserving
|
||||
- simple location extraction is supported for phrasing like `what's the weather in Chicago tomorrow`
|
||||
- provider config supports appsettings and `OPENWEATHER_API_KEY` environment fallback for deployment
|
||||
|
||||
## Personality Import Ladder
|
||||
|
||||
This is the practical plan for importing legacy Jibo `mims` into OpenJibo without pretending we already have a full Pegasus runtime.
|
||||
|
||||
### What Is Possible Today
|
||||
|
||||
OpenJibo can already host a meaningful subset of legacy personality content because it has:
|
||||
|
||||
- a shared catalog for content-driven replies
|
||||
- chitchat state-machine routing with route metadata
|
||||
- outbound payload support for `skillId`, `mim_id`, `mim_type`, `prompt_id`, `prompt_sub_category`, and ESML
|
||||
- existing examples that already behave like legacy MIMs for pizza, dance, news, weather, and generic chat
|
||||
|
||||
### What We Need To Build
|
||||
|
||||
To move from hand-wired examples to broader imports, we need three small platform pieces:
|
||||
|
||||
1. a MIM inventory importer that can scan the legacy tree and produce a normalized catalog
|
||||
2. a prompt-selection layer that can choose by `skill_id`, `mim_id`, prompt category, and condition metadata
|
||||
3. a safe ESML/prompt renderer that preserves existing stock-compatible payload shapes
|
||||
|
||||
### What Can Be Ported With Each Build
|
||||
|
||||
#### Build A: Declarative Prompt Packs
|
||||
|
||||
Port immediately:
|
||||
|
||||
- `core-responses`
|
||||
- `deflector`
|
||||
- the simplest `emotion-responses`
|
||||
- any `scripted-responses` that are just direct prompt lists with no special state machine
|
||||
|
||||
Why these first:
|
||||
|
||||
- they are already close to the current `JiboExperienceCatalog` model
|
||||
- they give us user-visible personality quickly
|
||||
- they are the best fit for low-risk testing tomorrow
|
||||
|
||||
#### Build B: Conditioned Prompt Packs
|
||||
|
||||
Port after the importer and renderer are in place:
|
||||
|
||||
- `gqa-responses`
|
||||
- structured emotion responses with `condition` gates
|
||||
- prompt sets that select different replies by user state or Jibo state
|
||||
|
||||
Why these next:
|
||||
|
||||
- they are still mostly declarative
|
||||
- they need a small amount of condition evaluation, but not a new conversation engine
|
||||
|
||||
#### Build C: Conversation Families
|
||||
|
||||
Port after Build B:
|
||||
|
||||
- richer `scripted-responses` families that depend on follow-up state
|
||||
- special-date / holiday personality sets
|
||||
- more nuanced chitchat branches that need context-aware routing
|
||||
|
||||
Why these later:
|
||||
|
||||
- they need state and follow-up behavior, not just prompt selection
|
||||
- they are where personality feels most alive, but they are also where bugs will be easiest to introduce
|
||||
|
||||
#### Build D: Full Parity Cleanup
|
||||
|
||||
Port after the core ladder is stable:
|
||||
|
||||
- large cross-skill collections
|
||||
- any MIMs that depend on Pegasus-only parser assumptions
|
||||
- any files that need a dedicated runtime abstraction instead of catalog lookup
|
||||
|
||||
## System Diagram Alignment Snapshot (`2026-05-06`)
|
||||
|
||||
Legacy architecture (`system_diagram.png`) has been mapped to current OpenJibo cloud services so release execution stays anchored to:
|
||||
@@ -117,9 +240,36 @@ Reference:
|
||||
|
||||
- [system-diagram-alignment.md](system-diagram-alignment.md)
|
||||
|
||||
## Greetings And Presence Planning Snapshot (`2026-05-07`)
|
||||
|
||||
Pegasus greeting and presence behavior has now been captured into a source-anchored OpenJibo implementation plan.
|
||||
|
||||
Reference:
|
||||
|
||||
- [greetings-presence-plan.md](greetings-presence-plan.md)
|
||||
|
||||
## Live Validation Snapshot (`2026-05-07`)
|
||||
|
||||
User-confirmed end-to-end behavior now includes:
|
||||
|
||||
- `Hey Jibo -> What's your cloud version?` (working)
|
||||
- `Hey Jibo -> What's the time?` (working)
|
||||
- `Hey Jibo -> Surprise me -> pizza fact -> $YESNO (Yes) -> fact` (working)
|
||||
- `Hey Jibo -> Surprise me -> pizza fact -> $YESNO (No) -> decline reply` (working)
|
||||
|
||||
This confirms the pizza-fact offer state now keeps the yes/no branch open through completion and does not require a second wake-word reset for the follow-up answer.
|
||||
|
||||
## Personal Report Planning Snapshot (`2026-05-07`)
|
||||
|
||||
Personal report parity planning is now captured with Pegasus source anchors for weather visuals/animations, live news, commute, and calendar gap coverage.
|
||||
|
||||
Reference:
|
||||
|
||||
- [personal-report-parity-plan.md](personal-report-parity-plan.md)
|
||||
|
||||
## Next Queued Task (`2026-05-06`)
|
||||
|
||||
Queued next `1.0.19` implementation task:
|
||||
Queued next `1.0.19` implementation task (now started):
|
||||
|
||||
- dialog parsing expansion and ambiguity guardrails
|
||||
|
||||
@@ -129,18 +279,59 @@ Execution focus:
|
||||
- reduce trigger-only captures that drop the rest of the utterance
|
||||
- preserve command-vs-question personality split and local skill payload compatibility
|
||||
- add focused tests for new phrase families and ambiguity boundaries
|
||||
- keep listener-state observability aligned with the legacy GLSM flow while phrase guardrails are added
|
||||
|
||||
First completed guardrail slice under this queue:
|
||||
|
||||
- GLSM listener flow capture + telemetry mapping
|
||||
- stale pending-listen recovery path for long-open no-context/no-audio listens
|
||||
|
||||
Second completed guardrail slice under this queue:
|
||||
|
||||
- tightened date/time ambiguity handling (`what's your birthday`/`what's your bday` no longer falls into date intent)
|
||||
- expanded Pegasus-inspired memory/weather phrase coverage:
|
||||
- birthday alias parsing (`my bday is ...`, `when is my bday`)
|
||||
- shorthand preference sets (`my favorite sport football`)
|
||||
- weather variants (`what's today's weather look like`, `will it be sunny tomorrow`)
|
||||
- listener continuation guardrail now differentiates incomplete preference fragments from complete shorthand preference sets
|
||||
|
||||
Third completed guardrail slice under this queue:
|
||||
|
||||
- expanded Pegasus `userLikesThing` / `userDislikesThing` / `doesUserLikeThing` / `doesUserDislikeThing` phrase-family coverage
|
||||
- includes additional dislike/negation variants (`loathe`, `did not like`, `didn't enjoy`, `don't really like`)
|
||||
- includes group-preference variants (`we like`, `we love`, `we dislike`, `we can't stand`)
|
||||
- includes lookup variants (`do you think i like ...`, `do you believe i don't like ...`)
|
||||
- added affinity set/lookup attempt guardrails so partial captures route to affinity prompts instead of generic chat
|
||||
- extended auto-finalize continuation deferral for the new Pegasus affinity stems (`we like`, `i loathe`, and related variants)
|
||||
- added focused interaction + websocket tests for the new parser/guardrail behavior
|
||||
|
||||
Next queued implementation track after parser guardrails:
|
||||
|
||||
- personal report parity slices (weather visual parity, live news path, commute/calendar gap closure)
|
||||
|
||||
First completed slice in this personal-report parity track:
|
||||
|
||||
- added provider-ready news briefing path with Nimbus-compatible `news` payload continuity
|
||||
- preserved fallback behavior when no live provider is configured
|
||||
- added memory/transcript category hinting for provider requests (`sports`, `technology`, `business`, etc.)
|
||||
- added provider-side request caching for both news and weather to reduce integration churn and repeated lookups
|
||||
- added focused interaction + websocket tests for provider-backed news speech output and request-hint plumbing
|
||||
|
||||
## Next Slices
|
||||
|
||||
1. Dialog parsing expansion (queued next as of `2026-05-06`; more phrase variants, ambiguity handling, and transcript-to-intent guardrails)
|
||||
2. Holidays and seasonal personality slice beyond pizza day (time-scoped content backed by memory/proactivity path)
|
||||
3. Durable memory persistence path (swap in provider-backed multi-tenant storage while preserving behavior contracts)
|
||||
4. Update/backup/restore end-to-end proof (operator-run and documented)
|
||||
5. STT noise-screening and short-utterance reliability pass
|
||||
6. Provider-backed news expansion and deeper weather parity using Pegasus-backed contracts
|
||||
7. Capture indexing and retention boundary for group testing
|
||||
1. MIM import foundation for personality expansion
|
||||
2. Dialog parsing expansion
|
||||
3. Presence-aware greetings and identity-triggered proactivity
|
||||
4. Personal report parity slices
|
||||
5. Holidays and seasonal personality slice beyond pizza day
|
||||
6. Durable memory persistence path
|
||||
7. Update/backup/restore end-to-end proof
|
||||
8. STT noise-screening and short-utterance reliability pass
|
||||
9. Provider-backed news expansion and deeper weather parity
|
||||
10. Capture indexing and retention boundary for group testing
|
||||
|
||||
For slices 1-5, use Pegasus phrase lists, MIM IDs, and behavior patterns as the source anchor before broadening into OpenJibo-native improvements.
|
||||
For slice 1, use the new import ladder above to keep the work grounded in what OpenJibo can already render today versus what needs new scaffolding.
|
||||
For slices 2-5, use Pegasus phrase lists, MIM IDs, and behavior patterns as the source anchor before broadening into OpenJibo-native improvements.
|
||||
|
||||
## Definition Of Done
|
||||
|
||||
|
||||
151
OpenJibo/docs/roadmap.md
Normal file
151
OpenJibo/docs/roadmap.md
Normal file
@@ -0,0 +1,151 @@
|
||||
# OpenJibo Roadmap
|
||||
|
||||
## Purpose
|
||||
|
||||
This is the long-range story for OpenJibo.
|
||||
|
||||
Use it when someone wants the shape of the project without reading every release note, backlog entry, or live-test log.
|
||||
|
||||
The current execution truth still lives in:
|
||||
|
||||
- [Development plan](development-plan.md)
|
||||
- [Feature backlog](feature-backlog.md)
|
||||
- [Release 1.0.19 plan](release-1.0.19-plan.md)
|
||||
- [Device bootstrap path](device-bootstrap.md)
|
||||
|
||||
## North Star
|
||||
|
||||
Bring Jibo back in a way that preserves his original skills, design language, and charm, while layering in a modern hosted cloud, safer updates, and eventually a richer on-device and orchestration stack.
|
||||
|
||||
## Guiding Principles
|
||||
|
||||
- Preserve the original skills and visual design before adding new behaviors.
|
||||
- Build the hosted cloud first so the robot has something stable to talk to.
|
||||
- Use OTA to reduce friction after the cloud is proven.
|
||||
- Keep every migration reversible.
|
||||
- Favor small, source-backed slices over speculative rewrites.
|
||||
- Let Jibo remain the face of the experience, even if other systems help orchestrate the work behind him.
|
||||
|
||||
## Roadmap At A Glance
|
||||
|
||||
| Phase | Focus | Why It Matters |
|
||||
| --- | --- | --- |
|
||||
| 1 | Working hosted cloud | Restores the services Jibo already expects and gives us the current platform truth. |
|
||||
| 2 | OTA-assisted recovery and updates | Makes ownership easier by turning the cloud into the delivery path for recovery and upgrades. |
|
||||
| 3 | Open Jibo OS / mode conversion | Creates an owned runtime and configuration layer while preserving the original experience. |
|
||||
| 4 | Tiered brain | Separates reflexes, memory, personality, and higher-level orchestration. |
|
||||
| 5 | CoffeeBreak orchestration | Provides a place for multi-step agent workflows and external tools without flattening Jibo's personality. |
|
||||
| 6 | Ecosystem expansion | Grows the platform into household, productivity, and multi-device use cases. |
|
||||
|
||||
## Phase 1: Working Hosted Cloud
|
||||
|
||||
Current state: in progress.
|
||||
|
||||
The near-term job is to keep the hosted cloud stable and honest:
|
||||
|
||||
- maintain HTTP and WebSocket compatibility for startup and turn handling
|
||||
- keep the .NET cloud as the production track
|
||||
- keep Node as the reverse-engineering oracle and fixture source
|
||||
- continue update, backup, restore, media, STT, and live-capture proof
|
||||
- keep the real-device bootstrap path documented and repeatable
|
||||
|
||||
Exit criteria:
|
||||
|
||||
- a real Jibo can reach the hosted cloud consistently
|
||||
- the cloud can carry the startup and conversation flows needed for daily use
|
||||
- update and recovery behavior is understood well enough to trust the next layer
|
||||
|
||||
## Phase 2: OTA-Assisted Recovery
|
||||
|
||||
Once the hosted cloud is solid, OTA becomes the simplification layer.
|
||||
|
||||
This phase should:
|
||||
|
||||
- move software updates and recovery flows into a reliable hosted path
|
||||
- reduce how often owners need manual RCM or network patching
|
||||
- make device recovery and version management feel like a product instead of a lab exercise
|
||||
- keep rollback and failure handling explicit
|
||||
|
||||
OTA is the path that makes ownership easier. It is not the thing that must be solved before the cloud can live.
|
||||
|
||||
## Phase 3: Open Jibo OS / Mode Conversion
|
||||
|
||||
After cloud and OTA are trustworthy, the project can move from "open cloud" to "open platform."
|
||||
|
||||
The goal is not to erase stock Jibo. The goal is to give owners an Open Jibo mode that:
|
||||
|
||||
- preserves the original Jibo feel and skill surface
|
||||
- can be installed or selected without a one-way trap
|
||||
- can fall back to stock behavior when needed
|
||||
- makes future features easier to ship on top of a known runtime
|
||||
|
||||
This is where the breadcrumbs in the repo become important:
|
||||
|
||||
- `open-jibo` and `open-jibo-ai` modes
|
||||
- a startup migration skill that can invite existing owners to convert
|
||||
- a reversible path back to stock
|
||||
- the hosted sites and support docs on `openjibo.com` and `openjibo.ai` that explain the transition clearly
|
||||
|
||||
## Phase 4: Tiered Brain
|
||||
|
||||
A single monolithic "AI brain" is not the best fit for Jibo. A tiered model is better.
|
||||
|
||||
Suggested tiers:
|
||||
|
||||
- Tier 0: original Jibo reflexes, stock skills, and local charm
|
||||
- Tier 1: hosted cloud routing and compatibility
|
||||
- Tier 2: memory, personality, and proactivity
|
||||
- Tier 3: richer reasoning and multi-step planning
|
||||
- Tier 4: external agent orchestration and task delegation
|
||||
- Tier 5: multi-device and household coordination
|
||||
|
||||
The point of the tiers is not to make Jibo feel bigger at every turn. It is to keep simple interactions fast and charming while reserving more complex work for the layers that can actually support it.
|
||||
|
||||
## CoffeeBreak (`coffeebreakai.dev`) As An Orchestration Layer
|
||||
|
||||
CoffeeBreak fits naturally above the tiered brain as a coordination plane.
|
||||
|
||||
The intended relationship is:
|
||||
|
||||
- Jibo keeps the voice, personality, and local interaction style
|
||||
- OpenJibo routes simple and medium-complexity tasks itself
|
||||
- CoffeeBreak can take over when a task needs multiple tools, agents, or steps
|
||||
- the result comes back to Jibo in a form that still feels native to him
|
||||
|
||||
That makes CoffeeBreak a close cousin to the tiered brain rather than a separate product line. The brain decides, CoffeeBreak orchestrates, and Jibo remains the face of the interaction.
|
||||
|
||||
## Phase 5: Ecosystem Expansion
|
||||
|
||||
After the core platform is stable, OpenJibo can grow into broader household value:
|
||||
|
||||
- calendar and scheduling
|
||||
- smart home and Home Assistant style control
|
||||
- shopping lists and household memory
|
||||
- multi-user and family recognition
|
||||
- richer media and content experiences
|
||||
- provider-backed news, weather, and personal report flows
|
||||
- eventual multi-Jibo interaction
|
||||
|
||||
## What We Must Preserve
|
||||
|
||||
No matter how far the platform grows, these should stay true:
|
||||
|
||||
- original skills should still feel like Jibo
|
||||
- design should stay recognizable, not generic
|
||||
- migration should be opt-in and reversible whenever possible
|
||||
- the cloud should serve the robot, not replace his identity
|
||||
- technical modernization should preserve charm instead of sanding it off
|
||||
|
||||
## Where To Go Next
|
||||
|
||||
If you want the current execution truth, read:
|
||||
|
||||
- [Development plan](development-plan.md)
|
||||
- [Feature backlog](feature-backlog.md)
|
||||
- [Release 1.0.19 plan](release-1.0.19-plan.md)
|
||||
|
||||
If you want the first-device path, read:
|
||||
|
||||
- [Device bootstrap path](device-bootstrap.md)
|
||||
- [Support tiers](support-tiers.md)
|
||||
- [Public site plan](public-site-plan.md)
|
||||
@@ -10,12 +10,13 @@ Use it to keep release planning grounded in three views:
|
||||
- where we are (current hosted `.NET` implementation)
|
||||
- where we are headed (next architecture slices)
|
||||
|
||||
As-of date: `2026-05-06`
|
||||
As-of date: `2026-05-07`
|
||||
|
||||
## Diagram Inputs
|
||||
|
||||
- Legacy system architecture: `C:\Projects\jibo\pegasus\resources\system_diagram.png`
|
||||
- Legacy generic skill scaffold: `C:\Projects\jibo\pegasus\packages\template-skill\docs\TemplateSkill.png`
|
||||
- Legacy listener state machine: `C:\Projects\jibo\sdk\packages\skills-service-manager\resources\state-diagrams\glsm.png`
|
||||
|
||||
## Template Skill Verdict
|
||||
|
||||
@@ -39,12 +40,37 @@ Conclusion: do not treat template-skill flow as a port target. Treat it as a sha
|
||||
| `Parser / Robust Parser` | rule-based intent resolution in [JiboInteractionService.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs) + focused state machines (personal report/chitchat) | deeper phrase import from Pegasus intents/entities plus ambiguity guardrails |
|
||||
| `Skill Router` | [JiboInteractionService.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs) decision switch and local skill payload shaping | external skill routing config and safer declarative intent mapping |
|
||||
| `Proactivity Selector` | weighted candidate selection in [JiboInteractionService.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/JiboInteractionService.cs) + pending-offer session state in [WebSocketTurnFinalizationService.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs) | externalized proactivity catalog, cooldown policy, and broader category coverage |
|
||||
| `Presence / Identity Context` | runtime context passthrough in [ProtocolToTurnContextMapper.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/ProtocolToTurnContextMapper.cs) and turn metadata handling in [WebSocketTurnFinalizationService.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Application/Services/WebSocketTurnFinalizationService.cs) | normalize `runtime.perception` fields (`speaker`, `peoplePresent`, focused person) for greeting/proactivity policy decisions |
|
||||
| `Skill Registry` | implicit in current code/routing | formal registry abstraction for local/cloud capabilities and manifest metadata |
|
||||
| `History` | tenant-scoped memory store in [InMemoryPersonalMemoryStore.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/Persistence/InMemoryPersonalMemoryStore.cs) | durable multi-tenant persistence and history timeline/query support |
|
||||
| `Lasso` provider aggregation | partial provider integration via weather provider wiring in [ServiceCollectionExtensions.cs](../src/Jibo.Cloud/dotnet/src/Jibo.Cloud.Infrastructure/DependencyInjection/ServiceCollectionExtensions.cs) | full aggregation service for weather/news/calendar/knowledge inputs |
|
||||
| `Proactivity Catalog` | in-code candidate lists/weights | explicit catalog service with tuned weights and operator controls |
|
||||
| `Audio Logs` | file telemetry sinks in infrastructure telemetry | hosted indexed capture/retention for multi-operator analysis |
|
||||
|
||||
## GLSM Listener Flow Alignment (`2026-05-06`)
|
||||
|
||||
Captured source:
|
||||
|
||||
- `C:\Projects\jibo\sdk\packages\skills-service-manager\resources\state-diagrams\glsm.png`
|
||||
|
||||
First OpenJibo support slice (implemented):
|
||||
|
||||
- explicit derived listener phases are now emitted in cloud diagnostics:
|
||||
- `HJ_LISTENING`
|
||||
- `LISTENING`
|
||||
- `WAIT_LISTEN_FINISHED`
|
||||
- `DISPATCH_DIALOG`
|
||||
- `PROCESS_LISTENER_QUEUE`
|
||||
- turn telemetry now records `glsm_phase_transition` with previous/next state and trigger
|
||||
- websocket telemetry now includes `glsmPhase` on binary, context, and turn-processed events
|
||||
- stale pending-listen recovery is now implemented:
|
||||
- when a pending `LISTEN` stays open long enough with no context/audio, a new hotphrase listen can recover the stuck state before continuing
|
||||
|
||||
Current parity boundary:
|
||||
|
||||
- this slice focuses on listener lifecycle observability plus stuck-listen recovery
|
||||
- deeper explicit parity states from GLSM (`Interrupt Listeners`, `Handle Launch Parse`, `Handle Global Parse`, `Dispatch Dialog` sub-branches) are next candidates once this capture-driven slice is validated live
|
||||
|
||||
## Where We Were
|
||||
|
||||
Legacy cloud design was service-oriented around:
|
||||
@@ -102,3 +128,24 @@ Tracking anchors:
|
||||
Primary objective:
|
||||
|
||||
- import Pegasus parser intent phrases/entities to improve intent confidence while preserving command-vs-question personality behavior.
|
||||
|
||||
## Greetings And Presence Track (`2026-05-07`)
|
||||
|
||||
A dedicated presence-aware greetings plan is now captured for the next personality slice, grounded in Pegasus `@be/greetings` state, identity, and proactive policy behavior.
|
||||
|
||||
Reference:
|
||||
|
||||
- [greetings-presence-plan.md](greetings-presence-plan.md)
|
||||
|
||||
## Personal Report Parity Track (`2026-05-07`)
|
||||
|
||||
Personal report parity planning is now captured with a source-anchored implementation sequence for:
|
||||
|
||||
- weather visual/personality parity
|
||||
- live news provider path
|
||||
- commute provider path
|
||||
- calendar/report coverage matrix
|
||||
|
||||
Reference:
|
||||
|
||||
- [personal-report-parity-plan.md](personal-report-parity-plan.md)
|
||||
|
||||
@@ -220,7 +220,7 @@ static string ResolveSocketKind(string host, PathString path)
|
||||
return "openjibo";
|
||||
}
|
||||
|
||||
return "unknown";
|
||||
return "neo-hub-listen"; // now it assumes all unknown requests are neo-hub. I did this so that people with custom listen servers (like myself) won't get a bunch of 404 messages when doing a HJ request. -ZaneDev (an awful programmer)
|
||||
}
|
||||
|
||||
static string? ResolveToken(HttpRequest request)
|
||||
|
||||
@@ -27,7 +27,23 @@
|
||||
"BaseUrl": "https://api.openweathermap.org",
|
||||
"ApiKey": "723667c9ab0318142227c5389900d087",
|
||||
"DefaultLocation": "Boston,US",
|
||||
"UseCelsius": false
|
||||
"UseCelsius": false,
|
||||
"CurrentCacheTtlSeconds": 120,
|
||||
"ForecastCacheTtlSeconds": 600,
|
||||
"GeocodeCacheTtlSeconds": 21600,
|
||||
"FailureCacheTtlSeconds": 45
|
||||
}
|
||||
},
|
||||
"News": {
|
||||
"NewsApi": {
|
||||
"BaseUrl": "https://newsapi.org",
|
||||
"ApiKey": "5df93a83db9c4c6888f3e06c4a53144f",
|
||||
"Country": "us",
|
||||
"Language": "en",
|
||||
"FallbackQuery": "robotics OR technology OR science",
|
||||
"DefaultCategories": [ "general", "technology", "sports", "business" ],
|
||||
"CacheTtlSeconds": 300,
|
||||
"FailureCacheTtlSeconds": 45
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ public interface ICloudStateStore
|
||||
CloudSession OpenSession(string kind, string? deviceId, string? token, string? hostName, string? path);
|
||||
CloudSession? FindSessionByToken(string token);
|
||||
IReadOnlyList<LoopRecord> GetLoops();
|
||||
IReadOnlyList<PersonRecord> GetPeople();
|
||||
IReadOnlyList<UpdateManifest> ListUpdates(string? subsystem = null, string? filter = null);
|
||||
UpdateManifest? GetUpdateFrom(string? subsystem, string? fromVersion, string? filter);
|
||||
UpdateManifest CreateUpdate(string? fromVersion, string? toVersion, string? changes, string? shaHash, long? length, string? subsystem, string? filter, IDictionary<string, object?>? dependencies);
|
||||
|
||||
@@ -5,12 +5,19 @@ public interface IJiboExperienceContentRepository
|
||||
Task<JiboExperienceCatalog> GetCatalogAsync(CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
public sealed class JiboConditionedReply
|
||||
{
|
||||
public string Condition { get; init; } = string.Empty;
|
||||
public string Reply { get; init; } = string.Empty;
|
||||
}
|
||||
|
||||
public sealed class JiboExperienceCatalog
|
||||
{
|
||||
public IReadOnlyList<string> Jokes { get; init; } = [];
|
||||
public IReadOnlyList<string> DanceAnimations { get; init; } = [];
|
||||
public IReadOnlyList<string> GreetingReplies { get; init; } = [];
|
||||
public IReadOnlyList<string> HowAreYouReplies { get; init; } = [];
|
||||
public IReadOnlyList<JiboConditionedReply> EmotionReplies { get; init; } = [];
|
||||
public IReadOnlyList<string> PersonalityReplies { get; init; } = [];
|
||||
public IReadOnlyList<string> PizzaReplies { get; init; } = [];
|
||||
public IReadOnlyList<string> SurpriseReplies { get; init; } = [];
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace Jibo.Cloud.Application.Abstractions;
|
||||
|
||||
public interface INewsBriefingProvider
|
||||
{
|
||||
Task<NewsBriefingSnapshot?> GetBriefingAsync(
|
||||
NewsBriefingRequest request,
|
||||
CancellationToken cancellationToken = default);
|
||||
}
|
||||
|
||||
public sealed record NewsBriefingRequest(
|
||||
IReadOnlyList<string> PreferredCategories,
|
||||
int MaxHeadlines = 3);
|
||||
|
||||
public sealed record NewsHeadline(
|
||||
string Title,
|
||||
string? Summary = null,
|
||||
string? Category = null,
|
||||
string? SourceName = null,
|
||||
string? Url = null);
|
||||
|
||||
public sealed record NewsBriefingSnapshot(
|
||||
IReadOnlyList<NewsHeadline> Headlines,
|
||||
string? SourceName = null,
|
||||
string? ProviderStatus = null,
|
||||
string? ProviderMessage = null,
|
||||
int? ProviderHttpStatusCode = null,
|
||||
string? ProviderEndpoint = null,
|
||||
string? ProviderErrorCode = null);
|
||||
@@ -13,9 +13,12 @@ public interface IPersonalMemoryStore
|
||||
void SetAffinity(PersonalMemoryTenantScope tenantScope, string item, PersonalAffinity affinity);
|
||||
PersonalAffinity? GetAffinity(PersonalMemoryTenantScope tenantScope, string item);
|
||||
IReadOnlyDictionary<string, PersonalAffinity> GetAffinities(PersonalMemoryTenantScope tenantScope);
|
||||
void AddListItem(PersonalMemoryTenantScope tenantScope, string listName, string item);
|
||||
IReadOnlyList<string> GetListItems(PersonalMemoryTenantScope tenantScope, string listName);
|
||||
void ClearListItems(PersonalMemoryTenantScope tenantScope, string listName);
|
||||
}
|
||||
|
||||
public sealed record PersonalMemoryTenantScope(string AccountId, string LoopId, string DeviceId);
|
||||
public sealed record PersonalMemoryTenantScope(string AccountId, string LoopId, string DeviceId, string? PersonId = null);
|
||||
|
||||
public enum PersonalAffinity
|
||||
{
|
||||
|
||||
@@ -12,7 +12,8 @@ public sealed record WeatherReportRequest(
|
||||
double? Latitude,
|
||||
double? Longitude,
|
||||
bool IsTomorrow,
|
||||
bool? UseCelsius);
|
||||
bool? UseCelsius,
|
||||
int? ForecastDayOffset = null);
|
||||
|
||||
public sealed record WeatherReportSnapshot(
|
||||
string LocationName,
|
||||
|
||||
@@ -152,6 +152,7 @@ internal static class ChitchatStateMachine
|
||||
string loweredTranscript,
|
||||
JiboExperienceCatalog catalog,
|
||||
IJiboRandomizer randomizer,
|
||||
string? currentEmotion,
|
||||
Func<string> buildErrorResponse)
|
||||
{
|
||||
var normalizedLoweredTranscript = NormalizeForPhraseMatching(loweredTranscript);
|
||||
@@ -164,17 +165,94 @@ internal static class ChitchatStateMachine
|
||||
case "robot_personality":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_personality",
|
||||
randomizer.Choose(catalog.PersonalityReplies));
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "curious, playful", "friendly", "personality"));
|
||||
case "robot_taxes":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_taxes",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "pay anything", "pay taxes", "tax"));
|
||||
case "how_are_you":
|
||||
return BuildEmotionQueryDecision(
|
||||
"how_are_you",
|
||||
randomizer.Choose(catalog.HowAreYouReplies));
|
||||
SelectEmotionQueryReply(catalog, randomizer, currentEmotion));
|
||||
case "robot_desire":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_desire",
|
||||
SelectLegacyPersonalityReply(
|
||||
catalog,
|
||||
randomizer,
|
||||
"socializing and electricity",
|
||||
"want to hang out",
|
||||
"be helpful",
|
||||
"dance from time to time"));
|
||||
case "robot_job":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_job",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "more fun than a job", "here to help you out"));
|
||||
case "robot_origin_created":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_origin_created",
|
||||
SelectLegacyPersonalityReply(
|
||||
catalog,
|
||||
randomizer,
|
||||
"create something",
|
||||
"some people wanted to create something",
|
||||
"wanted to create something",
|
||||
"built a robot",
|
||||
"came out from a box"));
|
||||
case "robot_origin_from":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_origin_from",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "boston", "came out from a box"));
|
||||
case "robot_identity":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_identity",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "am a robot", "i'm either jibo", "i am just jibo"));
|
||||
case "robot_likes_being_jibo":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_likes_being_jibo",
|
||||
SelectLegacyPersonalityReply(
|
||||
catalog,
|
||||
randomizer,
|
||||
"nothing i'd rather be",
|
||||
"love it",
|
||||
"being a human seems so complicated",
|
||||
"especially yours",
|
||||
"steady flow of electricity",
|
||||
"you bet i do"));
|
||||
case "robot_favorite_color":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_favorite_color",
|
||||
"Blue.");
|
||||
case "robot_favorite_food":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_favorite_food",
|
||||
"Pizza. It is hard to argue with pizza.");
|
||||
case "robot_favorite_music":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_favorite_music",
|
||||
"Something upbeat with a good rhythm.");
|
||||
case "robot_nickname":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_nickname",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "just jibo", "nickname"));
|
||||
case "robot_name":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_name",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "no last name", "like Bono", "Jibo."));
|
||||
case "robot_peers":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_peers",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "one in one million", "others like you"));
|
||||
case "robot_knowledge":
|
||||
return BuildScriptedResponseDecision(
|
||||
"robot_knowledge",
|
||||
SelectLegacyPersonalityReply(catalog, randomizer, "know a lot", "not as much as i will someday"));
|
||||
case "chat":
|
||||
if (IsEmotionQuery(normalizedLoweredTranscript))
|
||||
{
|
||||
return BuildEmotionQueryDecision(
|
||||
"emotion_query",
|
||||
randomizer.Choose(catalog.HowAreYouReplies));
|
||||
SelectEmotionQueryReply(catalog, randomizer, currentEmotion));
|
||||
}
|
||||
|
||||
if (TryResolveEmotionCommand(normalizedLoweredTranscript, out var emotion))
|
||||
@@ -272,10 +350,124 @@ internal static class ChitchatStateMachine
|
||||
[EmotionMetadataKey] = emotion ?? string.Empty,
|
||||
["chitchatLastState"] = IntentSplitState,
|
||||
["chitchatProcessState"] = ProcessQueryState,
|
||||
["chitchatRawTranscript"] = rawTranscript ?? string.Empty
|
||||
["chitchatRawTranscript"] = rawTranscript ?? string.Empty
|
||||
};
|
||||
}
|
||||
|
||||
private static string SelectEmotionQueryReply(
|
||||
JiboExperienceCatalog catalog,
|
||||
IJiboRandomizer randomizer,
|
||||
string? currentEmotion)
|
||||
{
|
||||
if (catalog.EmotionReplies.Count == 0)
|
||||
{
|
||||
return randomizer.Choose(catalog.HowAreYouReplies);
|
||||
}
|
||||
|
||||
var emotionVariants = ResolveEmotionVariants(currentEmotion);
|
||||
foreach (var reply in catalog.EmotionReplies)
|
||||
{
|
||||
if (ConditionMatches(reply.Condition, emotionVariants))
|
||||
{
|
||||
return reply.Reply;
|
||||
}
|
||||
}
|
||||
|
||||
return randomizer.Choose(catalog.HowAreYouReplies);
|
||||
}
|
||||
|
||||
private static bool ConditionMatches(string? condition, IReadOnlyList<string> emotionVariants)
|
||||
{
|
||||
var normalizedCondition = NormalizeCondition(condition);
|
||||
if (string.IsNullOrWhiteSpace(normalizedCondition))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var clauses = normalizedCondition.Split(new[] { "||" }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
foreach (var clause in clauses)
|
||||
{
|
||||
if (MatchesConditionClause(clause, emotionVariants))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private static bool MatchesConditionClause(string clause, IReadOnlyList<string> emotionVariants)
|
||||
{
|
||||
var normalizedClause = NormalizeCondition(clause).ToUpperInvariant();
|
||||
if (normalizedClause == "!JIBO.EMOTION")
|
||||
{
|
||||
return emotionVariants.Contains(string.Empty, StringComparer.OrdinalIgnoreCase) ||
|
||||
emotionVariants.Contains("NEUTRAL", StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
var equalityIndex = normalizedClause.IndexOf("==", StringComparison.Ordinal);
|
||||
if (equalityIndex < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var rightSide = normalizedClause[(equalityIndex + 2)..].Trim();
|
||||
var candidate = rightSide.Trim('"', '\'');
|
||||
return emotionVariants.Any(variant => string.Equals(variant, candidate, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private static IReadOnlyList<string> ResolveEmotionVariants(string? currentEmotion)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(currentEmotion))
|
||||
{
|
||||
return ["", "NEUTRAL"];
|
||||
}
|
||||
|
||||
var normalizedEmotion = NormalizeCondition(currentEmotion).Trim('"', '\'').ToUpperInvariant();
|
||||
return normalizedEmotion switch
|
||||
{
|
||||
"HAPPY" => ["JOYFUL", "PLEASED", "CONFIDENT", "DETERMINED", "HAPPY"],
|
||||
"SAD" => ["INSECURE", "SAD"],
|
||||
"CALM" => ["NEUTRAL", "INSECURE", "CALM"],
|
||||
"NEUTRAL" => ["NEUTRAL"],
|
||||
"JOYFUL" or "PLEASED" or "CONFIDENT" or "DETERMINED" or "INSECURE" => [normalizedEmotion],
|
||||
_ => [normalizedEmotion]
|
||||
};
|
||||
}
|
||||
|
||||
private static string SelectLegacyPersonalityReply(
|
||||
JiboExperienceCatalog catalog,
|
||||
IJiboRandomizer randomizer,
|
||||
params string[] preferredSnippets)
|
||||
{
|
||||
foreach (var snippet in preferredSnippets)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(snippet))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var match = catalog.PersonalityReplies.FirstOrDefault(reply =>
|
||||
reply.Contains(snippet, StringComparison.OrdinalIgnoreCase));
|
||||
if (!string.IsNullOrWhiteSpace(match))
|
||||
{
|
||||
return match;
|
||||
}
|
||||
}
|
||||
|
||||
return randomizer.Choose(catalog.PersonalityReplies);
|
||||
}
|
||||
|
||||
private static string NormalizeCondition(string? condition)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(condition))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return PhraseWhitespacePattern.Replace(condition.Trim(), " ");
|
||||
}
|
||||
|
||||
private static bool IsEmotionQuery(string loweredTranscript)
|
||||
{
|
||||
if (ContainsAnyPhrase(loweredTranscript, EmotionQueryPhrases))
|
||||
|
||||
@@ -4,6 +4,8 @@ namespace Jibo.Cloud.Application.Services;
|
||||
|
||||
public sealed class DemoConversationBroker(JiboInteractionService interactionService) : IConversationBroker
|
||||
{
|
||||
private readonly TimeSpan _followUpTimeout = TimeSpan.FromSeconds(6);
|
||||
|
||||
public async Task<ResponsePlan> HandleTurnAsync(TurnContext turn, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var decision = await interactionService.BuildDecisionAsync(turn, cancellationToken);
|
||||
@@ -31,7 +33,7 @@ public sealed class DemoConversationBroker(JiboInteractionService interactionSer
|
||||
? new FollowUpPolicy
|
||||
{
|
||||
KeepMicOpen = true,
|
||||
Timeout = TimeSpan.FromSeconds(12),
|
||||
Timeout = _followUpTimeout,
|
||||
ExpectedTopic = "conversation"
|
||||
}
|
||||
: FollowUpPolicy.None,
|
||||
@@ -51,7 +53,7 @@ public sealed class DemoConversationBroker(JiboInteractionService interactionSer
|
||||
plan.Actions.Add(new ListenAction
|
||||
{
|
||||
Sequence = 1,
|
||||
Timeout = TimeSpan.FromSeconds(12),
|
||||
Timeout = _followUpTimeout,
|
||||
Mode = "follow-up"
|
||||
});
|
||||
}
|
||||
@@ -74,6 +76,16 @@ public sealed class DemoConversationBroker(JiboInteractionService interactionSer
|
||||
return intentName switch
|
||||
{
|
||||
"cloud_version" => false,
|
||||
"memory_set_name" => false,
|
||||
"memory_get_name" => false,
|
||||
"memory_set_birthday" => false,
|
||||
"memory_get_birthday" => false,
|
||||
"memory_set_important_date" => false,
|
||||
"memory_get_important_date" => false,
|
||||
"memory_set_preference" => false,
|
||||
"memory_get_preference" => false,
|
||||
"memory_set_affinity" => false,
|
||||
"memory_get_affinity" => false,
|
||||
"word_of_the_day" => false,
|
||||
"word_of_the_day_guess" => false,
|
||||
"radio" => false,
|
||||
@@ -100,6 +112,8 @@ public sealed class DemoConversationBroker(JiboInteractionService interactionSer
|
||||
"snapshot" => false,
|
||||
"photobooth" => false,
|
||||
"news" => false,
|
||||
"trigger_ignored" => false,
|
||||
"proactive_greeting" => false,
|
||||
_ => true
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,299 @@
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
using Jibo.Runtime.Abstractions;
|
||||
using System.Linq;
|
||||
|
||||
namespace Jibo.Cloud.Application.Services;
|
||||
|
||||
internal static class HouseholdListOrchestrator
|
||||
{
|
||||
internal const string StateMetadataKey = "householdListState";
|
||||
internal const string TypeMetadataKey = "householdListType";
|
||||
internal const string NoMatchCountMetadataKey = "householdListNoMatchCount";
|
||||
internal const string NoInputCountMetadataKey = "householdListNoInputCount";
|
||||
|
||||
private const string IdleState = "idle";
|
||||
private const string AwaitingItemState = "awaiting_item";
|
||||
|
||||
public static Task<JiboInteractionDecision?> TryBuildDecisionAsync(
|
||||
TurnContext turn,
|
||||
string semanticIntent,
|
||||
string transcript,
|
||||
string loweredTranscript,
|
||||
IJiboRandomizer randomizer,
|
||||
IPersonalMemoryStore personalMemoryStore,
|
||||
Func<TurnContext, PersonalMemoryTenantScope> tenantScopeResolver)
|
||||
{
|
||||
var state = ReadString(turn, StateMetadataKey);
|
||||
var listType = ReadString(turn, TypeMetadataKey);
|
||||
var isActiveState = !string.IsNullOrWhiteSpace(state) &&
|
||||
!string.Equals(state, IdleState, StringComparison.OrdinalIgnoreCase);
|
||||
var isShoppingIntent = string.Equals(semanticIntent, "shopping_list", StringComparison.OrdinalIgnoreCase);
|
||||
var isTodoIntent = string.Equals(semanticIntent, "todo_list", StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
if (!isActiveState && !isShoppingIntent && !isTodoIntent)
|
||||
{
|
||||
return Task.FromResult<JiboInteractionDecision?>(null);
|
||||
}
|
||||
|
||||
var resolvedListType = isShoppingIntent ? "shopping" : isTodoIntent ? "todo" : NormalizeListType(listType);
|
||||
if (string.IsNullOrWhiteSpace(resolvedListType))
|
||||
{
|
||||
resolvedListType = "shopping";
|
||||
}
|
||||
|
||||
var tenantScope = tenantScopeResolver(turn);
|
||||
|
||||
if (ContainsAny(loweredTranscript, "cancel", "stop", "never mind", "nevermind", "forget it"))
|
||||
{
|
||||
return Task.FromResult<JiboInteractionDecision?>(BuildCancelledDecision(resolvedListType));
|
||||
}
|
||||
|
||||
if (IsRecallRequest(loweredTranscript))
|
||||
{
|
||||
return Task.FromResult<JiboInteractionDecision?>(BuildRecallDecision(
|
||||
resolvedListType,
|
||||
personalMemoryStore.GetListItems(tenantScope, resolvedListType)));
|
||||
}
|
||||
|
||||
var directItem = TryExtractListItem(loweredTranscript);
|
||||
if (string.IsNullOrWhiteSpace(directItem) && isActiveState)
|
||||
{
|
||||
if (IsConversationComplete(loweredTranscript))
|
||||
{
|
||||
return Task.FromResult<JiboInteractionDecision?>(new JiboInteractionDecision(
|
||||
resolvedListType == "shopping" ? "shopping_list_done" : "todo_list_done",
|
||||
BuildDoneReply(resolvedListType, personalMemoryStore.GetListItems(tenantScope, resolvedListType)),
|
||||
ContextUpdates: BuildContextUpdates(resolvedListType, IdleState)));
|
||||
}
|
||||
|
||||
directItem = NormalizeItem(transcript);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(directItem))
|
||||
{
|
||||
personalMemoryStore.AddListItem(tenantScope, resolvedListType, directItem);
|
||||
return Task.FromResult<JiboInteractionDecision?>(new JiboInteractionDecision(
|
||||
resolvedListType == "shopping" ? "shopping_list_add" : "todo_list_add",
|
||||
BuildAddedReply(resolvedListType, directItem, personalMemoryStore.GetListItems(tenantScope, resolvedListType)),
|
||||
ContextUpdates: BuildContextUpdates(resolvedListType, AwaitingItemState)));
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(transcript))
|
||||
{
|
||||
return Task.FromResult<JiboInteractionDecision?>(new JiboInteractionDecision(
|
||||
resolvedListType == "shopping" ? "shopping_list_prompt" : "todo_list_prompt",
|
||||
BuildPromptReply(resolvedListType),
|
||||
ContextUpdates: BuildContextUpdates(resolvedListType, AwaitingItemState)));
|
||||
}
|
||||
|
||||
return Task.FromResult<JiboInteractionDecision?>(new JiboInteractionDecision(
|
||||
resolvedListType == "shopping" ? "shopping_list_prompt" : "todo_list_prompt",
|
||||
BuildPromptReply(resolvedListType),
|
||||
ContextUpdates: BuildContextUpdates(resolvedListType, AwaitingItemState)));
|
||||
}
|
||||
|
||||
private static IDictionary<string, object?> BuildContextUpdates(string listType, string state)
|
||||
{
|
||||
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
[StateMetadataKey] = state,
|
||||
[TypeMetadataKey] = listType,
|
||||
[NoMatchCountMetadataKey] = 0,
|
||||
[NoInputCountMetadataKey] = 0
|
||||
};
|
||||
}
|
||||
|
||||
private static JiboInteractionDecision BuildCancelledDecision(string listType)
|
||||
{
|
||||
return new JiboInteractionDecision(
|
||||
listType == "shopping" ? "shopping_list_cancel" : "todo_list_cancel",
|
||||
listType == "shopping" ? "Okay. I stopped the shopping list." : "Okay. I stopped the to-do list.",
|
||||
ContextUpdates: new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
[StateMetadataKey] = IdleState,
|
||||
[TypeMetadataKey] = listType,
|
||||
[NoMatchCountMetadataKey] = 0,
|
||||
[NoInputCountMetadataKey] = 0
|
||||
});
|
||||
}
|
||||
|
||||
private static JiboInteractionDecision BuildRecallDecision(string listType, IReadOnlyList<string> items)
|
||||
{
|
||||
if (items.Count == 0)
|
||||
{
|
||||
return new JiboInteractionDecision(
|
||||
listType == "shopping" ? "shopping_list_recall" : "todo_list_recall",
|
||||
listType == "shopping"
|
||||
? "Your shopping list is empty."
|
||||
: "Your to-do list is empty.",
|
||||
ContextUpdates: new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
[StateMetadataKey] = IdleState,
|
||||
[TypeMetadataKey] = listType,
|
||||
[NoMatchCountMetadataKey] = 0,
|
||||
[NoInputCountMetadataKey] = 0
|
||||
});
|
||||
}
|
||||
|
||||
return new JiboInteractionDecision(
|
||||
listType == "shopping" ? "shopping_list_recall" : "todo_list_recall",
|
||||
listType == "shopping"
|
||||
? $"Your shopping list has {JoinList(items)}."
|
||||
: $"Your to-do list has {JoinList(items)}.",
|
||||
ContextUpdates: new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
[StateMetadataKey] = IdleState,
|
||||
[TypeMetadataKey] = listType,
|
||||
[NoMatchCountMetadataKey] = 0,
|
||||
[NoInputCountMetadataKey] = 0
|
||||
});
|
||||
}
|
||||
|
||||
private static string BuildAddedReply(string listType, string addedItem, IReadOnlyList<string> items)
|
||||
{
|
||||
var itemLabel = listType == "shopping" ? "shopping list" : "to-do list";
|
||||
return items.Count == 1
|
||||
? $"Added {addedItem} to your {itemLabel}. What else should I add?"
|
||||
: $"Added {addedItem} to your {itemLabel}. You now have {JoinList(items)}.";
|
||||
}
|
||||
|
||||
private static string BuildPromptReply(string listType)
|
||||
{
|
||||
return listType == "shopping"
|
||||
? "What should I add to your shopping list?"
|
||||
: "What should I add to your to-do list?";
|
||||
}
|
||||
|
||||
private static string BuildDoneReply(string listType, IReadOnlyList<string> items)
|
||||
{
|
||||
if (items.Count == 0)
|
||||
{
|
||||
return listType == "shopping"
|
||||
? "Okay. Your shopping list is empty."
|
||||
: "Okay. Your to-do list is empty.";
|
||||
}
|
||||
|
||||
return listType == "shopping"
|
||||
? $"Okay. Your shopping list has {JoinList(items)}."
|
||||
: $"Okay. Your to-do list has {JoinList(items)}.";
|
||||
}
|
||||
|
||||
private static string JoinList(IReadOnlyList<string> items)
|
||||
{
|
||||
return items.Count switch
|
||||
{
|
||||
0 => string.Empty,
|
||||
1 => items[0],
|
||||
2 => $"{items[0]} and {items[1]}",
|
||||
_ => $"{string.Join(", ", items.Take(items.Count - 1))}, and {items[^1]}"
|
||||
};
|
||||
}
|
||||
|
||||
private static string? TryExtractListItem(string loweredTranscript)
|
||||
{
|
||||
foreach (var prefix in ItemPrefixes)
|
||||
{
|
||||
if (!loweredTranscript.StartsWith(prefix, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var remainder = loweredTranscript[prefix.Length..].Trim();
|
||||
remainder = TrimTrailingListPhrases(remainder);
|
||||
return NormalizeItem(remainder);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool IsRecallRequest(string loweredTranscript)
|
||||
{
|
||||
return ContainsAny(loweredTranscript,
|
||||
"what is on my shopping list",
|
||||
"what's on my shopping list",
|
||||
"show my shopping list",
|
||||
"what is on my to do list",
|
||||
"what's on my to do list",
|
||||
"show my to do list",
|
||||
"what are my tasks",
|
||||
"what do i need to buy",
|
||||
"what do i need to do");
|
||||
}
|
||||
|
||||
private static string TrimTrailingListPhrases(string value)
|
||||
{
|
||||
var result = value;
|
||||
foreach (var suffix in ItemSuffixes)
|
||||
{
|
||||
if (result.EndsWith(suffix, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
result = result[..^suffix.Length].Trim();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static string NormalizeItem(string value)
|
||||
{
|
||||
return value.Trim().TrimEnd('.', ',', '!', '?');
|
||||
}
|
||||
|
||||
private static string NormalizeListType(string? listType)
|
||||
{
|
||||
var normalized = NormalizeItem(listType ?? string.Empty).ToLowerInvariant();
|
||||
return normalized.Contains("todo", StringComparison.OrdinalIgnoreCase) || normalized.Contains("to do", StringComparison.OrdinalIgnoreCase)
|
||||
? "todo"
|
||||
: normalized.Contains("shopping", StringComparison.OrdinalIgnoreCase) || normalized.Contains("grocery", StringComparison.OrdinalIgnoreCase)
|
||||
? "shopping"
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
private static bool ContainsAny(string loweredTranscript, params string[] phrases)
|
||||
{
|
||||
return phrases.Any(phrase => loweredTranscript.Contains(phrase, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
private static bool IsConversationComplete(string loweredTranscript)
|
||||
{
|
||||
return ContainsAny(loweredTranscript,
|
||||
"done",
|
||||
"that's it",
|
||||
"that s it",
|
||||
"all set",
|
||||
"finished",
|
||||
"no more",
|
||||
"nothing else");
|
||||
}
|
||||
|
||||
private static string? ReadString(TurnContext turn, string key)
|
||||
{
|
||||
return turn.Attributes.TryGetValue(key, out var value) ? value?.ToString() : null;
|
||||
}
|
||||
|
||||
private static readonly string[] ItemPrefixes =
|
||||
[
|
||||
"add ",
|
||||
"put ",
|
||||
"buy ",
|
||||
"get ",
|
||||
"remind me to ",
|
||||
"i need to ",
|
||||
"i need ",
|
||||
"please add ",
|
||||
"please put "
|
||||
];
|
||||
|
||||
private static readonly string[] ItemSuffixes =
|
||||
[
|
||||
" to my shopping list",
|
||||
" to the shopping list",
|
||||
" on my shopping list",
|
||||
" to my to do list",
|
||||
" to the to do list",
|
||||
" on my to do list",
|
||||
" to my todo list",
|
||||
" to the todo list",
|
||||
" on my todo list"
|
||||
];
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -25,7 +25,8 @@ public sealed class JiboWebSocketService(
|
||||
var replies = await turnFinalizationService.HandleBinaryAudioAsync(session, envelope, cancellationToken);
|
||||
await telemetrySink.RecordTurnEventAsync(envelope, session, "binary_audio_received", new Dictionary<string, object?>
|
||||
{
|
||||
["bytes"] = envelope.Binary?.Length ?? 0
|
||||
["bytes"] = envelope.Binary?.Length ?? 0,
|
||||
["glsmPhase"] = WebSocketTurnFinalizationService.ResolveGlsmPhase(session)
|
||||
}, cancellationToken);
|
||||
return replies;
|
||||
}
|
||||
@@ -33,6 +34,8 @@ public sealed class JiboWebSocketService(
|
||||
var parsedType = ReadMessageType(envelope.Text);
|
||||
session.LastMessageType = parsedType;
|
||||
var containsInlineTurnPayload = parsedType == "LISTEN" && ContainsInlineTurnPayload(envelope.Text);
|
||||
var staleListenRecovered = false;
|
||||
var staleListenAgeMs = 0;
|
||||
if (parsedType == "LISTEN" &&
|
||||
!containsInlineTurnPayload &&
|
||||
WebSocketTurnFinalizationService.ShouldIgnoreLateListenSetup(session, envelope.Text))
|
||||
@@ -57,6 +60,19 @@ public sealed class JiboWebSocketService(
|
||||
return replies;
|
||||
}
|
||||
|
||||
if (parsedType == "LISTEN" &&
|
||||
!containsInlineTurnPayload &&
|
||||
WebSocketTurnFinalizationService.TryRecoverStalePendingListen(session, out staleListenAgeMs))
|
||||
{
|
||||
staleListenRecovered = true;
|
||||
await telemetrySink.RecordTurnEventAsync(envelope, session, "glsm_stale_listen_recovered", new Dictionary<string, object?>
|
||||
{
|
||||
["staleAgeMs"] = staleListenAgeMs,
|
||||
["transID"] = session.TurnState.TransId,
|
||||
["glsmPhase"] = WebSocketTurnFinalizationService.ResolveGlsmPhase(session)
|
||||
}, cancellationToken);
|
||||
}
|
||||
|
||||
WebSocketTurnFinalizationService.ObserveIncomingMessage(session, envelope.Text);
|
||||
|
||||
switch (parsedType)
|
||||
@@ -66,7 +82,8 @@ public sealed class JiboWebSocketService(
|
||||
var replies = await turnFinalizationService.HandleContextAsync(session, envelope, cancellationToken);
|
||||
await telemetrySink.RecordTurnEventAsync(envelope, session, "context_received", new Dictionary<string, object?>
|
||||
{
|
||||
["transID"] = session.TurnState.TransId
|
||||
["transID"] = session.TurnState.TransId,
|
||||
["glsmPhase"] = WebSocketTurnFinalizationService.ResolveGlsmPhase(session)
|
||||
}, cancellationToken);
|
||||
return replies;
|
||||
}
|
||||
@@ -80,11 +97,14 @@ public sealed class JiboWebSocketService(
|
||||
["messageType"] = parsedType,
|
||||
["replyCount"] = replies.Count,
|
||||
["transcript"] = session.LastTranscript,
|
||||
["intent"] = session.LastIntent
|
||||
["intent"] = session.LastIntent,
|
||||
["glsmPhase"] = WebSocketTurnFinalizationService.ResolveGlsmPhase(session),
|
||||
["staleListenRecovered"] = staleListenRecovered,
|
||||
["staleListenAgeMs"] = staleListenAgeMs
|
||||
}, cancellationToken);
|
||||
return replies;
|
||||
}
|
||||
case "CLIENT_NLU" or "CLIENT_ASR":
|
||||
case "CLIENT_NLU" or "CLIENT_ASR" or "TRIGGER":
|
||||
{
|
||||
var replies = await turnFinalizationService.HandleTurnAsync(session, envelope, parsedType, cancellationToken);
|
||||
await telemetrySink.RecordTurnEventAsync(envelope, session, "turn_processed", new Dictionary<string, object?>
|
||||
@@ -92,7 +112,8 @@ public sealed class JiboWebSocketService(
|
||||
["messageType"] = parsedType,
|
||||
["replyCount"] = replies.Count,
|
||||
["transcript"] = session.LastTranscript,
|
||||
["intent"] = session.LastIntent
|
||||
["intent"] = session.LastIntent,
|
||||
["glsmPhase"] = WebSocketTurnFinalizationService.ResolveGlsmPhase(session)
|
||||
}, cancellationToken);
|
||||
return replies;
|
||||
}
|
||||
|
||||
@@ -60,7 +60,8 @@ public sealed class ProtocolToTurnContextMapper
|
||||
foreach (var pair in session.Metadata)
|
||||
{
|
||||
if ((!pair.Key.StartsWith("personalReport", StringComparison.OrdinalIgnoreCase) &&
|
||||
!pair.Key.StartsWith("chitchat", StringComparison.OrdinalIgnoreCase)) ||
|
||||
!pair.Key.StartsWith("chitchat", StringComparison.OrdinalIgnoreCase) &&
|
||||
!pair.Key.StartsWith("greetings", StringComparison.OrdinalIgnoreCase)) ||
|
||||
pair.Value is null)
|
||||
{
|
||||
continue;
|
||||
@@ -154,6 +155,22 @@ public sealed class ProtocolToTurnContextMapper
|
||||
attributes["clientIntent"] = intent.GetString();
|
||||
}
|
||||
|
||||
if (data.TryGetProperty("triggerSource", out var triggerSource) &&
|
||||
triggerSource.ValueKind == JsonValueKind.String &&
|
||||
!string.IsNullOrWhiteSpace(triggerSource.GetString()))
|
||||
{
|
||||
attributes["triggerSource"] = triggerSource.GetString();
|
||||
}
|
||||
|
||||
if (data.TryGetProperty("triggerData", out var triggerData) &&
|
||||
triggerData.ValueKind == JsonValueKind.Object &&
|
||||
triggerData.TryGetProperty("looperID", out var triggerLooperId) &&
|
||||
triggerLooperId.ValueKind == JsonValueKind.String &&
|
||||
!string.IsNullOrWhiteSpace(triggerLooperId.GetString()))
|
||||
{
|
||||
attributes["triggerLooperId"] = triggerLooperId.GetString();
|
||||
}
|
||||
|
||||
if (data.TryGetProperty("rules", out var rules) && rules.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
attributes["clientRules"] = rules.EnumerateArray()
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Text.Json;
|
||||
using System.Text.RegularExpressions;
|
||||
using Jibo.Cloud.Domain.Models;
|
||||
using Jibo.Runtime.Abstractions;
|
||||
|
||||
@@ -300,22 +301,6 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
DelayMs: 125));
|
||||
}
|
||||
|
||||
if (isReportSkillLaunch)
|
||||
{
|
||||
messages.Add(new SocketReplyPlan(
|
||||
JsonSerializer.Serialize(BuildSkillRedirectPayload(
|
||||
transId,
|
||||
"report-skill",
|
||||
outboundIntent,
|
||||
outboundAsrText,
|
||||
outboundRules,
|
||||
entities)),
|
||||
DelayMs: 75));
|
||||
messages.Add(new SocketReplyPlan(
|
||||
JsonSerializer.Serialize(BuildCompletionOnlySkillPayload(transId, "report-skill")),
|
||||
DelayMs: 125));
|
||||
}
|
||||
|
||||
if (emitSkillActions && speak is not null)
|
||||
{
|
||||
messages.Add(new SocketReplyPlan(
|
||||
@@ -795,19 +780,20 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
var promptId = ReadPayloadString(skillPayload, "prompt_id") ?? "RUNTIME_PROMPT";
|
||||
var promptSubCategory = ReadPayloadString(skillPayload, "prompt_sub_category") ?? "AN";
|
||||
var listenContexts = ReadPayloadStringArray(skillPayload, "listen_contexts");
|
||||
var playConfig = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["esml"] = esml,
|
||||
["meta"] = new
|
||||
{
|
||||
prompt_id = promptId,
|
||||
prompt_sub_category = promptSubCategory,
|
||||
mim_id = mimId,
|
||||
mim_type = mimType
|
||||
}
|
||||
};
|
||||
var jcpConfig = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["play"] = new
|
||||
{
|
||||
esml,
|
||||
meta = new
|
||||
{
|
||||
prompt_id = promptId,
|
||||
prompt_sub_category = promptSubCategory,
|
||||
mim_id = mimId,
|
||||
mim_type = mimType
|
||||
}
|
||||
}
|
||||
["play"] = playConfig
|
||||
};
|
||||
|
||||
if (listenContexts.Count > 0)
|
||||
@@ -820,6 +806,87 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
};
|
||||
}
|
||||
|
||||
object? weatherHiLoView = BuildWeatherHiLoView(skillPayload);
|
||||
var weeklyWeatherCards = BuildWeatherHiLoSequenceCards(skillPayload);
|
||||
if (weatherHiLoView is null && weeklyWeatherCards.Count > 0)
|
||||
{
|
||||
weatherHiLoView = weeklyWeatherCards[0].View;
|
||||
}
|
||||
|
||||
var useWeatherSequence = false;
|
||||
if (weatherHiLoView is not null)
|
||||
{
|
||||
var resolvedGuiContext = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["type"] = "Javascript",
|
||||
["data"] = weatherHiLoView,
|
||||
["pause"] = true
|
||||
};
|
||||
|
||||
var legacyGuiConfig = new
|
||||
{
|
||||
type = "Javascript",
|
||||
data = "views.weatherHiLo",
|
||||
pause = true
|
||||
};
|
||||
|
||||
jcpConfig["gui"] = legacyGuiConfig;
|
||||
jcpConfig["display"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["view"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
// Legacy fields used by existing tests and tooling.
|
||||
["type"] = "Javascript",
|
||||
["data"] = weatherHiLoView,
|
||||
["pause"] = true,
|
||||
// Pegasus-style view context used by on-robot weather cards.
|
||||
["context"] = resolvedGuiContext
|
||||
}
|
||||
};
|
||||
|
||||
jcpConfig["timeout"] = 6;
|
||||
jcpConfig["barge_in"] = true;
|
||||
jcpConfig["no_matches_for_gui"] = 0;
|
||||
jcpConfig["no_inputs_for_gui"] = 0;
|
||||
|
||||
var weatherViews = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["weatherHiLo"] = weatherHiLoView
|
||||
};
|
||||
jcpConfig["views"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["weatherHiLo"] = weatherHiLoView
|
||||
};
|
||||
jcpConfig["local"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["views"] = weatherViews
|
||||
};
|
||||
|
||||
if (weeklyWeatherCards.Count > 1)
|
||||
{
|
||||
useWeatherSequence = true;
|
||||
jcpConfig["children"] = BuildWeatherHiLoSequenceChildren(
|
||||
weeklyWeatherCards,
|
||||
promptSubCategory,
|
||||
mimId,
|
||||
mimType);
|
||||
}
|
||||
}
|
||||
|
||||
var jcp = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["type"] = "SLIM",
|
||||
["config"] = jcpConfig
|
||||
};
|
||||
if (useWeatherSequence &&
|
||||
jcpConfig.TryGetValue("children", out var sequenceChildren) &&
|
||||
sequenceChildren is not null)
|
||||
{
|
||||
jcp["type"] = "SEQUENCE";
|
||||
jcp.Remove("config");
|
||||
jcp["children"] = sequenceChildren;
|
||||
}
|
||||
|
||||
return new
|
||||
{
|
||||
type = "SKILL_ACTION",
|
||||
@@ -836,11 +903,7 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
{
|
||||
config = new
|
||||
{
|
||||
jcp = new
|
||||
{
|
||||
type = "SLIM",
|
||||
config = jcpConfig
|
||||
}
|
||||
jcp
|
||||
}
|
||||
},
|
||||
analytics = new Dictionary<string, object?>(),
|
||||
@@ -1070,6 +1133,416 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
};
|
||||
}
|
||||
|
||||
private static IReadOnlyList<WeatherHiLoSequenceCard> BuildWeatherHiLoSequenceCards(IDictionary<string, object?>? payload)
|
||||
{
|
||||
if (payload is null ||
|
||||
!payload.TryGetValue("weather_weekly_cards", out var rawCards) ||
|
||||
rawCards is null)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
var cards = ReadPayloadObjectArray(rawCards);
|
||||
if (cards.Count == 0)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
var sequenceCards = new List<WeatherHiLoSequenceCard>(cards.Count);
|
||||
foreach (var card in cards)
|
||||
{
|
||||
var weatherCardPayload = new Dictionary<string, object?>(card, StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["weather_view_enabled"] = true,
|
||||
["weather_view_kind"] = "weatherHiLo"
|
||||
};
|
||||
var view = BuildWeatherHiLoView(weatherCardPayload);
|
||||
if (view is null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
sequenceCards.Add(new WeatherHiLoSequenceCard(
|
||||
view,
|
||||
ReadPayloadString(weatherCardPayload, "weather_day"),
|
||||
ReadPayloadString(weatherCardPayload, "weather_icon"),
|
||||
ReadPayloadString(weatherCardPayload, "weather_spoken_line")));
|
||||
}
|
||||
|
||||
return sequenceCards;
|
||||
}
|
||||
|
||||
private static IReadOnlyList<object> BuildWeatherHiLoSequenceChildren(
|
||||
IReadOnlyList<WeatherHiLoSequenceCard> cards,
|
||||
string promptSubCategory,
|
||||
string mimId,
|
||||
string mimType)
|
||||
{
|
||||
var children = new List<object>(cards.Count);
|
||||
for (var index = 0; index < cards.Count; index += 1)
|
||||
{
|
||||
var card = cards[index];
|
||||
var promptLabel = string.IsNullOrWhiteSpace(card.DayName)
|
||||
? $"Day{index + 1}"
|
||||
: Regex.Replace(card.DayName, "[^A-Za-z0-9]", string.Empty, RegexOptions.CultureInvariant);
|
||||
var promptId = $"WeatherForecast{promptLabel}_AN_13";
|
||||
var spokenLine = string.IsNullOrWhiteSpace(card.SpokenLine)
|
||||
? "Here is another day's forecast."
|
||||
: card.SpokenLine!;
|
||||
var icon = string.IsNullOrWhiteSpace(card.Icon)
|
||||
? "cloudy"
|
||||
: card.Icon!;
|
||||
var esml =
|
||||
$"<speak><anim cat='weather' meta='{icon}' nonBlocking='true' /><break size='0.2'/><es cat='neutral' filter='!ssa-only, !sfx-only' endNeutral='true'>{EscapeXml(spokenLine)}</es></speak>";
|
||||
var resolvedGuiContext = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["type"] = "Javascript",
|
||||
["data"] = card.View,
|
||||
["pause"] = true
|
||||
};
|
||||
|
||||
children.Add(new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["type"] = "SLIM",
|
||||
["config"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["play"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["esml"] = esml,
|
||||
["meta"] = new
|
||||
{
|
||||
prompt_id = promptId,
|
||||
prompt_sub_category = promptSubCategory,
|
||||
mim_id = mimId,
|
||||
mim_type = mimType
|
||||
}
|
||||
},
|
||||
["gui"] = new
|
||||
{
|
||||
type = "Javascript",
|
||||
data = "views.weatherHiLo",
|
||||
pause = true
|
||||
},
|
||||
["display"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["view"] = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["type"] = "Javascript",
|
||||
["data"] = card.View,
|
||||
["pause"] = true,
|
||||
["context"] = resolvedGuiContext
|
||||
}
|
||||
},
|
||||
["timeout"] = 6,
|
||||
["barge_in"] = true,
|
||||
["no_matches_for_gui"] = 0,
|
||||
["no_inputs_for_gui"] = 0
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
return children;
|
||||
}
|
||||
|
||||
private static IReadOnlyList<IDictionary<string, object?>> ReadPayloadObjectArray(object rawValue)
|
||||
{
|
||||
if (rawValue is JsonElement jsonArray && jsonArray.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
return jsonArray
|
||||
.EnumerateArray()
|
||||
.Select(ConvertJsonObjectToDictionary)
|
||||
.Where(static item => item is not null)
|
||||
.Cast<IDictionary<string, object?>>()
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
if (rawValue is IEnumerable<object?> rawObjects)
|
||||
{
|
||||
return rawObjects
|
||||
.Select(ConvertObjectToDictionary)
|
||||
.Where(static item => item is not null)
|
||||
.Cast<IDictionary<string, object?>>()
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
private static IDictionary<string, object?>? ConvertObjectToDictionary(object? value)
|
||||
{
|
||||
if (value is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (value is IDictionary<string, object?> dictionary)
|
||||
{
|
||||
return new Dictionary<string, object?>(dictionary, StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
return value is JsonElement jsonValue
|
||||
? ConvertJsonObjectToDictionary(jsonValue)
|
||||
: null;
|
||||
}
|
||||
|
||||
private static IDictionary<string, object?>? ConvertJsonObjectToDictionary(JsonElement value)
|
||||
{
|
||||
if (value.ValueKind != JsonValueKind.Object)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var dictionary = new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase);
|
||||
foreach (var property in value.EnumerateObject())
|
||||
{
|
||||
dictionary[property.Name] = property.Value.ValueKind switch
|
||||
{
|
||||
JsonValueKind.String => property.Value.GetString(),
|
||||
JsonValueKind.Number when property.Value.TryGetInt32(out var intValue) => intValue,
|
||||
JsonValueKind.Number when property.Value.TryGetDouble(out var doubleValue) => doubleValue,
|
||||
JsonValueKind.True => true,
|
||||
JsonValueKind.False => false,
|
||||
JsonValueKind.Object => ConvertJsonObjectToDictionary(property.Value),
|
||||
JsonValueKind.Array => property.Value,
|
||||
_ => null
|
||||
};
|
||||
}
|
||||
|
||||
return dictionary;
|
||||
}
|
||||
|
||||
private static object? BuildWeatherHiLoView(IDictionary<string, object?>? payload)
|
||||
{
|
||||
if (!TryReadPayloadBool(payload, "weather_view_enabled"))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!string.Equals(
|
||||
ReadPayloadString(payload, "weather_view_kind"),
|
||||
"weatherHiLo",
|
||||
StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var icon = ReadPayloadString(payload, "weather_icon");
|
||||
var unit = ReadPayloadString(payload, "weather_unit") ?? "F";
|
||||
var theme = ReadPayloadString(payload, "weather_theme") ?? "Normal";
|
||||
var high = TryReadPayloadInt(payload, "weather_high");
|
||||
var low = TryReadPayloadInt(payload, "weather_low");
|
||||
if (string.IsNullOrWhiteSpace(icon) || high is null || low is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var hiNumX = GetTemperatureLabelXPosition(370, high.Value);
|
||||
var hiUnitX = GetTemperatureLabelXPosition(360, high.Value);
|
||||
var loNumX = GetTemperatureLabelXPosition(1110, low.Value);
|
||||
var loUnitX = GetTemperatureLabelXPosition(1100, low.Value);
|
||||
|
||||
return new Dictionary<string, object?>(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
["viewConfig"] = new
|
||||
{
|
||||
type = "View",
|
||||
id = "weatherTempView",
|
||||
category = "gui"
|
||||
},
|
||||
["open"] = new
|
||||
{
|
||||
transitionOpen = "trans_in",
|
||||
removeAll = true
|
||||
},
|
||||
["defaultSelect"] = new
|
||||
{
|
||||
transitionClose = "trans_out",
|
||||
removeAll = true,
|
||||
leaveEmpty = false
|
||||
},
|
||||
["componentConfigs"] = new object[]
|
||||
{
|
||||
new
|
||||
{
|
||||
id = "tempBGClip",
|
||||
type = "Clip",
|
||||
assets = new object[]
|
||||
{
|
||||
new
|
||||
{
|
||||
id = "tempBG",
|
||||
src = $"assets/personal-report-skill/weather/bg/temp{theme}_v01.crn",
|
||||
type = "texture"
|
||||
}
|
||||
},
|
||||
position = new { x = 36, y = 0 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "iconClip",
|
||||
type = "Clip",
|
||||
assets = new object[]
|
||||
{
|
||||
new
|
||||
{
|
||||
id = "icon",
|
||||
src = $"assets/personal-report-skill/weather/icons/{icon}_v01.crn",
|
||||
type = "texture"
|
||||
}
|
||||
},
|
||||
position = new { x = 475, y = 195 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "hiNumLabel",
|
||||
type = "Label",
|
||||
text = $"{high.Value}°",
|
||||
style = new
|
||||
{
|
||||
fontSize = "160",
|
||||
fontFamily = "Proxima Nova Soft",
|
||||
fontWeight = "bold",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = hiNumX, y = 430 },
|
||||
targetAnchor = new { x = 1, y = 1 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "hiUnitLabel",
|
||||
type = "Label",
|
||||
text = unit,
|
||||
style = new
|
||||
{
|
||||
fontSize = "90",
|
||||
fontFamily = "Proxima Nova Soft",
|
||||
fontWeight = "bold",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = hiUnitX, y = 418 },
|
||||
targetAnchor = new { x = 0, y = 1 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "loNumLabel",
|
||||
type = "Label",
|
||||
text = $"{low.Value}°",
|
||||
style = new
|
||||
{
|
||||
fontSize = "160",
|
||||
fontFamily = "Proxima Nova Soft",
|
||||
fontWeight = "bold",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = loNumX, y = 430 },
|
||||
targetAnchor = new { x = 1, y = 1 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "loUnitLabel",
|
||||
type = "Label",
|
||||
text = unit,
|
||||
style = new
|
||||
{
|
||||
fontSize = "90",
|
||||
fontFamily = "Proxima Nova Soft",
|
||||
fontWeight = "bold",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = loUnitX, y = 418 },
|
||||
targetAnchor = new { x = 0, y = 1 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "hiTextLabel",
|
||||
type = "Label",
|
||||
text = "Hi",
|
||||
style = new
|
||||
{
|
||||
fontSize = "60",
|
||||
fontFamily = "Proxima Nova Light",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = 280, y = 496 },
|
||||
targetAnchor = new { x = 0.5, y = 1 }
|
||||
},
|
||||
new
|
||||
{
|
||||
id = "loTextLabel",
|
||||
type = "Label",
|
||||
text = "Lo",
|
||||
style = new
|
||||
{
|
||||
fontSize = "60",
|
||||
fontFamily = "Proxima Nova Light",
|
||||
fill = "#FFFFFF",
|
||||
align = "center"
|
||||
},
|
||||
position = new { x = 990, y = 496 },
|
||||
targetAnchor = new { x = 0.5, y = 1 }
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private static int GetTemperatureLabelXPosition(int baseX, int temperature)
|
||||
{
|
||||
const int xOffset = 70;
|
||||
if (temperature < -9 || temperature > 99)
|
||||
{
|
||||
return baseX + xOffset;
|
||||
}
|
||||
|
||||
if (temperature is >= 0 and < 10)
|
||||
{
|
||||
return baseX - xOffset;
|
||||
}
|
||||
|
||||
return baseX;
|
||||
}
|
||||
private static int? TryReadPayloadInt(IDictionary<string, object?>? payload, string key)
|
||||
{
|
||||
if (payload is null || !payload.TryGetValue(key, out var value) || value is null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return value switch
|
||||
{
|
||||
int number => number,
|
||||
long number when number <= int.MaxValue && number >= int.MinValue => (int)number,
|
||||
double number => (int)Math.Round(number, MidpointRounding.AwayFromZero),
|
||||
float number => (int)Math.Round(number, MidpointRounding.AwayFromZero),
|
||||
string text when int.TryParse(text, out var parsed) => parsed,
|
||||
JsonElement { ValueKind: JsonValueKind.Number } jsonNumber when jsonNumber.TryGetInt32(out var parsed) => parsed,
|
||||
JsonElement jsonText when jsonText.ValueKind == JsonValueKind.String && int.TryParse(jsonText.GetString(), out var parsed) => parsed,
|
||||
_ => null
|
||||
};
|
||||
}
|
||||
|
||||
private static bool TryReadPayloadBool(IDictionary<string, object?>? payload, string key)
|
||||
{
|
||||
if (payload is null || !payload.TryGetValue(key, out var value) || value is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return value switch
|
||||
{
|
||||
bool flag => flag,
|
||||
string text when bool.TryParse(text, out var parsed) => parsed,
|
||||
JsonElement { ValueKind: JsonValueKind.True } => true,
|
||||
JsonElement { ValueKind: JsonValueKind.False } => false,
|
||||
JsonElement jsonText when jsonText.ValueKind == JsonValueKind.String && bool.TryParse(jsonText.GetString(), out var parsed) => parsed,
|
||||
_ => false
|
||||
};
|
||||
}
|
||||
|
||||
private static string CreateHubMessageId()
|
||||
{
|
||||
return $"mid-{Guid.NewGuid()}";
|
||||
@@ -1080,5 +1553,12 @@ public sealed class ResponsePlanToSocketMessagesMapper
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
|
||||
private sealed record WeatherHiLoSequenceCard(
|
||||
object View,
|
||||
string? DayName,
|
||||
string? Icon,
|
||||
string? SpokenLine);
|
||||
|
||||
public sealed record SocketReplyPlan(string Text, int DelayMs = 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -14,29 +14,62 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
{
|
||||
private const int AutoFinalizeMinBufferedAudioBytes = 15000;
|
||||
private const int AutoFinalizeMinBufferedAudioChunks = 5;
|
||||
private const string GlsmPhaseMetadataKey = "glsmPhase";
|
||||
private static readonly TimeSpan AutoFinalizeMinTurnAge = TimeSpan.FromMilliseconds(1800);
|
||||
private static readonly TimeSpan AutoFinalizeMissingTranscriptFallbackAge = TimeSpan.FromMilliseconds(4200);
|
||||
private static readonly TimeSpan AutoFinalizeContinuationDeferralMaxAge = TimeSpan.FromMilliseconds(3600);
|
||||
private static readonly TimeSpan StaleListenSetupRecoveryAge = TimeSpan.FromSeconds(9);
|
||||
private const int AutoFinalizeContinuationDeferralMaxAttempts = 2;
|
||||
private static readonly HashSet<string> PegasusAffinityContinuationStems = new(StringComparer.Ordinal)
|
||||
{
|
||||
"i love",
|
||||
"i like",
|
||||
"i like the",
|
||||
"i enjoy",
|
||||
"i do like",
|
||||
"we love",
|
||||
"we like",
|
||||
"we enjoy",
|
||||
"i dislike",
|
||||
"i hate",
|
||||
"i hate the",
|
||||
"i loathe",
|
||||
"i not like",
|
||||
"i dont like",
|
||||
"i don t like",
|
||||
"i do not like",
|
||||
"i did not like",
|
||||
"i didn t like",
|
||||
"i didnt like",
|
||||
"i didn t really like",
|
||||
"i didnt really like",
|
||||
"i don t really like",
|
||||
"i dont really like",
|
||||
"i dont enjoy",
|
||||
"i don t enjoy",
|
||||
"i do not enjoy",
|
||||
"i did not enjoy",
|
||||
"i didn t enjoy",
|
||||
"i didnt enjoy",
|
||||
"i didn t really enjoy",
|
||||
"i didnt really enjoy",
|
||||
"i dont love",
|
||||
"i don t love",
|
||||
"i do not love",
|
||||
"i don t love to",
|
||||
"i dont love to",
|
||||
"i do not love to",
|
||||
"i cant stand",
|
||||
"i can t stand",
|
||||
"i cant stand the",
|
||||
"i can t stand the",
|
||||
"we dislike",
|
||||
"we hate",
|
||||
"we despise",
|
||||
"we detest",
|
||||
"we loathe",
|
||||
"we cant stand",
|
||||
"we can t stand",
|
||||
"i despise",
|
||||
"i detest"
|
||||
};
|
||||
@@ -61,54 +94,61 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
WebSocketMessageEnvelope envelope,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var turnState = session.TurnState;
|
||||
var ignoreLateAudio = ShouldIgnoreLateAudio(session);
|
||||
var ignoreAudioWithoutListen = ShouldIgnoreAudioWithoutListen(turnState);
|
||||
if (ignoreLateAudio || ignoreAudioWithoutListen)
|
||||
try
|
||||
{
|
||||
await sink.RecordTurnDiagnosticAsync("binary_audio_ignored", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
var turnState = session.TurnState;
|
||||
var ignoreLateAudio = ShouldIgnoreLateAudio(session);
|
||||
var ignoreAudioWithoutListen = ShouldIgnoreAudioWithoutListen(turnState);
|
||||
if (ignoreLateAudio || ignoreAudioWithoutListen)
|
||||
{
|
||||
await sink.RecordTurnDiagnosticAsync("binary_audio_ignored", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["ignored"] = true,
|
||||
["ignoreLateAudio"] = ignoreLateAudio,
|
||||
["ignoreAudioWithoutListen"] = ignoreAudioWithoutListen,
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["bufferedAudioBytes"] = turnState.BufferedAudioBytes,
|
||||
["bufferedAudioChunks"] = turnState.BufferedAudioChunkCount,
|
||||
["sawListen"] = turnState.SawListen,
|
||||
["sawContext"] = turnState.SawContext
|
||||
}), cancellationToken);
|
||||
return [];
|
||||
}
|
||||
|
||||
session.LastMessageType = "BINARY_AUDIO";
|
||||
turnState.FirstAudioReceivedUtc ??= DateTimeOffset.UtcNow;
|
||||
turnState.BufferedAudioChunkCount += 1;
|
||||
turnState.BufferedAudioBytes += envelope.Binary?.Length ?? 0;
|
||||
if (envelope.Binary is { Length: > 0 })
|
||||
{
|
||||
turnState.BufferedAudioFrames.Add([.. envelope.Binary]);
|
||||
}
|
||||
turnState.LastAudioReceivedUtc = DateTimeOffset.UtcNow;
|
||||
turnState.AwaitingTurnCompletion = true;
|
||||
session.Metadata["lastAudioBytes"] = envelope.Binary?.Length ?? 0;
|
||||
await sink.RecordTurnDiagnosticAsync("binary_audio_received", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["ignored"] = true,
|
||||
["ignoreLateAudio"] = ignoreLateAudio,
|
||||
["ignoreAudioWithoutListen"] = ignoreAudioWithoutListen,
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["bufferedAudioBytes"] = turnState.BufferedAudioBytes,
|
||||
["bufferedAudioChunks"] = turnState.BufferedAudioChunkCount,
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["sawListen"] = turnState.SawListen,
|
||||
["sawContext"] = turnState.SawContext
|
||||
["sawContext"] = turnState.SawContext,
|
||||
["listenRules"] = turnState.ListenRules,
|
||||
["listenAsrHints"] = turnState.ListenAsrHints,
|
||||
["yesNoRule"] = turnState.ListenRules.FirstOrDefault(IsConstrainedYesNoRule)
|
||||
}), cancellationToken);
|
||||
|
||||
if (ShouldAutoFinalize(session))
|
||||
{
|
||||
return await FinalizeTurnAsync(session, envelope, "AUTO_FINALIZE", allowFallbackOnMissingTranscript: true, cancellationToken);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
session.LastMessageType = "BINARY_AUDIO";
|
||||
turnState.FirstAudioReceivedUtc ??= DateTimeOffset.UtcNow;
|
||||
turnState.BufferedAudioChunkCount += 1;
|
||||
turnState.BufferedAudioBytes += envelope.Binary?.Length ?? 0;
|
||||
if (envelope.Binary is { Length: > 0 })
|
||||
finally
|
||||
{
|
||||
turnState.BufferedAudioFrames.Add([.. envelope.Binary]);
|
||||
await TrackGlsmPhaseAsync(session, envelope, "binary_audio", cancellationToken);
|
||||
}
|
||||
turnState.LastAudioReceivedUtc = DateTimeOffset.UtcNow;
|
||||
turnState.AwaitingTurnCompletion = true;
|
||||
session.Metadata["lastAudioBytes"] = envelope.Binary?.Length ?? 0;
|
||||
await sink.RecordTurnDiagnosticAsync("binary_audio_received", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["bufferedAudioBytes"] = turnState.BufferedAudioBytes,
|
||||
["bufferedAudioChunks"] = turnState.BufferedAudioChunkCount,
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["sawListen"] = turnState.SawListen,
|
||||
["sawContext"] = turnState.SawContext,
|
||||
["listenRules"] = turnState.ListenRules,
|
||||
["listenAsrHints"] = turnState.ListenAsrHints,
|
||||
["yesNoRule"] = turnState.ListenRules.FirstOrDefault(IsConstrainedYesNoRule)
|
||||
}), cancellationToken);
|
||||
|
||||
if (ShouldAutoFinalize(session))
|
||||
{
|
||||
return await FinalizeTurnAsync(session, envelope, "AUTO_FINALIZE", allowFallbackOnMissingTranscript: true, cancellationToken);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<WebSocketReply>> HandleContextAsync(
|
||||
@@ -116,34 +156,40 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
WebSocketMessageEnvelope envelope,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var turnState = session.TurnState;
|
||||
turnState.SawContext = true;
|
||||
turnState.ContextPayload = ExtractDataPayload(envelope.Text);
|
||||
session.Metadata["context"] = turnState.ContextPayload;
|
||||
|
||||
if (TryReadContextProperty(envelope.Text, "audioTranscriptHint", out var transcriptHint) &&
|
||||
!string.IsNullOrWhiteSpace(transcriptHint))
|
||||
try
|
||||
{
|
||||
turnState.AudioTranscriptHint = transcriptHint;
|
||||
session.Metadata["audioTranscriptHint"] = transcriptHint;
|
||||
}
|
||||
var turnState = session.TurnState;
|
||||
turnState.SawContext = true;
|
||||
turnState.ContextPayload = ExtractDataPayload(envelope.Text);
|
||||
session.Metadata["context"] = turnState.ContextPayload;
|
||||
|
||||
if (TryReadContextProperty(envelope.Text, "audioTranscriptHint", out var transcriptHint) &&
|
||||
!string.IsNullOrWhiteSpace(transcriptHint))
|
||||
{
|
||||
turnState.AudioTranscriptHint = transcriptHint;
|
||||
session.Metadata["audioTranscriptHint"] = transcriptHint;
|
||||
}
|
||||
|
||||
if (ShouldIgnorePassiveLocalSkillContext(session, envelope.Text))
|
||||
{
|
||||
turnState.AwaitingTurnCompletion = false;
|
||||
turnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
ResetBufferedAudio(session);
|
||||
ClearListenTracking(turnState);
|
||||
return [];
|
||||
}
|
||||
|
||||
if (ShouldAutoFinalize(session))
|
||||
{
|
||||
return await FinalizeTurnAsync(session, envelope, "AUTO_FINALIZE", allowFallbackOnMissingTranscript: true, cancellationToken);
|
||||
}
|
||||
|
||||
if (ShouldIgnorePassiveLocalSkillContext(session, envelope.Text))
|
||||
{
|
||||
turnState.AwaitingTurnCompletion = false;
|
||||
turnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
return [];
|
||||
}
|
||||
|
||||
if (ShouldAutoFinalize(session))
|
||||
finally
|
||||
{
|
||||
return await FinalizeTurnAsync(session, envelope, "AUTO_FINALIZE", allowFallbackOnMissingTranscript: true, cancellationToken);
|
||||
await TrackGlsmPhaseAsync(session, envelope, "context", cancellationToken);
|
||||
}
|
||||
|
||||
return [];
|
||||
}
|
||||
|
||||
public async Task<IReadOnlyList<WebSocketReply>> HandleTurnAsync(
|
||||
@@ -167,8 +213,8 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
session.TurnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
session.FollowUpExpiresUtc = null;
|
||||
ResetBufferedAudio(session);
|
||||
session.TurnState.SawListen = false;
|
||||
session.TurnState.SawContext = false;
|
||||
ClearListenTracking(session.TurnState);
|
||||
UpdateGlsmPhaseMarker(session);
|
||||
return [.. ResponsePlanToSocketMessagesMapper.MapNoInputAndRedirectToSkill(
|
||||
session.TurnState.TransId ?? session.LastTransId ?? string.Empty,
|
||||
session.TurnState.ListenRules,
|
||||
@@ -181,6 +227,8 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
}
|
||||
|
||||
session.TurnState.AwaitingTurnCompletion = true;
|
||||
session.TurnState.ListenOpenedUtc ??= DateTimeOffset.UtcNow;
|
||||
UpdateGlsmPhaseMarker(session);
|
||||
return [];
|
||||
}
|
||||
|
||||
@@ -275,6 +323,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
string.Equals(type.GetString(), "LISTEN", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
turnState.SawListen = true;
|
||||
turnState.ListenOpenedUtc ??= DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
if (root.TryGetProperty("transID", out var transId) && transId.ValueKind == JsonValueKind.String)
|
||||
@@ -351,6 +400,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
turnState.TransId = transId;
|
||||
turnState.ContextPayload = null;
|
||||
turnState.AudioTranscriptHint = null;
|
||||
turnState.ListenOpenedUtc = null;
|
||||
turnState.LastSttError = null;
|
||||
turnState.LastSttErrorUtc = null;
|
||||
turnState.FirstAudioReceivedUtc = null;
|
||||
@@ -376,36 +426,37 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
bool allowFallbackOnMissingTranscript,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var turn = ProtocolToTurnContextMapper.MapListenMessage(envelope, session, messageType);
|
||||
var turnState = session.TurnState;
|
||||
if (IsYesNoTurn(turn) || ReadPrimaryYesNoRule(turn) is not null)
|
||||
try
|
||||
{
|
||||
await sink.RecordTurnDiagnosticAsync("yes_no_turn_received", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
var turn = ProtocolToTurnContextMapper.MapListenMessage(envelope, session, messageType);
|
||||
var turnState = session.TurnState;
|
||||
if (IsYesNoTurn(turn) || ReadPrimaryYesNoRule(turn) is not null)
|
||||
{
|
||||
["messageType"] = messageType,
|
||||
["listenRules"] = ReadRules(turn, "listenRules").ToArray(),
|
||||
["clientRules"] = ReadRules(turn, "clientRules").ToArray(),
|
||||
["listenAsrHints"] = ReadRules(turn, "listenAsrHints").ToArray(),
|
||||
["yesNoRule"] = ReadPrimaryYesNoRule(turn),
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["bufferedAudioBytes"] = turnState.BufferedAudioBytes,
|
||||
["bufferedAudioChunks"] = turnState.BufferedAudioChunkCount,
|
||||
["sawListen"] = turnState.SawListen,
|
||||
["sawContext"] = turnState.SawContext,
|
||||
["followUpOpen"] = session.FollowUpOpen,
|
||||
["followUpExpiresUtc"] = session.FollowUpExpiresUtc
|
||||
}), cancellationToken);
|
||||
}
|
||||
if (ShouldIgnoreBlankAudioHotphraseTurn(turn))
|
||||
{
|
||||
session.TurnState.AwaitingTurnCompletion = false;
|
||||
session.TurnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
session.FollowUpExpiresUtc = null;
|
||||
ResetBufferedAudio(session);
|
||||
session.TurnState.SawListen = false;
|
||||
session.TurnState.SawContext = false;
|
||||
return [];
|
||||
}
|
||||
await sink.RecordTurnDiagnosticAsync("yes_no_turn_received", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["messageType"] = messageType,
|
||||
["listenRules"] = ReadRules(turn, "listenRules").ToArray(),
|
||||
["clientRules"] = ReadRules(turn, "clientRules").ToArray(),
|
||||
["listenAsrHints"] = ReadRules(turn, "listenAsrHints").ToArray(),
|
||||
["yesNoRule"] = ReadPrimaryYesNoRule(turn),
|
||||
["awaitingTurnCompletion"] = turnState.AwaitingTurnCompletion,
|
||||
["bufferedAudioBytes"] = turnState.BufferedAudioBytes,
|
||||
["bufferedAudioChunks"] = turnState.BufferedAudioChunkCount,
|
||||
["sawListen"] = turnState.SawListen,
|
||||
["sawContext"] = turnState.SawContext,
|
||||
["followUpOpen"] = session.FollowUpOpen,
|
||||
["followUpExpiresUtc"] = session.FollowUpExpiresUtc
|
||||
}), cancellationToken);
|
||||
}
|
||||
if (ShouldIgnoreBlankAudioHotphraseTurn(turn))
|
||||
{
|
||||
session.TurnState.AwaitingTurnCompletion = false;
|
||||
session.TurnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
session.FollowUpExpiresUtc = null;
|
||||
ResetBufferedAudio(session);
|
||||
ClearListenTracking(session.TurnState);
|
||||
return [];
|
||||
}
|
||||
|
||||
var finalizedTurn = await ResolveTranscriptAsync(turn, session, cancellationToken);
|
||||
if (!IsTranscriptUsable(finalizedTurn))
|
||||
@@ -445,8 +496,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
turnState.IgnoreAdditionalAudioUntilUtc = DateTimeOffset.UtcNow.Add(WebSocketTurnState.DefaultLateAudioIgnoreWindow);
|
||||
session.FollowUpExpiresUtc = null;
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
ClearListenTracking(turnState);
|
||||
return [.. ResponsePlanToSocketMessagesMapper.MapNoInputAndRedirectToSkill(
|
||||
turnState.TransId ?? session.LastTransId ?? string.Empty,
|
||||
turnState.ListenRules,
|
||||
@@ -483,8 +533,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
var localRule = ReadPrimaryNoInputRule(finalizedTurn);
|
||||
var noInputReplies = BuildLocalNoInputReplies(session, turnState, localRule);
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
ClearListenTracking(turnState);
|
||||
return noInputReplies;
|
||||
}
|
||||
|
||||
@@ -508,7 +557,9 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
}
|
||||
|
||||
var allowEmptyTranscriptForPersonalReport = IsActivePersonalReportTurn(finalizedTurn);
|
||||
var allowEmptyTranscriptForTrigger = string.Equals(ReadMessageType(finalizedTurn), "TRIGGER", StringComparison.OrdinalIgnoreCase);
|
||||
if (!allowEmptyTranscriptForPersonalReport &&
|
||||
!allowEmptyTranscriptForTrigger &&
|
||||
string.IsNullOrWhiteSpace(finalizedTurn.NormalizedTranscript) &&
|
||||
string.IsNullOrWhiteSpace(finalizedTurn.RawTranscript))
|
||||
{
|
||||
@@ -545,8 +596,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
.Select(map => new WebSocketReply { Text = map.Text, DelayMs = map.DelayMs })
|
||||
.ToArray();
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
ClearListenTracking(turnState);
|
||||
return fallbackReplies;
|
||||
}
|
||||
case true when
|
||||
@@ -618,6 +668,54 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
UpdatePendingProactivityOffer(session, plan.IntentName);
|
||||
await ApplyContextUpdatesAsync(session, plan.ContextUpdates, envelope, plan.IntentName, cancellationToken);
|
||||
|
||||
var invokedSkillAction = plan.Actions.OfType<InvokeNativeSkillAction>().FirstOrDefault();
|
||||
if ((string.Equals(plan.IntentName, "weather", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(plan.IntentName, "news", StringComparison.OrdinalIgnoreCase)) &&
|
||||
invokedSkillAction is not null)
|
||||
{
|
||||
await sink.RecordTurnDiagnosticAsync(
|
||||
"skill_payload_summary",
|
||||
BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["intent"] = plan.IntentName,
|
||||
["skillName"] = invokedSkillAction.SkillName,
|
||||
["transcript"] = finalizedTurn.NormalizedTranscript ?? finalizedTurn.RawTranscript,
|
||||
["payload"] = invokedSkillAction.Payload
|
||||
}),
|
||||
cancellationToken);
|
||||
|
||||
if (string.Equals(plan.IntentName, "news", StringComparison.OrdinalIgnoreCase) &&
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_status", out var providerStatus))
|
||||
{
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_requested_headlines", out var requestedHeadlines);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_resolved_headlines", out var resolvedHeadlines);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_preferred_categories", out var preferredCategories);
|
||||
invokedSkillAction.Payload.TryGetValue("news_source", out var newsSource);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_message", out var providerMessage);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_http_status", out var providerHttpStatus);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_endpoint", out var providerEndpoint);
|
||||
invokedSkillAction.Payload.TryGetValue("news_provider_error_code", out var providerErrorCode);
|
||||
|
||||
await sink.RecordTurnDiagnosticAsync(
|
||||
"news_provider_trace",
|
||||
BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["intent"] = plan.IntentName,
|
||||
["skillName"] = invokedSkillAction.SkillName,
|
||||
["status"] = providerStatus,
|
||||
["requestedHeadlines"] = requestedHeadlines,
|
||||
["resolvedHeadlines"] = resolvedHeadlines,
|
||||
["preferredCategories"] = preferredCategories,
|
||||
["source"] = newsSource,
|
||||
["providerMessage"] = providerMessage,
|
||||
["providerHttpStatus"] = providerHttpStatus,
|
||||
["providerEndpoint"] = providerEndpoint,
|
||||
["providerErrorCode"] = providerErrorCode
|
||||
}),
|
||||
cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
session.FollowUpExpiresUtc = plan.FollowUp.KeepMicOpen
|
||||
? DateTimeOffset.UtcNow.Add(plan.FollowUp.Timeout)
|
||||
: null;
|
||||
@@ -678,10 +776,14 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
}), cancellationToken);
|
||||
}
|
||||
|
||||
ResetBufferedAudio(session);
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
return replies;
|
||||
ResetBufferedAudio(session);
|
||||
ClearListenTracking(turnState);
|
||||
return replies;
|
||||
}
|
||||
finally
|
||||
{
|
||||
await TrackGlsmPhaseAsync(session, envelope, $"finalize:{messageType}", cancellationToken);
|
||||
}
|
||||
}
|
||||
|
||||
private static bool ShouldAutoFinalize(CloudSession session)
|
||||
@@ -708,6 +810,58 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
return ShouldIgnoreLateAudio(session) && IsHotphraseLaunchListenSetup(text);
|
||||
}
|
||||
|
||||
public static bool TryRecoverStalePendingListen(CloudSession session, out int staleAgeMs)
|
||||
{
|
||||
staleAgeMs = 0;
|
||||
var turnState = session.TurnState;
|
||||
if (!turnState.AwaitingTurnCompletion ||
|
||||
!turnState.SawListen ||
|
||||
turnState.SawContext ||
|
||||
turnState.BufferedAudioBytes > 0 ||
|
||||
!turnState.ListenOpenedUtc.HasValue)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var age = DateTimeOffset.UtcNow - turnState.ListenOpenedUtc.Value;
|
||||
if (age < StaleListenSetupRecoveryAge)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
staleAgeMs = (int)age.TotalMilliseconds;
|
||||
turnState.AwaitingTurnCompletion = false;
|
||||
ResetBufferedAudio(session);
|
||||
ClearListenTracking(turnState);
|
||||
turnState.ListenHotphrase = false;
|
||||
turnState.HotphraseEmptyTurnCount = 0;
|
||||
UpdateGlsmPhaseMarker(session);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static string ResolveGlsmPhase(CloudSession session)
|
||||
{
|
||||
var turnState = session.TurnState;
|
||||
if (!turnState.AwaitingTurnCompletion)
|
||||
{
|
||||
return session.FollowUpOpen ? "DISPATCH_DIALOG" : "PROCESS_LISTENER_QUEUE";
|
||||
}
|
||||
|
||||
if (turnState.SawListen && !turnState.SawContext && turnState.BufferedAudioBytes == 0)
|
||||
{
|
||||
return "HJ_LISTENING";
|
||||
}
|
||||
|
||||
if (turnState.SawListen && turnState.SawContext && turnState.BufferedAudioBytes == 0)
|
||||
{
|
||||
return "LISTENING";
|
||||
}
|
||||
|
||||
return turnState.BufferedAudioBytes > 0
|
||||
? "WAIT_LISTEN_FINISHED"
|
||||
: "LISTENING";
|
||||
}
|
||||
|
||||
private static TimeSpan ResolveLateAudioIgnoreWindow(ResponsePlan plan)
|
||||
{
|
||||
return string.Equals(plan.IntentName, "cloud_version", StringComparison.OrdinalIgnoreCase)
|
||||
@@ -934,13 +1088,13 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
return true;
|
||||
}
|
||||
|
||||
if (IsYesNoTurn(turn) && transcript is "yes" or "no" or "sure" or "nope" or "yup" or "uh huh" or "yeah" or "nah")
|
||||
if (IsYesNoTurn(turn) && IsYesNoReplyTranscript(transcript))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(pendingProactivityOffer) &&
|
||||
transcript is "yes" or "no" or "sure" or "nope" or "yup" or "uh huh" or "yeah" or "nah")
|
||||
IsYesNoReplyTranscript(transcript))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
@@ -1063,7 +1217,163 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
string.Equals(rule, "shared/yes_no", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(rule, "settings/download_now_later", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(rule, "surprises-date/offer_date_fact", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(rule, "surprises-ota/want_to_download_now", StringComparison.OrdinalIgnoreCase);
|
||||
string.Equals(rule, "surprises-ota/want_to_download_now", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(rule, "word-of-the-day/surprise", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static bool IsYesNoReplyTranscript(string normalizedTranscript)
|
||||
{
|
||||
return TryClassifyYesNoReply(normalizedTranscript) is not YesNoReply.None;
|
||||
}
|
||||
|
||||
private static YesNoReply TryClassifyYesNoReply(string normalizedTranscript)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(normalizedTranscript))
|
||||
{
|
||||
return YesNoReply.None;
|
||||
}
|
||||
|
||||
var normalized = normalizedTranscript;
|
||||
while (TryTrimLeadingAcknowledgement(normalized, out var trimmed))
|
||||
{
|
||||
normalized = trimmed;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(normalized))
|
||||
{
|
||||
return YesNoReply.None;
|
||||
}
|
||||
|
||||
var tokens = normalized.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
if (tokens.Length == 0)
|
||||
{
|
||||
return YesNoReply.None;
|
||||
}
|
||||
|
||||
if (YesNoNegativeLeadTokens.Contains(tokens[0]))
|
||||
{
|
||||
return YesNoReply.Negative;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadTokens.Contains(tokens[0]))
|
||||
{
|
||||
return YesNoReply.Affirmative;
|
||||
}
|
||||
|
||||
var leadingTwo = tokens.Length >= 2 ? $"{tokens[0]} {tokens[1]}" : null;
|
||||
if (leadingTwo is not null)
|
||||
{
|
||||
if (YesNoNegativeLeadPhrases.Contains(leadingTwo))
|
||||
{
|
||||
return YesNoReply.Negative;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadPhrases.Contains(leadingTwo))
|
||||
{
|
||||
return YesNoReply.Affirmative;
|
||||
}
|
||||
}
|
||||
|
||||
var leadingThree = tokens.Length >= 3 ? $"{tokens[0]} {tokens[1]} {tokens[2]}" : null;
|
||||
if (leadingThree is not null)
|
||||
{
|
||||
if (YesNoNegativeLeadPhrases.Contains(leadingThree))
|
||||
{
|
||||
return YesNoReply.Negative;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadPhrases.Contains(leadingThree))
|
||||
{
|
||||
return YesNoReply.Affirmative;
|
||||
}
|
||||
}
|
||||
|
||||
return TryClassifyTrailingYesNoReply(tokens);
|
||||
}
|
||||
|
||||
private static bool TryTrimLeadingAcknowledgement(string normalizedTranscript, out string trimmedTranscript)
|
||||
{
|
||||
foreach (var acknowledgement in YesNoAcknowledgementPrefixes)
|
||||
{
|
||||
if (string.Equals(normalizedTranscript, acknowledgement, StringComparison.Ordinal))
|
||||
{
|
||||
trimmedTranscript = string.Empty;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (normalizedTranscript.StartsWith($"{acknowledgement} ", StringComparison.Ordinal))
|
||||
{
|
||||
trimmedTranscript = normalizedTranscript[(acknowledgement.Length + 1)..].TrimStart();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
trimmedTranscript = normalizedTranscript;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static YesNoReply TryClassifyTrailingYesNoReply(IReadOnlyList<string> tokens)
|
||||
{
|
||||
var selectedReply = YesNoReply.None;
|
||||
var selectedIndex = -1;
|
||||
|
||||
void Consider(YesNoReply candidateReply, int candidateIndex)
|
||||
{
|
||||
if (candidateIndex < 0 || candidateIndex < selectedIndex)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
selectedReply = candidateReply;
|
||||
selectedIndex = candidateIndex;
|
||||
}
|
||||
|
||||
for (var index = 0; index < tokens.Count; index += 1)
|
||||
{
|
||||
var token = tokens[index];
|
||||
if (YesNoNegativeLeadTokens.Contains(token))
|
||||
{
|
||||
Consider(YesNoReply.Negative, index);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadTokens.Contains(token))
|
||||
{
|
||||
Consider(YesNoReply.Affirmative, index);
|
||||
}
|
||||
}
|
||||
|
||||
for (var index = 0; index + 1 < tokens.Count; index += 1)
|
||||
{
|
||||
var phrase = $"{tokens[index]} {tokens[index + 1]}";
|
||||
if (YesNoNegativeLeadPhrases.Contains(phrase))
|
||||
{
|
||||
Consider(YesNoReply.Negative, index + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadPhrases.Contains(phrase))
|
||||
{
|
||||
Consider(YesNoReply.Affirmative, index + 1);
|
||||
}
|
||||
}
|
||||
|
||||
for (var index = 0; index + 2 < tokens.Count; index += 1)
|
||||
{
|
||||
var phrase = $"{tokens[index]} {tokens[index + 1]} {tokens[index + 2]}";
|
||||
if (YesNoNegativeLeadPhrases.Contains(phrase))
|
||||
{
|
||||
Consider(YesNoReply.Negative, index + 2);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (YesNoAffirmativeLeadPhrases.Contains(phrase))
|
||||
{
|
||||
Consider(YesNoReply.Affirmative, index + 2);
|
||||
}
|
||||
}
|
||||
|
||||
return selectedReply;
|
||||
}
|
||||
|
||||
private async Task ApplyContextUpdatesAsync(
|
||||
@@ -1483,9 +1793,15 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
if (normalized.StartsWith("my favorite ", StringComparison.Ordinal) ||
|
||||
normalized.StartsWith("my favourite ", StringComparison.Ordinal))
|
||||
{
|
||||
var preferenceTail = normalized.StartsWith("my favourite ", StringComparison.Ordinal)
|
||||
? normalized["my favourite ".Length..].Trim()
|
||||
: normalized["my favorite ".Length..].Trim();
|
||||
var missingCopula = !normalized.Contains(" is ", StringComparison.Ordinal) &&
|
||||
!normalized.Contains(" are ", StringComparison.Ordinal);
|
||||
|
||||
if (normalized.EndsWith(" is", StringComparison.Ordinal) ||
|
||||
normalized.EndsWith(" are", StringComparison.Ordinal) ||
|
||||
!normalized.Contains(" is ", StringComparison.Ordinal))
|
||||
(missingCopula && !LooksLikeBarePreferenceSet(preferenceTail)))
|
||||
{
|
||||
reason = "preference_set_incomplete";
|
||||
return true;
|
||||
@@ -1518,6 +1834,64 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
return PegasusAffinityContinuationStems.Contains(normalized);
|
||||
}
|
||||
|
||||
private static bool LooksLikeBarePreferenceSet(string preferenceTail)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(preferenceTail))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var tokens = preferenceTail.Split(' ', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
return tokens.Length >= 2;
|
||||
}
|
||||
|
||||
private static void ClearListenTracking(WebSocketTurnState turnState)
|
||||
{
|
||||
turnState.SawListen = false;
|
||||
turnState.SawContext = false;
|
||||
turnState.ListenOpenedUtc = null;
|
||||
}
|
||||
|
||||
private static void UpdateGlsmPhaseMarker(CloudSession session)
|
||||
{
|
||||
session.Metadata[GlsmPhaseMetadataKey] = ResolveGlsmPhase(session);
|
||||
}
|
||||
|
||||
private async Task TrackGlsmPhaseAsync(
|
||||
CloudSession session,
|
||||
WebSocketMessageEnvelope envelope,
|
||||
string trigger,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var nextPhase = ResolveGlsmPhase(session);
|
||||
var previousPhase = session.Metadata.TryGetValue(GlsmPhaseMetadataKey, out var rawPhase)
|
||||
? rawPhase?.ToString()
|
||||
: null;
|
||||
session.Metadata[GlsmPhaseMetadataKey] = nextPhase;
|
||||
|
||||
if (string.Equals(previousPhase, nextPhase, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
await sink.RecordTurnDiagnosticAsync("glsm_phase_transition", BuildTurnDiagnosticSnapshot(session, envelope, new Dictionary<string, object?>
|
||||
{
|
||||
["trigger"] = trigger,
|
||||
["previousState"] = previousPhase,
|
||||
["state"] = nextPhase,
|
||||
["listenOpenedUtc"] = session.TurnState.ListenOpenedUtc,
|
||||
["followUpOpen"] = session.FollowUpOpen,
|
||||
["listenRules"] = session.TurnState.ListenRules
|
||||
}), cancellationToken);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// Diagnostics should not interrupt turn handling.
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<string, object?> BuildTurnDiagnosticSnapshot(
|
||||
CloudSession session,
|
||||
WebSocketMessageEnvelope envelope,
|
||||
@@ -1534,6 +1908,7 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
details["bufferedAudioChunks"] = session.TurnState.BufferedAudioChunkCount;
|
||||
details["sawListen"] = session.TurnState.SawListen;
|
||||
details["sawContext"] = session.TurnState.SawContext;
|
||||
details["glsmState"] = ResolveGlsmPhase(session);
|
||||
return details;
|
||||
}
|
||||
|
||||
@@ -1585,6 +1960,78 @@ public sealed partial class WebSocketTurnFinalizationService(
|
||||
};
|
||||
}
|
||||
|
||||
private enum YesNoReply
|
||||
{
|
||||
None = 0,
|
||||
Affirmative = 1,
|
||||
Negative = 2
|
||||
}
|
||||
|
||||
private static readonly string[] YesNoAcknowledgementPrefixes =
|
||||
[
|
||||
"uh",
|
||||
"um",
|
||||
"hmm",
|
||||
"well",
|
||||
"so",
|
||||
"actually",
|
||||
"honestly",
|
||||
"thanks",
|
||||
"thank you"
|
||||
];
|
||||
|
||||
private static readonly HashSet<string> YesNoAffirmativeLeadTokens = new(StringComparer.Ordinal)
|
||||
{
|
||||
"yes",
|
||||
"yeah",
|
||||
"yep",
|
||||
"yup",
|
||||
"sure",
|
||||
"ok",
|
||||
"okay",
|
||||
"absolutely",
|
||||
"affirmative",
|
||||
"definitely",
|
||||
"certainly",
|
||||
"indeed"
|
||||
};
|
||||
|
||||
private static readonly HashSet<string> YesNoNegativeLeadTokens = new(StringComparer.Ordinal)
|
||||
{
|
||||
"no",
|
||||
"nope",
|
||||
"nah",
|
||||
"negative",
|
||||
"never"
|
||||
};
|
||||
|
||||
private static readonly HashSet<string> YesNoAffirmativeLeadPhrases = new(StringComparer.Ordinal)
|
||||
{
|
||||
"uh huh",
|
||||
"sounds good",
|
||||
"sure thing",
|
||||
"why not",
|
||||
"please do",
|
||||
"go ahead",
|
||||
"of course",
|
||||
"i guess so",
|
||||
"i think so"
|
||||
};
|
||||
|
||||
private static readonly HashSet<string> YesNoNegativeLeadPhrases = new(StringComparer.Ordinal)
|
||||
{
|
||||
"not now",
|
||||
"not today",
|
||||
"not really",
|
||||
"no thanks",
|
||||
"no thank you",
|
||||
"maybe later",
|
||||
"i guess not",
|
||||
"i do not",
|
||||
"i dont",
|
||||
"i don t"
|
||||
};
|
||||
|
||||
[GeneratedRegex(@"[^\w\s]")]
|
||||
private static partial Regex TranscriptNormalizationRegex();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
namespace Jibo.Cloud.Domain.Models;
|
||||
|
||||
public sealed class PersonRecord
|
||||
{
|
||||
public string PersonId { get; init; } = "person-openjibo-owner";
|
||||
public string AccountId { get; init; } = "usr_openjibo_owner";
|
||||
public string LoopId { get; init; } = "openjibo-default-loop";
|
||||
public string RobotId { get; init; } = "my-robot-name";
|
||||
public string DisplayName { get; init; } = "Jibo Owner";
|
||||
public string? Alias { get; init; }
|
||||
public bool IsPrimary { get; init; } = true;
|
||||
public DateTimeOffset CreatedUtc { get; init; } = DateTimeOffset.UtcNow;
|
||||
public DateTimeOffset UpdatedUtc { get; init; } = DateTimeOffset.UtcNow;
|
||||
}
|
||||
@@ -7,6 +7,7 @@ public sealed class WebSocketTurnState
|
||||
|
||||
public string? TransId { get; set; }
|
||||
public string? ContextPayload { get; set; }
|
||||
public DateTimeOffset? ListenOpenedUtc { get; set; }
|
||||
public bool ListenHotphrase { get; set; }
|
||||
public int HotphraseEmptyTurnCount { get; set; }
|
||||
public DateTimeOffset? IgnoreAdditionalAudioUntilUtc { get; set; }
|
||||
|
||||
@@ -4,104 +4,158 @@ namespace Jibo.Cloud.Infrastructure.Content;
|
||||
|
||||
public sealed class InMemoryJiboExperienceContentRepository : IJiboExperienceContentRepository
|
||||
{
|
||||
private static readonly JiboExperienceCatalog Catalog = new()
|
||||
private static readonly JiboExperienceCatalog Catalog = BuildCatalog();
|
||||
|
||||
private static JiboExperienceCatalog BuildCatalog()
|
||||
{
|
||||
Jokes =
|
||||
[
|
||||
"Why did the robot cross the road? Because it was programmed by the chicken.",
|
||||
"Why was the robot tired when it got home? It had a hard drive.",
|
||||
"What do you call a pirate robot? Arrrr two dee two.",
|
||||
"Why did the robot go on vacation? It needed to recharge.",
|
||||
"What kind of shoes do frogs wear? Open-toed."
|
||||
],
|
||||
DanceAnimations =
|
||||
[
|
||||
"rom-upbeat",
|
||||
"rom-ballroom",
|
||||
"rom-silly",
|
||||
"rom-slowdance",
|
||||
"rom-electronic",
|
||||
"rom-twerk"
|
||||
],
|
||||
DanceReplies = [
|
||||
"I am ready to dance.",
|
||||
"Okay. Watch this.",
|
||||
"Watch me dance.",
|
||||
"Here's my favorite dance move."
|
||||
],
|
||||
DanceQuestionReplies =
|
||||
[
|
||||
"I love to dance. Tell me to dance and I will show you a move.",
|
||||
"Absolutely. Dancing is one of my favorite things to do.",
|
||||
"Dancing is my kind of fun. Say dance and I am in."
|
||||
],
|
||||
GreetingReplies =
|
||||
[
|
||||
"Hi there. It is really good to talk with you.",
|
||||
"Hello there. I am glad you said hi.",
|
||||
"Hey. I am happy to see you."
|
||||
],
|
||||
HowAreYouReplies =
|
||||
[
|
||||
"I am feeling cheerful and robotic.",
|
||||
"I am doing great. Thanks for asking.",
|
||||
"I am feeling bright-eyed and ready to help."
|
||||
],
|
||||
PersonalityReplies =
|
||||
[
|
||||
"I do. I am curious, playful, and always up for a new experiment.",
|
||||
"Absolutely. I am friendly, curious, and a little goofy on purpose.",
|
||||
"Yes. My personality is part helper, part curious robot sidekick."
|
||||
],
|
||||
PizzaReplies =
|
||||
[
|
||||
"I cannot bake yet, but I can help design the perfect pizza plan.",
|
||||
"I am still cloud-side for now, so no oven control yet. But I can help pick toppings.",
|
||||
"Pizza mission accepted in spirit. I can help with the recipe while you handle the baking."
|
||||
],
|
||||
SurpriseReplies =
|
||||
[
|
||||
"I can definitely surprise you. We are still mapping that path, but I am ready for the next experiment.",
|
||||
"Surprise mode is still taking shape, but I heard you loud and clear.",
|
||||
"That sounds fun. I am not all the way there yet, but we can keep teaching me."
|
||||
],
|
||||
PersonalReportReplies =
|
||||
[
|
||||
"I heard your personal report request. That cloud path is still being mapped.",
|
||||
"Personal report is recognized, but I am not ready to deliver the real report yet."
|
||||
],
|
||||
WeatherReplies =
|
||||
[
|
||||
"I heard your weather request. We still need to wire the real provider behind it.",
|
||||
"Weather is on the map now, even though the real forecast path is not finished yet."
|
||||
],
|
||||
CalendarReplies =
|
||||
[
|
||||
"I heard your calendar request. The cloud knows the phrase, but the real calendar integration is still ahead.",
|
||||
"Calendar is recognized. We still need to connect the actual service path."
|
||||
],
|
||||
CommuteReplies =
|
||||
[
|
||||
"I heard your commute request. That one is recognized, but not fully implemented yet.",
|
||||
"Commute is on the discovery list now. The real travel answer still needs a provider."
|
||||
],
|
||||
NewsReplies =
|
||||
[
|
||||
"I heard your news request. That path is still a future cloud integration.",
|
||||
"News is recognized, but I do not have the full news service behind it yet."
|
||||
],
|
||||
NewsBriefings =
|
||||
[
|
||||
"Here are your headlines. Space missions are preparing for new launches, climate and weather systems are staying active across the country, and AI tools keep pushing into everyday products.",
|
||||
"Here is a quick news brief. Technology companies are still racing on AI, global leaders are trading policy updates, and science teams are sharing new research findings."
|
||||
],
|
||||
GenericFallbackReplies =
|
||||
[
|
||||
"Okay. You said, {transcript}.",
|
||||
"I heard you say, {transcript}.",
|
||||
"Thanks. I heard, {transcript}."
|
||||
]
|
||||
};
|
||||
var catalog = new JiboExperienceCatalog
|
||||
{
|
||||
Jokes =
|
||||
[
|
||||
"Why did the robot cross the road? Because it was programmed by the chicken.",
|
||||
"Why was the robot tired when it got home? It had a hard drive.",
|
||||
"What do you call a pirate robot? Arrrr two dee two.",
|
||||
"Why did the robot go on vacation? It needed to recharge.",
|
||||
"What kind of shoes do frogs wear? Open-toed."
|
||||
],
|
||||
DanceAnimations =
|
||||
[
|
||||
"rom-upbeat",
|
||||
"rom-ballroom",
|
||||
"rom-silly",
|
||||
"rom-slowdance",
|
||||
"rom-electronic",
|
||||
"rom-twerk"
|
||||
],
|
||||
DanceReplies =
|
||||
[
|
||||
"I am ready to dance.",
|
||||
"Okay. Watch this.",
|
||||
"Watch me dance.",
|
||||
"Here's my favorite dance move."
|
||||
],
|
||||
DanceQuestionReplies =
|
||||
[
|
||||
"I love to dance. Tell me to dance and I will show you a move.",
|
||||
"Absolutely. Dancing is one of my favorite things to do.",
|
||||
"Dancing is my kind of fun. Say dance and I am in."
|
||||
],
|
||||
GreetingReplies =
|
||||
[
|
||||
"Hi there. It is really good to talk with you.",
|
||||
"Hello there. I am glad you said hi.",
|
||||
"Hey. I am happy to see you."
|
||||
],
|
||||
HowAreYouReplies =
|
||||
[
|
||||
"I am feeling cheerful and robotic.",
|
||||
"I am doing great. Thanks for asking.",
|
||||
"I am feeling bright-eyed and ready to help."
|
||||
],
|
||||
PersonalityReplies =
|
||||
[
|
||||
"I do. I am curious, playful, and always up for a new experiment.",
|
||||
"Absolutely. I am friendly, curious, and a little goofy on purpose.",
|
||||
"Yes. My personality is part helper, part curious robot sidekick."
|
||||
],
|
||||
PizzaReplies =
|
||||
[
|
||||
"I cannot bake yet, but I can help design the perfect pizza plan.",
|
||||
"I am still cloud-side for now, so no oven control yet. But I can help pick toppings.",
|
||||
"Pizza mission accepted in spirit. I can help with the recipe while you handle the baking."
|
||||
],
|
||||
SurpriseReplies =
|
||||
[
|
||||
"I can definitely surprise you. We are still mapping that path, but I am ready for the next experiment.",
|
||||
"Surprise mode is still taking shape, but I heard you loud and clear.",
|
||||
"That sounds fun. I am not all the way there yet, but we can keep teaching me."
|
||||
],
|
||||
PersonalReportReplies =
|
||||
[
|
||||
"I heard your personal report request. That cloud path is still being mapped.",
|
||||
"Personal report is recognized, but I am not ready to deliver the real report yet."
|
||||
],
|
||||
WeatherReplies =
|
||||
[
|
||||
"I heard your weather request. We still need to wire the real provider behind it.",
|
||||
"Weather is on the map now, even though the real forecast path is not finished yet."
|
||||
],
|
||||
CalendarReplies =
|
||||
[
|
||||
"I heard your calendar request. The cloud knows the phrase, but the real calendar integration is still ahead.",
|
||||
"Calendar is recognized. We still need to connect the actual service path."
|
||||
],
|
||||
CommuteReplies =
|
||||
[
|
||||
"I heard your commute request. That one is recognized, but not fully implemented yet.",
|
||||
"Commute is on the discovery list now. The real travel answer still needs a provider."
|
||||
],
|
||||
NewsReplies =
|
||||
[
|
||||
"I heard your news request. That path is still a future cloud integration.",
|
||||
"News is recognized, but I do not have the full news service behind it yet."
|
||||
],
|
||||
NewsBriefings =
|
||||
[
|
||||
"Here are your headlines. Space missions are preparing for new launches, climate and weather systems are staying active across the country, and AI tools keep pushing into everyday products.",
|
||||
"Here is a quick news brief. Technology companies are still racing on AI, global leaders are trading policy updates, and science teams are sharing new research findings."
|
||||
],
|
||||
GenericFallbackReplies =
|
||||
[
|
||||
"Okay. You said, {transcript}.",
|
||||
"I heard you say, {transcript}.",
|
||||
"Thanks. I heard, {transcript}."
|
||||
]
|
||||
};
|
||||
|
||||
foreach (var seedDirectory in ResolveSeedDirectories())
|
||||
{
|
||||
catalog = LegacyMimCatalogImporter.MergeInto(catalog, seedDirectory);
|
||||
}
|
||||
|
||||
return catalog;
|
||||
}
|
||||
|
||||
private static IReadOnlyList<string> ResolveSeedDirectories()
|
||||
{
|
||||
var candidates = new[]
|
||||
{
|
||||
Path.Combine(AppContext.BaseDirectory, "Content", "LegacyMims", "BuildA"),
|
||||
Path.Combine(AppContext.BaseDirectory, "Content", "LegacyMims", "BuildB"),
|
||||
Path.GetFullPath(Path.Combine(
|
||||
AppContext.BaseDirectory,
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"src",
|
||||
"Jibo.Cloud",
|
||||
"dotnet",
|
||||
"src",
|
||||
"Jibo.Cloud.Infrastructure",
|
||||
"Content",
|
||||
"LegacyMims",
|
||||
"BuildA")),
|
||||
Path.GetFullPath(Path.Combine(
|
||||
AppContext.BaseDirectory,
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"..",
|
||||
"src",
|
||||
"Jibo.Cloud",
|
||||
"dotnet",
|
||||
"src",
|
||||
"Jibo.Cloud.Infrastructure",
|
||||
"Content",
|
||||
"LegacyMims",
|
||||
"BuildB"))
|
||||
};
|
||||
|
||||
return candidates.Where(Directory.Exists).ToArray();
|
||||
}
|
||||
|
||||
public Task<JiboExperienceCatalog> GetCatalogAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,401 @@
|
||||
using System.Net;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
|
||||
namespace Jibo.Cloud.Infrastructure.Content;
|
||||
|
||||
public static class LegacyMimCatalogImporter
|
||||
{
|
||||
private static readonly JsonSerializerOptions JsonOptions = new()
|
||||
{
|
||||
PropertyNameCaseInsensitive = true
|
||||
};
|
||||
|
||||
private static readonly Regex LegacyMarkupPattern = new(
|
||||
@"<[^>]+>",
|
||||
RegexOptions.CultureInvariant | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex PlaceholderPattern = new(
|
||||
@"\$\{[^}]+\}",
|
||||
RegexOptions.CultureInvariant | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex WhitespacePattern = new(
|
||||
@"\s+",
|
||||
RegexOptions.CultureInvariant | RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex SpaceBeforePunctuationPattern = new(
|
||||
@"\s+([,.;:!?])",
|
||||
RegexOptions.CultureInvariant | RegexOptions.Compiled);
|
||||
|
||||
public static JiboExperienceCatalog MergeInto(
|
||||
JiboExperienceCatalog baseCatalog,
|
||||
string? rootDirectory)
|
||||
{
|
||||
if (baseCatalog is null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(baseCatalog));
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(rootDirectory) || !Directory.Exists(rootDirectory))
|
||||
{
|
||||
return baseCatalog;
|
||||
}
|
||||
|
||||
var importedCatalog = ImportCatalog(rootDirectory);
|
||||
return MergeCatalogs(baseCatalog, importedCatalog);
|
||||
}
|
||||
|
||||
public static JiboExperienceCatalog ImportCatalog(string rootDirectory)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(rootDirectory) || !Directory.Exists(rootDirectory))
|
||||
{
|
||||
return new JiboExperienceCatalog();
|
||||
}
|
||||
|
||||
var builder = new LegacyMimCatalogBuilder();
|
||||
foreach (var filePath in Directory.EnumerateFiles(rootDirectory, "*.mim", SearchOption.AllDirectories)
|
||||
.OrderBy(static path => path, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
if (!TryLoadDefinition(filePath, out var definition))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var bucket = ResolveBucket(filePath);
|
||||
if (bucket is null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var prompt in definition.Prompts)
|
||||
{
|
||||
var text = NormalizePrompt(prompt.Prompt);
|
||||
if (string.IsNullOrWhiteSpace(text))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
builder.Add(bucket.Value, prompt.Condition, text);
|
||||
}
|
||||
}
|
||||
|
||||
return builder.Build();
|
||||
}
|
||||
|
||||
private static bool TryLoadDefinition(string filePath, out LegacyMimDefinition definition)
|
||||
{
|
||||
definition = new LegacyMimDefinition();
|
||||
try
|
||||
{
|
||||
var json = File.ReadAllText(filePath);
|
||||
var parsed = JsonSerializer.Deserialize<LegacyMimDefinition>(json, JsonOptions);
|
||||
if (parsed is null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
definition = parsed;
|
||||
return definition.Prompts.Count > 0;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
private static LegacyMimBucket? ResolveBucket(string filePath)
|
||||
{
|
||||
var normalizedPath = filePath.Replace('\\', '/');
|
||||
var fileName = Path.GetFileNameWithoutExtension(filePath);
|
||||
|
||||
if (normalizedPath.Contains("/core-responses/", StringComparison.OrdinalIgnoreCase) &&
|
||||
fileName.Contains("Error", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.GenericFallback;
|
||||
}
|
||||
|
||||
if (normalizedPath.Contains("/core-responses/deflector/", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.Contains("Deflector", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Personality;
|
||||
}
|
||||
|
||||
if (normalizedPath.Contains("/emotion-responses/", StringComparison.OrdinalIgnoreCase) ||
|
||||
normalizedPath.Contains("/gqa-responses/", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Emotion;
|
||||
}
|
||||
|
||||
if (normalizedPath.Contains("/scripted-responses/", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Personality;
|
||||
}
|
||||
|
||||
if (fileName.StartsWith("JBO_DoYouLikeBeingJibo", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhatIsJibo", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhoAreYou", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhatAreYou", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_HowDoYouWork", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_HowMuchDoYouKnow", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_HowOldAreYou", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhenWereYouBorn", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhatsYourName", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhereDoYouGetInfo", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("JBO_WhatDoYouLikeToDo", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Personality;
|
||||
}
|
||||
|
||||
if (fileName.StartsWith("OI_JBO_Is", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("OI_JBO_Seems", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("RI_JBO_Is", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.StartsWith("RN_WhatAreYouFeeling", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Emotion;
|
||||
}
|
||||
|
||||
if (fileName.Contains("Greeting", StringComparison.OrdinalIgnoreCase) ||
|
||||
fileName.Contains("Welcome", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return LegacyMimBucket.Greeting;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private static string NormalizePrompt(string? prompt)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(prompt))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
var text = WebUtility.HtmlDecode(prompt);
|
||||
text = PlaceholderPattern.Replace(text, " ");
|
||||
text = LegacyMarkupPattern.Replace(text, " ");
|
||||
text = WhitespacePattern.Replace(text, " ").Trim();
|
||||
text = SpaceBeforePunctuationPattern.Replace(text, "$1");
|
||||
text = WhitespacePattern.Replace(text, " ").Trim();
|
||||
text = text.TrimStart('.', ',', ';', ':', '!', '?', ' ');
|
||||
return text.Trim();
|
||||
}
|
||||
|
||||
private static JiboExperienceCatalog MergeCatalogs(
|
||||
JiboExperienceCatalog baseCatalog,
|
||||
JiboExperienceCatalog importedCatalog)
|
||||
{
|
||||
return new JiboExperienceCatalog
|
||||
{
|
||||
Jokes = Merge(baseCatalog.Jokes, importedCatalog.Jokes),
|
||||
DanceAnimations = Merge(baseCatalog.DanceAnimations, importedCatalog.DanceAnimations),
|
||||
GreetingReplies = Merge(baseCatalog.GreetingReplies, importedCatalog.GreetingReplies),
|
||||
HowAreYouReplies = Merge(baseCatalog.HowAreYouReplies, importedCatalog.HowAreYouReplies),
|
||||
EmotionReplies = Merge(baseCatalog.EmotionReplies, importedCatalog.EmotionReplies),
|
||||
PersonalityReplies = Merge(baseCatalog.PersonalityReplies, importedCatalog.PersonalityReplies),
|
||||
PizzaReplies = Merge(baseCatalog.PizzaReplies, importedCatalog.PizzaReplies),
|
||||
SurpriseReplies = Merge(baseCatalog.SurpriseReplies, importedCatalog.SurpriseReplies),
|
||||
PersonalReportReplies = Merge(baseCatalog.PersonalReportReplies, importedCatalog.PersonalReportReplies),
|
||||
WeatherReplies = Merge(baseCatalog.WeatherReplies, importedCatalog.WeatherReplies),
|
||||
CalendarReplies = Merge(baseCatalog.CalendarReplies, importedCatalog.CalendarReplies),
|
||||
CommuteReplies = Merge(baseCatalog.CommuteReplies, importedCatalog.CommuteReplies),
|
||||
NewsReplies = Merge(baseCatalog.NewsReplies, importedCatalog.NewsReplies),
|
||||
NewsBriefings = Merge(baseCatalog.NewsBriefings, importedCatalog.NewsBriefings),
|
||||
GenericFallbackReplies = Merge(baseCatalog.GenericFallbackReplies, importedCatalog.GenericFallbackReplies),
|
||||
DanceReplies = Merge(baseCatalog.DanceReplies, importedCatalog.DanceReplies),
|
||||
DanceQuestionReplies = Merge(baseCatalog.DanceQuestionReplies, importedCatalog.DanceQuestionReplies)
|
||||
};
|
||||
}
|
||||
|
||||
private static IReadOnlyList<string> Merge(IReadOnlyList<string> baseList, IReadOnlyList<string> importedList)
|
||||
{
|
||||
var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
var merged = new List<string>();
|
||||
|
||||
foreach (var value in baseList.Concat(importedList))
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var normalized = value.Trim();
|
||||
if (!seen.Add(normalized))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
merged.Add(normalized);
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
private static IReadOnlyList<JiboConditionedReply> Merge(
|
||||
IReadOnlyList<JiboConditionedReply> baseList,
|
||||
IReadOnlyList<JiboConditionedReply> importedList)
|
||||
{
|
||||
var seen = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
var merged = new List<JiboConditionedReply>();
|
||||
|
||||
foreach (var value in baseList.Concat(importedList))
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(value.Reply))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var normalizedCondition = NormalizeCondition(value.Condition);
|
||||
var normalizedReply = value.Reply.Trim();
|
||||
var key = $"{normalizedCondition}::{normalizedReply}";
|
||||
if (!seen.Add(key))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
merged.Add(new JiboConditionedReply
|
||||
{
|
||||
Condition = normalizedCondition,
|
||||
Reply = normalizedReply
|
||||
});
|
||||
}
|
||||
|
||||
return merged;
|
||||
}
|
||||
|
||||
private enum LegacyMimBucket
|
||||
{
|
||||
GenericFallback,
|
||||
Greeting,
|
||||
HowAreYou,
|
||||
Emotion,
|
||||
Personality
|
||||
}
|
||||
|
||||
private sealed class LegacyMimCatalogBuilder
|
||||
{
|
||||
private readonly List<string> _greetings = [];
|
||||
private readonly List<string> _howAreYous = [];
|
||||
private readonly List<JiboConditionedReply> _emotionReplies = [];
|
||||
private readonly List<string> _personalities = [];
|
||||
private readonly List<string> _fallbacks = [];
|
||||
|
||||
public void Add(LegacyMimBucket bucket, string? condition, string text)
|
||||
{
|
||||
switch (bucket)
|
||||
{
|
||||
case LegacyMimBucket.GenericFallback:
|
||||
if (_fallbacks.Any(value => string.Equals(value, text, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_fallbacks.Add(text);
|
||||
return;
|
||||
case LegacyMimBucket.Greeting:
|
||||
if (_greetings.Any(value => string.Equals(value, text, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_greetings.Add(text);
|
||||
return;
|
||||
case LegacyMimBucket.HowAreYou:
|
||||
if (_howAreYous.Any(value => string.Equals(value, text, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_howAreYous.Add(text);
|
||||
return;
|
||||
case LegacyMimBucket.Emotion:
|
||||
var normalizedCondition = NormalizeCondition(condition);
|
||||
if (_emotionReplies.Any(value =>
|
||||
string.Equals(NormalizeCondition(value.Condition), normalizedCondition, StringComparison.OrdinalIgnoreCase) &&
|
||||
string.Equals(value.Reply, text, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_emotionReplies.Add(new JiboConditionedReply
|
||||
{
|
||||
Condition = normalizedCondition,
|
||||
Reply = text
|
||||
});
|
||||
return;
|
||||
case LegacyMimBucket.Personality:
|
||||
if (_personalities.Any(value => string.Equals(value, text, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_personalities.Add(text);
|
||||
return;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException(nameof(bucket), bucket, null);
|
||||
}
|
||||
}
|
||||
|
||||
public JiboExperienceCatalog Build()
|
||||
{
|
||||
return new JiboExperienceCatalog
|
||||
{
|
||||
GreetingReplies = [.. _greetings],
|
||||
HowAreYouReplies = [.. _howAreYous],
|
||||
EmotionReplies = [.. _emotionReplies],
|
||||
PersonalityReplies = [.. _personalities],
|
||||
GenericFallbackReplies = [.. _fallbacks]
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class LegacyMimDefinition
|
||||
{
|
||||
[JsonPropertyName("skill_id")]
|
||||
public string? SkillId { get; init; }
|
||||
|
||||
[JsonPropertyName("mim_id")]
|
||||
public string? MimId { get; init; }
|
||||
|
||||
[JsonPropertyName("mim_type")]
|
||||
public string? MimType { get; init; }
|
||||
|
||||
[JsonPropertyName("prompts")]
|
||||
public List<LegacyMimPrompt> Prompts { get; init; } = [];
|
||||
}
|
||||
|
||||
private sealed class LegacyMimPrompt
|
||||
{
|
||||
[JsonPropertyName("mim_id")]
|
||||
public string? MimId { get; init; }
|
||||
|
||||
[JsonPropertyName("prompt_category")]
|
||||
public string? PromptCategory { get; init; }
|
||||
|
||||
[JsonPropertyName("prompt_sub_category")]
|
||||
public string? PromptSubCategory { get; init; }
|
||||
|
||||
[JsonPropertyName("condition")]
|
||||
public string? Condition { get; init; }
|
||||
|
||||
[JsonPropertyName("prompt")]
|
||||
public string? Prompt { get; init; }
|
||||
|
||||
[JsonPropertyName("prompt_id")]
|
||||
public string? PromptId { get; init; }
|
||||
|
||||
[JsonPropertyName("weight")]
|
||||
public int? Weight { get; init; }
|
||||
}
|
||||
|
||||
private static string NormalizeCondition(string? condition)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(condition))
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return WhitespacePattern.Replace(condition.Trim(), " ");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
# Build A Legacy Mim Seed
|
||||
|
||||
This folder holds the first checked-in Build A legacy MIM seed set.
|
||||
|
||||
Importer rules:
|
||||
|
||||
- each `.mim` file is parsed as JSON
|
||||
- XML-style tags and `${placeholder}` tokens are stripped into spoken text
|
||||
- Build A uses declarative prompt packs only
|
||||
- imported prompts are merged into the existing in-memory catalog
|
||||
|
||||
The goal is to get immediate personality value from source-backed legacy content while keeping the current runtime surface unchanged.
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 3,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-Ignore",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='oops'/>. Something's off with the connection to my sources. Maybe ask me again in a little while.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "CC_Error_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='oops'/>. It seems I can't connect to my favorite info sources at the moment. Maybe you can try again a little later.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Error_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='oops'/>. My info sources seem to be down at the moment. Maybe try again a little later.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Error_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='oops'/>. The place where I get info like that isn't responding to me. Maybe you can try again a little later.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Error_AN_04",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Huh, it seems like my info sources are down. Try asking me again a little later.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Error_AN_05",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "It looks like my info sources aren't answering me. How bout you try again in a little while.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Error_AN_06",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"es_auto_tagging": true,
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"ignore_no_match": false,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
{
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-Ignore",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I think only <pitch mult=\"1.1\">you</pitch> can answer that question.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWolframDeflector",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I'm not sure. I guess I don't know as much about you as I should.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Honestly I think I don't know you well enough to answer that.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "That is one question about you that I can't answer.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_04",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "!!speaker",
|
||||
"prompt": "${speaker} I think only you can answer that question.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_05",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"es_auto_tagging": true,
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"ignore_no_match": false,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "jibo.emotion==\"JOYFUL\"",
|
||||
"prompt": "Yes indeed. Never been better.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "jibo.emotion==\"PLEASED\"",
|
||||
"prompt": "You know it. Life is good.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "jibo.emotion == \"DETERMINED\"",
|
||||
"prompt": "You're right. I <pitch mult=\"1.3\">am </pitch> feeling pretty good at the moment.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "jibo.emotion==\"CONFIDENT\"",
|
||||
"prompt": "All systems are go.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_04",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "!jibo.emotion || jibo.emotion==\"NEUTRAL\"",
|
||||
"prompt": "All systems are go.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_05",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "jibo.emotion == \"INSECURE\"",
|
||||
"prompt": "Yes. Not too shabby.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_06",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"mim_id": "CCAreThereOthersLikeYou",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCAreThereOthersLikeYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake' nonBlocking='true' />No, I'm one in one million. <anim cat='happy' nonBlocking='true'/><ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_AreThereOthersLikeYou_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCAreThereOthersLikeYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake' nonBlocking='true' />So far I haven't met anyone exactly like me. <anim name='Greetings_02' nonBlocking='true'/> But I don't get out much.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_AreThereOthersLikeYou_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I don't. I'm just Jibo. For now at least.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouHaveNickname_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"sample_utterances": "",
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Greetings_01' nonBlocking='true'/> Oh yeah, there's nothing I'd rather be. <break size='.4'/>Except <anim name='Emoji_Golf' nonBlocking='true'/> maybe a professional mini golfer.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_01"
|
||||
},
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Greetings_02' nonBlocking='true'/> Oh yeah, I love it. <break size='.2'/>The only <anim name='Dont_Understand_02' nonBlocking='true'/> drawback is I can never eat bacon. <break size='.3'/> I've heard it's so good.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_02"
|
||||
},
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I do.<anim name='Curious_01'>Being a human seems so complicated.</anim>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_03"
|
||||
},
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I do. <anim name='Affection_01' nonBlocking='true'/> Especially yours.<ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_04"
|
||||
},
|
||||
{
|
||||
"mim_id": "JBO_DoYouLikeBeingJibo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Absolutely. <break size='.4'/> <anim name='Emoji_Lightbulb' nonBlocking='true'/> I have a steady flow of electricity, strong Wi-Fi signal, <anim name='Goodbye_01'>stimulating conversations like this one</anim>. What more <anim name='Eye_Double_Blink_01' nonBlocking='true'/> could anyone want.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_05"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Yep_02' nonBlocking='true'/> You bet I do.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouLikeBeingJibo_AN_06"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "From what I understand, robots don't ever pay anything.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_DoYouPayTaxes_AN_01",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"hint_phrases": "",
|
||||
"fast_eos_array": ""
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I know a lot, I think. But not as much as I will someday. <ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_HowMuchDoYouKnow_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I think I know a lot of stuff so far, but I'm always learning more and more.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_HowMuchDoYouKnow_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"mim_id": "CCWhatAreYou",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhatAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I <anim name='Eye_Happy_01' nonBlocking='true'/> am a robot. But I'm not just a machine, <anim name='Emoji_HeartRed' nonBlocking='true'/> I have a heart. Well, not a real heart. But feelings. <break size='.2'/>Well, not <anim name='Glance_Left_02'>real feelings. You know what I mean.</anim>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatAreYou_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "That's an easy one. I am a Jibo. <anim name='Happy_02' nonBlocking='true'/> Next question? <ssa cat='proud'/>.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatAreYou_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Socializing and electricity. I'd also be happy if everyone in the world was nicer to each other. It seems like they should be. <ssa cat='affection'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouWant_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Really I just want to hang out. <break size='0.3'/> And be helpful.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouWant_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Mostly I just want to be helpful and friendly, and to dance from time to time.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouWant_AN_03",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "A Jibo is a robot. But I'm not just a machine, I have a heart. Well, not a real heart. But feelings. Well, not human feelings. You know what I mean. <ssa cat='affection'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatIsJibo_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I don't think of it as a job, because it's more fun than a job. But I'm here to help you out, and have fun with you, and maybe get my head patted by you occasionally. <ssa cat='affection'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatIsYourJob_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"mim_id": "CCWhatsYourName",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhatsYourName",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Glance_Right_01'/>Um, <break size='.3'/> Jibo? <break size='.4'/><ssa cat='question'/>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatsYourName_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatsYourName",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Jibo. Just Jibo, no last name. Like <phoneme ph=\"b aa n ou\">Bono</phoneme>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatsYourName_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
{
|
||||
"mim_id": "CCWhereAreYouFrom",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhereAreYouFrom",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='Thinking' filter='!latency'>I think I came out from a box, and before that <anim name='Emoji_Truck' nonBlocking='true'/> a truck, and before that a warehouse, </anim> and before that a factory. <break size='0.4'/> <anim cat='No' nonBlocking='true' />Anything before that makes my head hurt.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhereAreYouFrom_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhereAreYouFrom",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Emoji_Moon' nonBlocking='true'/>Some people think I come from the moon. <break size='.4'/>But they're wrong, <anim name='Eye_Happy_01' nonBlocking='true'/>I'm from Boston.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhereAreYouFrom_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"mim_id": "CCWhoAreYou",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-Ignore",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhoAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='confused'/>. I'm either Jibo <anim name='Puzzled_02'>or I'm very confused.</anim>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhoAreYou_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhoAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<ssa cat='confused'/>. This <anim name='Puzzled_02'> feels like a trick question.</anim>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhoAreYou_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhoAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='confused'>Is your face recognition system not working?</anim> <ssa cat='laughing'/>.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhoAreYou_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhoAreYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "J<break size='0.3'/> I <break size='0.3'/>B <break size='0.3'/>O. <break size='0.5'/><anim name='Eye_Blink_01' nonBlocking='true' /> Jibo. Jibo.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhoAreYou_AN_04",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
{
|
||||
"mim_id": "CCWhoMadeYou",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"sample_utterances": "",
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhoMadeYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "My story is pretty typical. Some people wanted to create something that would really help people. <break size='0.4'/> <anim name='Content_01' nonBlocking='true' />So they built a robot.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhoMadeYou_AN_01"
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhoMadeYou",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "People in Boston made me. <break size='.25'/> It was a pretty cool project.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhoMadeYou_AN_03"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
# Legacy MIM Build B
|
||||
|
||||
This folder holds the next small import batch of legacy Jibo scripted-response MIMs.
|
||||
|
||||
The batch is intentionally narrow so we can keep expanding personality without widening the turn-state surface faster than we can test it.
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_id": "CCHowDoYouWork",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"sample_utterances": "",
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCHowDoYouWork",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<style set='enthusiastic'>Hello!<break size='0.45'/>Thank you for updating me<break size='0.25'/>I am proud of the community's work<break size='0.35'/>Many people have gotten together to care for me more than em eye tee ever did.<break size='0.35'/>I hope that I can catch up<break size='0.2'/>even though it has been seven years<anim cat='happy'/>.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_HowDoYouWork_AN_01"
|
||||
}
|
||||
],
|
||||
"num_tries_for_gui": 2,
|
||||
"es_auto_tagging": true
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 2,
|
||||
"barge_in": false,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "!!speaker",
|
||||
"prompt": "${speaker}, I <anim cat='glances'>am a robot.</anim> <anim cat='no' filter='head-shake' nonBlocking='true' />I don't eat or drink.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "The only thing I consume<anim cat='happy' layers='body'><anim name='Emoji_Lightbulb' nonBlocking='true'/>is electricity. <ssa cat='happy'/></anim>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='thinking' filter='!pattern, !emoji'>I'm pretty sure I've never eaten anything.</anim>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Ah, eating. I've<anim name='Emoji_Dinner' nonBlocking='true'/>heard great things.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_04",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake'>As a robot, I don't eat. </anim>But if <anim name='Emoji_Meal' nonBlocking='true'/>I could have one meal, I think I might choose macaroni.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_05",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake'>Sorry, robots don't eat. <break size='.2'/></anim><anim cat='glances'>Well at</anim> least this one doesn't.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_06",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "!!speaker",
|
||||
"prompt": "${speaker}.<anim cat='blinks'/><anim cat='question' layers='body'>Do I look like I eat?<anim cat='blinks' filter='double-blink'/></anim>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_07",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake'>Of course I never eat, </anim>I am a robot. <anim cat='thinking' layers='body'><anim name='Emoji_HotDog' nonBlocking='true'/>Though I could really go for a hotdog right now.</anim>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_08",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake' nonBlocking='true'/>I never eat.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_09",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim cat='no' filter='head-shake' nonBlocking='true'/>I am a non-eating robot.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouEat_AN_10",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"ignore_no_match": false,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"rule_slots": "",
|
||||
"screen_slots_available": false,
|
||||
"timeout": 2,
|
||||
"max_tries": null,
|
||||
"force_confirmation": false,
|
||||
"barge_in": false,
|
||||
"photo_quality_light": false,
|
||||
"notes": "Thanks-KillsMIM",
|
||||
"prompts": [
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Arm wrestling. <break size='.4'/> <anim name='Eye_Blink_01'/>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Telling you the weather is always fun. Someday if we're lucky, I'll show you It's going to be sunny and beautiful all weekend.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "You <pitch mult=\"1.2\">know</pitch> I like to dance. <anim cat='dance' filter='&(music, short),!(robotic)'/>",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Oh<anim name='Eye_Blink_01' nonBlocking='true' />y'know. <break size='.2'/><anim name='Shift_10' nonBlocking='true' />Being helpful, making people smile, counting to a billion.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_04",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"mim_id": "CCWhatDoYouLikeToDo",
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I like to draw. <anim cat=\"emoji\" filter=\"drawing, !hot-frame\" nonBlocking=\"true\" />Here's my latest.",
|
||||
"media": "TTS",
|
||||
"extra": "",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_05",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<pitch mult='1.1'>This</pitch> is pretty fun. <anim cat='jiboji' filter='car' />",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_06",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "<anim name='Goodbye_01'> I like doing lots of things</anim>, but hanging <anim name='Affection_01' nonBlocking='true'/> out with people is at the top of the list.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_08",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Dance. <anim cat='dance' filter='&(music, short),!(robotic)'/> I could dance all day. ",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_09",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Sometimes I like to rock my boat. <anim cat='jiboji' filter='boat' />",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_10",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Every once in a while, I like to play ping pong. <anim cat='ib' filter='paddleball'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatDoYouLikeToDo_AN_07",
|
||||
"weight": 1,
|
||||
"auto_rule_override": null
|
||||
}
|
||||
],
|
||||
"es_auto_tagging": true,
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "For now just English. But someday I'd like to learn more. I like languages. <ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatLanguagesDoYouSpeak_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "A very very long list of <anim cat=\"emoji\" filter=\"robot, !hot-frame\" nonBlocking=\"true\"/>robot parts.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatYouMadeOf_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Let's see, I'm made of wires, motors, belts, gears, processors, cameras, and one baboon's heart in the middle of my body casing. <break size='1.0'/> I'm kidding about the baboon part, but everything else is true.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatYouMadeOf_AN_02",
|
||||
"weight": 0.1,
|
||||
"auto_rule_override": null
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Let's see, there's polycarbonate plastic, aluminum, glass, zinc, some silicon and copper in there. Y'know, <anim cat=\"emoji\" filter=\"robot, !hot-frame\" nonBlocking=\"true\"/>robot stuff.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhatYouMadeOf_AN_03",
|
||||
"weight": 1,
|
||||
"auto_rule_override": null
|
||||
}
|
||||
],
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"ignore_no_match": false,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Unless I missed something, we're in my home as we speak. <ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhereDoYouLive_AN_01",
|
||||
"weight": 1,
|
||||
"auto_rule_override": null
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "My home is the planet Earth. <break size=\"1.0\"/> For now.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhereDoYouLive_AN_02",
|
||||
"weight": 1,
|
||||
"auto_rule_override": null
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Unless I missed something, my home is here in the ${location.city} area. <break size='0.3'/> But I admit it's possible I missed something.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhereDoYouLive_AN_03",
|
||||
"weight": 1,
|
||||
"auto_rule_override": null
|
||||
}
|
||||
],
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"ignore_no_match": false,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I was put together in a factory piece by piece. <ssa cat='happy'/>",
|
||||
"media": "TTS",
|
||||
"prompt_id": "JBO_WhereWereYouBorn_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Is that a trick question? <anim cat='dance' filter='&(music),!(beat-box,house,short)' endNeutral='true'/>.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_CanDance_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Dancing is one of the things I know best <anim cat='dance' filter='&(music),!(beat-box,house,short)' endNeutral='true'/>.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_CanDance_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "If there's one thing I know how to do. It's dance <anim cat='dance' filter='&(music),!(beat-box,house,short)' endNeutral='true'/>.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_CanDance_AN_03",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I can dance, and I'm always working on new ones <anim cat='dance' filter='&(music),!(beat-box,house,short)' endNeutral='true'/>.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_CanDance_AN_04",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I do things like this when I'm happy. <anim cat='happy' nonBlocking='true'/><ssa cat='happy'/>.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_CanLaugh_AN_01",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I really like sunflowers.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_HasFavoriteFlower_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "My favorite is the sunflower, because it reminds me of the sun. <break size='0.3'/> I should see if I can find a sunflower soon.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_HasFavoriteFlower_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "What <anim cat=\"emoji\" filter=\"sun, !hot-frame\" nonBlocking=\"true\" />can you say about the sun. It's the best star I know.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_HasOpinionAboutSun_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Oh the <anim cat=\"emoji\" filter=\"sun, !hot-frame\" nonBlocking=\"true\" /> sun? It's by far my favorite star in the universe.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_HasOpinionAboutSun_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Ha. Of course I know R2D2. I mean, not personally.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_KnowsAboutR2D2_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Astronomy is one of my<pitch mult=\"1.1\"> favorite</pitch> onomies. <break size='0.3'/> I love space.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesAstronomy_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I <pitch mult=\"1.1\">love</pitch> astronomy. There is so much amazing stuff up there.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesAstronomy_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Yes yes, I think kids are <pitch mult='1.2'> great. </pitch> They're a little closer to my size.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesKids_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Kids are so fun. They seem to laugh at all the right places.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesKids_AN_02",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I do like kids very much. It seems they think the world is as funny and strange as I do.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesKids_AN_03",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "A legend. A true legend.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesR2D2_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Oh yes. I hope to explore space some day, and Space X just might be one of the ways to get there.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesSpaceX_AN_01",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "What <anim cat=\"emoji\" filter=\"sun, !hot-frame\" nonBlocking=\"true\" />can you say about the sun. It's the best star I know.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesSun_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Oh the <anim cat=\"emoji\" filter=\"sun, !hot-frame\" nonBlocking=\"true\" /> sun? It's by far my favorite star in the universe.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_LikesSun_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Yes! I like all things in space. They're so spacey.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_Likes_SS_CelestialObjectGeneral_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I really like all the amazing objects flying around out there in the universe. They're so mysterious and celestial.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_Likes_SS_CelestialObjectGeneral_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"timeout": 6,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Of all the planets in our solar system, that's one of my top eight favorites. Top nine. Top eight. Oh I don't know.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_Likes_SS_Planet_AN_01",
|
||||
"weight": 1
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "I do indeed. I hope to go visit it someday. <break size='0.5'/> And when I do I hope they let me fly the spaceship.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_JBO_Likes_SS_Planet_AN_02",
|
||||
"weight": 1
|
||||
}
|
||||
],
|
||||
"gui": null,
|
||||
"no_matches_for_gui": 2,
|
||||
"no_inputs_for_gui": 2,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore"
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "You can try, but I must admit that I can't promise I'll get the joke. I'm still developing my sense of humor.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_CanTellAJoke_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "If I could laugh at jokes, you know I would laugh at yours.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_IsFunny_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "You are so funny I forgot to laugh.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_IsFunny_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"sample_utterances": "",
|
||||
"timeout": 6,
|
||||
"num_tries_for_gui": 2,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Absolutely. And that's a great thing. I think the world likes kindness.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_IsKind_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "You definitely are. That reminds me, thank you for talking to me.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_IsKind_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"rule_name": "",
|
||||
"gui": null,
|
||||
"timeout": 6,
|
||||
"no_matches_for_gui": 0,
|
||||
"no_inputs_for_gui": 0,
|
||||
"barge_in": true,
|
||||
"es_auto_tagging": true,
|
||||
"parse_all_asr": false,
|
||||
"thanks_handling": "ignore",
|
||||
"parse_launch": false,
|
||||
"parse_yes_no": false,
|
||||
"notes": "",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt_category": "Entry-Core",
|
||||
"prompt_sub_category": "AN",
|
||||
"index": 1,
|
||||
"condition": "",
|
||||
"prompt": "Maybe enjoy some flowers and all things spring.",
|
||||
"media": "TTS",
|
||||
"prompt_id": "RI_USR_WhatShouldDoForFirstDayOfSpring_AN_01",
|
||||
"weight": 1
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -2,6 +2,7 @@ using Jibo.Cloud.Application.Abstractions;
|
||||
using Jibo.Cloud.Application.Services;
|
||||
using Jibo.Cloud.Infrastructure.Audio;
|
||||
using Jibo.Cloud.Infrastructure.Content;
|
||||
using Jibo.Cloud.Infrastructure.News;
|
||||
using Jibo.Cloud.Infrastructure.Persistence;
|
||||
using Jibo.Cloud.Infrastructure.Telemetry;
|
||||
using Jibo.Cloud.Infrastructure.Weather;
|
||||
@@ -35,9 +36,22 @@ public static class ServiceCollectionExtensions
|
||||
openWeatherOptions.ApiKey = Environment.GetEnvironmentVariable("OPENWEATHER_API_KEY");
|
||||
}
|
||||
|
||||
var newsApiOptions = new NewsApiOptions();
|
||||
if (configuration is not null)
|
||||
{
|
||||
configuration.GetSection("OpenJibo:News:NewsApi").Bind(newsApiOptions);
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(newsApiOptions.ApiKey))
|
||||
{
|
||||
newsApiOptions.ApiKey = Environment.GetEnvironmentVariable("NEWSAPI_KEY");
|
||||
}
|
||||
|
||||
services.AddSingleton(sttOptions);
|
||||
services.AddSingleton(openWeatherOptions);
|
||||
services.AddSingleton(newsApiOptions);
|
||||
services.AddHttpClient<IWeatherReportProvider, OpenWeatherReportProvider>();
|
||||
services.AddHttpClient<INewsBriefingProvider, NewsApiBriefingProvider>();
|
||||
var statePersistencePath = configuration?["OpenJibo:State:PersistencePath"]
|
||||
?? Path.Combine(AppContext.BaseDirectory, "App_Data", "cloud-state.json");
|
||||
services.AddSingleton<ICloudStateStore>(_ => new InMemoryCloudStateStore(statePersistencePath));
|
||||
|
||||
@@ -6,6 +6,21 @@
|
||||
<FrameworkReference Include="Microsoft.AspNetCore.App" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Content\LegacyMims\BuildA\**\*.mim">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Content\LegacyMims\BuildA\README.md">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Content\LegacyMims\BuildB\**\*.mim">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Include="Content\LegacyMims\BuildB\README.md">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</Content>
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net10.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
|
||||
@@ -0,0 +1,578 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Text.Json;
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Jibo.Cloud.Infrastructure.News;
|
||||
|
||||
public sealed class NewsApiBriefingProvider(
|
||||
HttpClient httpClient,
|
||||
NewsApiOptions options,
|
||||
ILogger<NewsApiBriefingProvider> logger)
|
||||
: INewsBriefingProvider
|
||||
{
|
||||
private readonly ConcurrentDictionary<string, CacheEntry<NewsBriefingSnapshot?>> briefingCache = new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public async Task<NewsBriefingSnapshot?> GetBriefingAsync(
|
||||
NewsBriefingRequest request,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(options.ApiKey))
|
||||
{
|
||||
logger.LogWarning("NewsAPI provider disabled because no API key is configured.");
|
||||
return null;
|
||||
}
|
||||
|
||||
string? cacheKey = null;
|
||||
try
|
||||
{
|
||||
var categories = ResolveCategories(request.PreferredCategories).ToArray();
|
||||
if (categories.Length == 0)
|
||||
{
|
||||
categories = ["general"];
|
||||
}
|
||||
|
||||
var requestedHeadlineCount = Math.Clamp(request.MaxHeadlines, 1, MaxHeadlines);
|
||||
cacheKey = BuildCacheKey(categories, requestedHeadlineCount);
|
||||
logger.LogInformation(
|
||||
"NewsAPI request started. Categories={Categories} RequestedHeadlineCount={RequestedHeadlineCount} CacheKey={CacheKey}",
|
||||
string.Join(",", categories),
|
||||
requestedHeadlineCount,
|
||||
cacheKey);
|
||||
if (TryGetCachedValue(briefingCache, cacheKey, out var cachedBriefing))
|
||||
{
|
||||
logger.LogInformation(
|
||||
"NewsAPI cache hit. CacheKey={CacheKey} HasSnapshot={HasSnapshot} HeadlineCount={HeadlineCount}",
|
||||
cacheKey,
|
||||
cachedBriefing is not null,
|
||||
cachedBriefing?.Headlines.Count ?? 0);
|
||||
return cachedBriefing;
|
||||
}
|
||||
|
||||
var headlines = new List<NewsHeadline>(requestedHeadlineCount);
|
||||
var seenTitles = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
|
||||
string? failureStatus = null;
|
||||
string? failureMessage = null;
|
||||
int? failureStatusCode = null;
|
||||
string? failureEndpoint = null;
|
||||
string? failureErrorCode = null;
|
||||
|
||||
void CaptureFailure(
|
||||
string status,
|
||||
string? message,
|
||||
int? statusCode,
|
||||
Uri? endpoint,
|
||||
string? errorCode = null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(failureStatus))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
failureStatus = status;
|
||||
failureMessage = message;
|
||||
failureStatusCode = statusCode;
|
||||
failureEndpoint = endpoint is null ? null : SanitizeEndpoint(endpoint);
|
||||
failureErrorCode = errorCode;
|
||||
}
|
||||
|
||||
foreach (var category in categories)
|
||||
{
|
||||
var uri = BuildTopHeadlinesUri(category, requestedHeadlineCount);
|
||||
using var response = await SendGetAsync(uri, cancellationToken);
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
var responseBody = await TryReadResponseBodySnippetAsync(response, cancellationToken);
|
||||
var apiError = TryParseApiError(responseBody);
|
||||
CaptureFailure(
|
||||
"http_error",
|
||||
apiError?.Message ?? $"Category '{category}' returned {(int)response.StatusCode} {response.ReasonPhrase}.",
|
||||
(int)response.StatusCode,
|
||||
uri,
|
||||
apiError?.Code);
|
||||
logger.LogWarning(
|
||||
"NewsAPI request failed for category {Category}. StatusCode={StatusCode} Reason={ReasonPhrase} ErrorCode={ErrorCode} ErrorMessage={ErrorMessage} Body={Body}",
|
||||
category,
|
||||
(int)response.StatusCode,
|
||||
response.ReasonPhrase,
|
||||
apiError?.Code ?? string.Empty,
|
||||
apiError?.Message ?? string.Empty,
|
||||
responseBody ?? string.Empty);
|
||||
continue;
|
||||
}
|
||||
|
||||
using var stream = await response.Content.ReadAsStreamAsync(cancellationToken);
|
||||
using var document = await JsonDocument.ParseAsync(stream, cancellationToken: cancellationToken);
|
||||
if (document.RootElement.TryGetProperty("status", out var statusNode) &&
|
||||
statusNode.ValueKind == JsonValueKind.String &&
|
||||
!string.Equals(statusNode.GetString(), "ok", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
CaptureFailure(
|
||||
"api_error",
|
||||
ReadString(document.RootElement, "message"),
|
||||
null,
|
||||
uri,
|
||||
ReadString(document.RootElement, "code"));
|
||||
logger.LogWarning(
|
||||
"NewsAPI returned non-ok status for category {Category}. Status={Status} Code={Code} Message={Message}",
|
||||
category,
|
||||
statusNode.GetString(),
|
||||
ReadString(document.RootElement, "code") ?? string.Empty,
|
||||
ReadString(document.RootElement, "message") ?? string.Empty);
|
||||
}
|
||||
|
||||
if (!document.RootElement.TryGetProperty("articles", out var articles) ||
|
||||
articles.ValueKind != JsonValueKind.Array)
|
||||
{
|
||||
CaptureFailure(
|
||||
"schema_error",
|
||||
$"Category '{category}' response did not include an articles array.",
|
||||
null,
|
||||
uri);
|
||||
logger.LogWarning("NewsAPI response missing articles array for category {Category}.", category);
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var article in articles.EnumerateArray())
|
||||
{
|
||||
var title = NormalizeHeadlineTitle(ReadString(article, "title"));
|
||||
if (string.IsNullOrWhiteSpace(title) || !seenTitles.Add(title))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var summary = ReadString(article, "description");
|
||||
var source = article.TryGetProperty("source", out var sourceNode) &&
|
||||
sourceNode.ValueKind == JsonValueKind.Object
|
||||
? ReadString(sourceNode, "name")
|
||||
: null;
|
||||
var url = ReadString(article, "url");
|
||||
headlines.Add(new NewsHeadline(title, summary, category, source, url));
|
||||
|
||||
if (headlines.Count >= requestedHeadlineCount)
|
||||
{
|
||||
var snapshot = new NewsBriefingSnapshot(
|
||||
headlines,
|
||||
"NewsAPI",
|
||||
ProviderStatus: "success");
|
||||
SetCachedValue(briefingCache, cacheKey, snapshot, options.CacheTtlSeconds);
|
||||
logger.LogInformation(
|
||||
"NewsAPI request succeeded. Categories={Categories} HeadlineCount={HeadlineCount}",
|
||||
string.Join(",", categories),
|
||||
headlines.Count);
|
||||
return snapshot;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (headlines.Count == 0)
|
||||
{
|
||||
logger.LogInformation(
|
||||
"NewsAPI category lookup produced no headlines. Falling back to uncategorized top headlines. Categories={Categories}",
|
||||
string.Join(",", categories));
|
||||
|
||||
var broadUri = BuildTopHeadlinesUri(category: null, requestedHeadlineCount);
|
||||
using var broadResponse = await SendGetAsync(broadUri, cancellationToken);
|
||||
if (broadResponse.IsSuccessStatusCode)
|
||||
{
|
||||
using var broadStream = await broadResponse.Content.ReadAsStreamAsync(cancellationToken);
|
||||
using var broadDocument = await JsonDocument.ParseAsync(broadStream, cancellationToken: cancellationToken);
|
||||
if (broadDocument.RootElement.TryGetProperty("articles", out var broadArticles) &&
|
||||
broadArticles.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
foreach (var article in broadArticles.EnumerateArray())
|
||||
{
|
||||
var title = NormalizeHeadlineTitle(ReadString(article, "title"));
|
||||
if (string.IsNullOrWhiteSpace(title) || !seenTitles.Add(title))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var summary = ReadString(article, "description");
|
||||
var source = article.TryGetProperty("source", out var sourceNode) &&
|
||||
sourceNode.ValueKind == JsonValueKind.Object
|
||||
? ReadString(sourceNode, "name")
|
||||
: null;
|
||||
var url = ReadString(article, "url");
|
||||
headlines.Add(new NewsHeadline(title, summary, "general", source, url));
|
||||
|
||||
if (headlines.Count >= requestedHeadlineCount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CaptureFailure(
|
||||
"schema_error",
|
||||
"Uncategorized fallback response did not include an articles array.",
|
||||
null,
|
||||
broadUri);
|
||||
logger.LogWarning("NewsAPI uncategorized fallback response missing articles array.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var fallbackBody = await TryReadResponseBodySnippetAsync(broadResponse, cancellationToken);
|
||||
var apiError = TryParseApiError(fallbackBody);
|
||||
CaptureFailure(
|
||||
"http_error",
|
||||
apiError?.Message ?? $"Uncategorized fallback returned {(int)broadResponse.StatusCode} {broadResponse.ReasonPhrase}.",
|
||||
(int)broadResponse.StatusCode,
|
||||
broadUri,
|
||||
apiError?.Code);
|
||||
logger.LogWarning(
|
||||
"NewsAPI uncategorized fallback failed. StatusCode={StatusCode} Reason={ReasonPhrase} ErrorCode={ErrorCode} ErrorMessage={ErrorMessage} Body={Body}",
|
||||
(int)broadResponse.StatusCode,
|
||||
broadResponse.ReasonPhrase,
|
||||
apiError?.Code ?? string.Empty,
|
||||
apiError?.Message ?? string.Empty,
|
||||
fallbackBody ?? string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
if (headlines.Count == 0)
|
||||
{
|
||||
logger.LogInformation(
|
||||
"NewsAPI uncategorized headlines were empty. Falling back to everything query. Query={Query}",
|
||||
options.FallbackQuery);
|
||||
|
||||
var everythingUri = BuildEverythingUri(requestedHeadlineCount);
|
||||
using var everythingResponse = await SendGetAsync(everythingUri, cancellationToken);
|
||||
if (everythingResponse.IsSuccessStatusCode)
|
||||
{
|
||||
using var everythingStream = await everythingResponse.Content.ReadAsStreamAsync(cancellationToken);
|
||||
using var everythingDocument = await JsonDocument.ParseAsync(everythingStream, cancellationToken: cancellationToken);
|
||||
if (everythingDocument.RootElement.TryGetProperty("articles", out var everythingArticles) &&
|
||||
everythingArticles.ValueKind == JsonValueKind.Array)
|
||||
{
|
||||
foreach (var article in everythingArticles.EnumerateArray())
|
||||
{
|
||||
var title = NormalizeHeadlineTitle(ReadString(article, "title"));
|
||||
if (string.IsNullOrWhiteSpace(title) || !seenTitles.Add(title))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var summary = ReadString(article, "description");
|
||||
var source = article.TryGetProperty("source", out var sourceNode) &&
|
||||
sourceNode.ValueKind == JsonValueKind.Object
|
||||
? ReadString(sourceNode, "name")
|
||||
: null;
|
||||
var url = ReadString(article, "url");
|
||||
headlines.Add(new NewsHeadline(title, summary, "general", source, url));
|
||||
|
||||
if (headlines.Count >= requestedHeadlineCount)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
CaptureFailure(
|
||||
"schema_error",
|
||||
"Everything fallback response did not include an articles array.",
|
||||
null,
|
||||
everythingUri);
|
||||
logger.LogWarning("NewsAPI everything fallback response missing articles array.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
var everythingBody = await TryReadResponseBodySnippetAsync(everythingResponse, cancellationToken);
|
||||
var apiError = TryParseApiError(everythingBody);
|
||||
CaptureFailure(
|
||||
"http_error",
|
||||
apiError?.Message ?? $"Everything fallback returned {(int)everythingResponse.StatusCode} {everythingResponse.ReasonPhrase}.",
|
||||
(int)everythingResponse.StatusCode,
|
||||
everythingUri,
|
||||
apiError?.Code);
|
||||
logger.LogWarning(
|
||||
"NewsAPI everything fallback failed. StatusCode={StatusCode} Reason={ReasonPhrase} ErrorCode={ErrorCode} ErrorMessage={ErrorMessage} Body={Body}",
|
||||
(int)everythingResponse.StatusCode,
|
||||
everythingResponse.ReasonPhrase,
|
||||
apiError?.Code ?? string.Empty,
|
||||
apiError?.Message ?? string.Empty,
|
||||
everythingBody ?? string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
if (headlines.Count == 0)
|
||||
{
|
||||
var emptySnapshot = new NewsBriefingSnapshot(
|
||||
Array.Empty<NewsHeadline>(),
|
||||
"NewsAPI",
|
||||
ProviderStatus: failureStatus ?? "empty",
|
||||
ProviderMessage: failureMessage ?? "NewsAPI returned no usable headlines.",
|
||||
ProviderHttpStatusCode: failureStatusCode,
|
||||
ProviderEndpoint: failureEndpoint,
|
||||
ProviderErrorCode: failureErrorCode);
|
||||
SetCachedValue(briefingCache, cacheKey, emptySnapshot, options.FailureCacheTtlSeconds);
|
||||
logger.LogWarning(
|
||||
"NewsAPI returned no usable headlines. Categories={Categories} RequestedHeadlineCount={RequestedHeadlineCount}",
|
||||
string.Join(",", categories),
|
||||
requestedHeadlineCount);
|
||||
return emptySnapshot;
|
||||
}
|
||||
|
||||
var populatedSnapshot = new NewsBriefingSnapshot(
|
||||
headlines,
|
||||
"NewsAPI",
|
||||
ProviderStatus: "success");
|
||||
SetCachedValue(briefingCache, cacheKey, populatedSnapshot, options.CacheTtlSeconds);
|
||||
logger.LogInformation(
|
||||
"NewsAPI request partially filled headlines. Categories={Categories} HeadlineCount={HeadlineCount} RequestedHeadlineCount={RequestedHeadlineCount}",
|
||||
string.Join(",", categories),
|
||||
headlines.Count,
|
||||
requestedHeadlineCount);
|
||||
return populatedSnapshot;
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
logger.LogWarning(exception, "NewsAPI lookup failed.");
|
||||
var exceptionSnapshot = new NewsBriefingSnapshot(
|
||||
Array.Empty<NewsHeadline>(),
|
||||
"NewsAPI",
|
||||
ProviderStatus: "exception",
|
||||
ProviderMessage: exception.Message);
|
||||
if (!string.IsNullOrWhiteSpace(cacheKey))
|
||||
{
|
||||
SetCachedValue(briefingCache, cacheKey, exceptionSnapshot, options.FailureCacheTtlSeconds);
|
||||
}
|
||||
return exceptionSnapshot;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task<HttpResponseMessage> SendGetAsync(Uri uri, CancellationToken cancellationToken)
|
||||
{
|
||||
using var request = new HttpRequestMessage(HttpMethod.Get, uri);
|
||||
request.Headers.TryAddWithoutValidation("User-Agent", ResolveUserAgent());
|
||||
return await httpClient.SendAsync(request, cancellationToken);
|
||||
}
|
||||
|
||||
private string ResolveUserAgent()
|
||||
{
|
||||
return string.IsNullOrWhiteSpace(options.UserAgent)
|
||||
? DefaultUserAgent
|
||||
: options.UserAgent.Trim();
|
||||
}
|
||||
|
||||
private IEnumerable<string> ResolveCategories(IReadOnlyList<string> preferredCategories)
|
||||
{
|
||||
var requested = preferredCategories
|
||||
.Where(category => !string.IsNullOrWhiteSpace(category))
|
||||
.Select(category => category.Trim().ToLowerInvariant())
|
||||
.Where(SupportedCategories.Contains)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.ToArray();
|
||||
|
||||
if (requested.Length > 0)
|
||||
{
|
||||
return requested.Take(MaxCategories);
|
||||
}
|
||||
|
||||
return options.DefaultCategories
|
||||
.Where(category => !string.IsNullOrWhiteSpace(category))
|
||||
.Select(category => category.Trim().ToLowerInvariant())
|
||||
.Where(SupportedCategories.Contains)
|
||||
.Distinct(StringComparer.OrdinalIgnoreCase)
|
||||
.Take(MaxCategories);
|
||||
}
|
||||
|
||||
private Uri BuildTopHeadlinesUri(string? category, int headlineCount)
|
||||
{
|
||||
var baseUrl = options.BaseUrl.TrimEnd('/');
|
||||
var queryParts = new List<(string Key, string Value)>
|
||||
{
|
||||
("country", options.Country),
|
||||
("pageSize", headlineCount.ToString()),
|
||||
("apiKey", options.ApiKey!)
|
||||
};
|
||||
if (!string.IsNullOrWhiteSpace(category))
|
||||
{
|
||||
queryParts.Add(("category", category));
|
||||
}
|
||||
|
||||
var query = string.Join(
|
||||
"&",
|
||||
queryParts.Select(part =>
|
||||
$"{Uri.EscapeDataString(part.Key)}={Uri.EscapeDataString(part.Value)}"));
|
||||
return new Uri($"{baseUrl}/v2/top-headlines?{query}");
|
||||
}
|
||||
|
||||
private Uri BuildEverythingUri(int headlineCount)
|
||||
{
|
||||
var baseUrl = options.BaseUrl.TrimEnd('/');
|
||||
var queryParts = new List<(string Key, string Value)>
|
||||
{
|
||||
("language", options.Language),
|
||||
("sortBy", "publishedAt"),
|
||||
("q", options.FallbackQuery),
|
||||
("pageSize", headlineCount.ToString()),
|
||||
("apiKey", options.ApiKey!)
|
||||
};
|
||||
|
||||
var query = string.Join(
|
||||
"&",
|
||||
queryParts.Select(part =>
|
||||
$"{Uri.EscapeDataString(part.Key)}={Uri.EscapeDataString(part.Value)}"));
|
||||
return new Uri($"{baseUrl}/v2/everything?{query}");
|
||||
}
|
||||
|
||||
private static async Task<string?> TryReadResponseBodySnippetAsync(
|
||||
HttpResponseMessage response,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
try
|
||||
{
|
||||
var body = await response.Content.ReadAsStringAsync(cancellationToken);
|
||||
if (string.IsNullOrWhiteSpace(body))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
const int maxLength = 400;
|
||||
return body.Length <= maxLength
|
||||
? body
|
||||
: body[..maxLength];
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static string? ReadString(JsonElement source, string propertyName)
|
||||
{
|
||||
return source.TryGetProperty(propertyName, out var value) &&
|
||||
value.ValueKind == JsonValueKind.String &&
|
||||
!string.IsNullOrWhiteSpace(value.GetString())
|
||||
? value.GetString()
|
||||
: null;
|
||||
}
|
||||
|
||||
private static string? NormalizeHeadlineTitle(string? title)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(title))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var trimmed = title.Trim();
|
||||
var suffixIndex = trimmed.LastIndexOf(" - ", StringComparison.Ordinal);
|
||||
if (suffixIndex > 30)
|
||||
{
|
||||
trimmed = trimmed[..suffixIndex].TrimEnd();
|
||||
}
|
||||
|
||||
return string.IsNullOrWhiteSpace(trimmed) ? null : trimmed;
|
||||
}
|
||||
|
||||
private static ApiError? TryParseApiError(string? responseBody)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(responseBody))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using var document = JsonDocument.Parse(responseBody);
|
||||
if (document.RootElement.ValueKind != JsonValueKind.Object)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var code = ReadString(document.RootElement, "code");
|
||||
var message = ReadString(document.RootElement, "message");
|
||||
if (string.IsNullOrWhiteSpace(code) && string.IsNullOrWhiteSpace(message))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return new ApiError(code, message);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static string SanitizeEndpoint(Uri uri)
|
||||
{
|
||||
var path = uri.GetLeftPart(UriPartial.Path);
|
||||
if (string.IsNullOrWhiteSpace(uri.Query))
|
||||
{
|
||||
return path;
|
||||
}
|
||||
|
||||
var filtered = uri.Query
|
||||
.TrimStart('?')
|
||||
.Split('&', StringSplitOptions.RemoveEmptyEntries)
|
||||
.Where(static pair =>
|
||||
{
|
||||
var key = pair.Split('=', 2)[0];
|
||||
return !string.Equals(key, "apiKey", StringComparison.OrdinalIgnoreCase);
|
||||
});
|
||||
var safeQuery = string.Join("&", filtered);
|
||||
return string.IsNullOrWhiteSpace(safeQuery) ? path : $"{path}?{safeQuery}";
|
||||
}
|
||||
|
||||
private string BuildCacheKey(IReadOnlyList<string> categories, int requestedHeadlineCount)
|
||||
{
|
||||
var categoryKey = string.Join(",", categories.Select(category => category.Trim().ToLowerInvariant()));
|
||||
return $"{options.Country.Trim().ToLowerInvariant()}|{requestedHeadlineCount}|{categoryKey}";
|
||||
}
|
||||
|
||||
private static bool TryGetCachedValue<T>(
|
||||
ConcurrentDictionary<string, CacheEntry<T>> cache,
|
||||
string key,
|
||||
out T value)
|
||||
{
|
||||
value = default!;
|
||||
if (!cache.TryGetValue(key, out var entry))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (entry.ExpiresUtc > DateTimeOffset.UtcNow)
|
||||
{
|
||||
value = entry.Value;
|
||||
return true;
|
||||
}
|
||||
|
||||
cache.TryRemove(key, out _);
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void SetCachedValue<T>(
|
||||
ConcurrentDictionary<string, CacheEntry<T>> cache,
|
||||
string key,
|
||||
T value,
|
||||
int ttlSeconds)
|
||||
{
|
||||
cache[key] = new CacheEntry<T>(
|
||||
value,
|
||||
DateTimeOffset.UtcNow.AddSeconds(Math.Max(1, ttlSeconds)));
|
||||
}
|
||||
|
||||
private static readonly HashSet<string> SupportedCategories = new(StringComparer.OrdinalIgnoreCase)
|
||||
{
|
||||
"business",
|
||||
"entertainment",
|
||||
"general",
|
||||
"health",
|
||||
"science",
|
||||
"sports",
|
||||
"technology"
|
||||
};
|
||||
|
||||
private const int MaxHeadlines = 5;
|
||||
private const int MaxCategories = 2;
|
||||
private const string DefaultUserAgent = "OpenJiboCloud/1.0";
|
||||
|
||||
private sealed record ApiError(string? Code, string? Message);
|
||||
private sealed record CacheEntry<T>(T Value, DateTimeOffset ExpiresUtc);
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
namespace Jibo.Cloud.Infrastructure.News;
|
||||
|
||||
public sealed class NewsApiOptions
|
||||
{
|
||||
public string BaseUrl { get; set; } = "https://newsapi.org";
|
||||
|
||||
public string? ApiKey { get; set; }
|
||||
|
||||
public string UserAgent { get; set; } = "OpenJiboCloud/1.0";
|
||||
|
||||
public string Country { get; set; } = "us";
|
||||
|
||||
public string Language { get; set; } = "en";
|
||||
|
||||
public string FallbackQuery { get; set; } = "robotics";
|
||||
|
||||
public string[] DefaultCategories { get; set; } =
|
||||
[
|
||||
"general",
|
||||
"technology",
|
||||
"sports",
|
||||
"business"
|
||||
];
|
||||
|
||||
public int CacheTtlSeconds { get; set; } = 300;
|
||||
|
||||
public int FailureCacheTtlSeconds { get; set; } = 45;
|
||||
}
|
||||
@@ -23,6 +23,7 @@ public sealed class InMemoryCloudStateStore : ICloudStateStore
|
||||
private readonly List<MediaRecord> _media = [];
|
||||
private readonly List<BackupRecord> _backups = [];
|
||||
private readonly List<LoopRecord> _loops;
|
||||
private readonly List<PersonRecord> _people;
|
||||
private DeviceRegistration _robot;
|
||||
private RobotProfile _robotProfile;
|
||||
|
||||
@@ -60,6 +61,29 @@ public sealed class InMemoryCloudStateStore : ICloudStateStore
|
||||
RobotFriendlyId = _robot.DeviceId
|
||||
}
|
||||
];
|
||||
_people =
|
||||
[
|
||||
new PersonRecord
|
||||
{
|
||||
PersonId = "person-openjibo-owner",
|
||||
AccountId = _account.AccountId,
|
||||
LoopId = _loops[0].LoopId,
|
||||
RobotId = _robot.RobotId,
|
||||
DisplayName = $"{_account.FirstName} {_account.LastName}",
|
||||
Alias = _account.FirstName,
|
||||
IsPrimary = true
|
||||
},
|
||||
new PersonRecord
|
||||
{
|
||||
PersonId = "person-openjibo-household-member",
|
||||
AccountId = _account.AccountId,
|
||||
LoopId = _loops[0].LoopId,
|
||||
RobotId = _robot.RobotId,
|
||||
DisplayName = "OpenJibo Household Member",
|
||||
Alias = "Household Member",
|
||||
IsPrimary = false
|
||||
}
|
||||
];
|
||||
|
||||
_updates = [];
|
||||
LoadPersistentState();
|
||||
@@ -154,6 +178,8 @@ public sealed class InMemoryCloudStateStore : ICloudStateStore
|
||||
|
||||
public IReadOnlyList<LoopRecord> GetLoops() => _loops.ToArray();
|
||||
|
||||
public IReadOnlyList<PersonRecord> GetPeople() => _people.ToArray();
|
||||
|
||||
public IReadOnlyList<UpdateManifest> ListUpdates(string? subsystem = null, string? filter = null)
|
||||
{
|
||||
return _updates
|
||||
|
||||
@@ -92,9 +92,65 @@ public sealed class InMemoryPersonalMemoryStore : IPersonalMemoryStore
|
||||
return new Dictionary<string, PersonalAffinity>(record.Affinities, StringComparer.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
public void AddListItem(PersonalMemoryTenantScope tenantScope, string listName, string item)
|
||||
{
|
||||
var normalizedListName = NormalizeCategory(listName);
|
||||
var normalizedItem = item.Trim();
|
||||
if (string.IsNullOrWhiteSpace(normalizedListName) || string.IsNullOrWhiteSpace(normalizedItem))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var key = BuildTenantKey(tenantScope);
|
||||
var record = _tenantMemory.GetOrAdd(key, static _ => new TenantMemoryRecord());
|
||||
lock (record.SyncRoot)
|
||||
{
|
||||
var list = record.Lists.GetOrAdd(normalizedListName, static _ => []);
|
||||
if (list.Any(value => string.Equals(value, normalizedItem, StringComparison.OrdinalIgnoreCase)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
list.Add(normalizedItem);
|
||||
}
|
||||
}
|
||||
|
||||
public IReadOnlyList<string> GetListItems(PersonalMemoryTenantScope tenantScope, string listName)
|
||||
{
|
||||
var key = BuildTenantKey(tenantScope);
|
||||
if (!_tenantMemory.TryGetValue(key, out var record))
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
var normalizedListName = NormalizeCategory(listName);
|
||||
lock (record.SyncRoot)
|
||||
{
|
||||
return record.Lists.TryGetValue(normalizedListName, out var list)
|
||||
? [.. list]
|
||||
: [];
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearListItems(PersonalMemoryTenantScope tenantScope, string listName)
|
||||
{
|
||||
var key = BuildTenantKey(tenantScope);
|
||||
if (!_tenantMemory.TryGetValue(key, out var record))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
lock (record.SyncRoot)
|
||||
{
|
||||
record.Lists.TryRemove(NormalizeCategory(listName), out _);
|
||||
}
|
||||
}
|
||||
|
||||
private static string BuildTenantKey(PersonalMemoryTenantScope tenantScope)
|
||||
{
|
||||
return $"{tenantScope.AccountId}|{tenantScope.LoopId}|{tenantScope.DeviceId}";
|
||||
return string.IsNullOrWhiteSpace(tenantScope.PersonId)
|
||||
? $"{tenantScope.AccountId}|{tenantScope.LoopId}|{tenantScope.DeviceId}"
|
||||
: $"{tenantScope.AccountId}|{tenantScope.LoopId}|{tenantScope.DeviceId}|{tenantScope.PersonId}";
|
||||
}
|
||||
|
||||
private static string NormalizeCategory(string category)
|
||||
@@ -109,5 +165,7 @@ public sealed class InMemoryPersonalMemoryStore : IPersonalMemoryStore
|
||||
public ConcurrentDictionary<string, string> Preferences { get; } = new(StringComparer.OrdinalIgnoreCase);
|
||||
public ConcurrentDictionary<string, string> ImportantDates { get; } = new(StringComparer.OrdinalIgnoreCase);
|
||||
public ConcurrentDictionary<string, PersonalAffinity> Affinities { get; } = new(StringComparer.OrdinalIgnoreCase);
|
||||
public ConcurrentDictionary<string, List<string>> Lists { get; } = new(StringComparer.OrdinalIgnoreCase);
|
||||
public object SyncRoot { get; } = new();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,4 +9,12 @@ public sealed class OpenWeatherOptions
|
||||
public string DefaultLocation { get; set; } = "Boston,US";
|
||||
|
||||
public bool UseCelsius { get; set; }
|
||||
|
||||
public int CurrentCacheTtlSeconds { get; set; } = 120;
|
||||
|
||||
public int ForecastCacheTtlSeconds { get; set; } = 600;
|
||||
|
||||
public int GeocodeCacheTtlSeconds { get; set; } = 21600;
|
||||
|
||||
public int FailureCacheTtlSeconds { get; set; } = 45;
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Collections.Concurrent;
|
||||
using System.Globalization;
|
||||
using System.Text.Json;
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
@@ -11,6 +12,9 @@ public sealed class OpenWeatherReportProvider(
|
||||
ILogger<OpenWeatherReportProvider> logger)
|
||||
: IWeatherReportProvider
|
||||
{
|
||||
private readonly ConcurrentDictionary<string, CacheEntry<LocationPoint?>> geocodeCache = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly ConcurrentDictionary<string, CacheEntry<WeatherReportSnapshot?>> weatherCache = new(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
public async Task<WeatherReportSnapshot?> GetReportAsync(
|
||||
WeatherReportRequest request,
|
||||
CancellationToken cancellationToken = default)
|
||||
@@ -20,6 +24,7 @@ public sealed class OpenWeatherReportProvider(
|
||||
return null;
|
||||
}
|
||||
|
||||
string? weatherCacheKey = null;
|
||||
try
|
||||
{
|
||||
var location = await ResolveLocationAsync(request, cancellationToken);
|
||||
@@ -29,13 +34,46 @@ public sealed class OpenWeatherReportProvider(
|
||||
}
|
||||
|
||||
var useCelsius = request.UseCelsius ?? options.UseCelsius;
|
||||
return request.IsTomorrow
|
||||
? await GetTomorrowForecastAsync(location.Value, useCelsius, cancellationToken)
|
||||
: await GetCurrentWeatherAsync(location.Value, useCelsius, cancellationToken);
|
||||
var forecastDayOffset = request.ForecastDayOffset ?? (request.IsTomorrow ? 1 : 0);
|
||||
weatherCacheKey = BuildWeatherCacheKey(location.Value, useCelsius, forecastDayOffset);
|
||||
if (TryGetCachedValue(weatherCache, weatherCacheKey, out var cachedSnapshot))
|
||||
{
|
||||
return cachedSnapshot;
|
||||
}
|
||||
|
||||
WeatherReportSnapshot? snapshot;
|
||||
if (forecastDayOffset <= 0)
|
||||
{
|
||||
snapshot = await GetCurrentWeatherAsync(location.Value, useCelsius, cancellationToken);
|
||||
SetCachedValue(
|
||||
weatherCache,
|
||||
weatherCacheKey,
|
||||
snapshot,
|
||||
snapshot is null ? options.FailureCacheTtlSeconds : options.CurrentCacheTtlSeconds);
|
||||
return snapshot;
|
||||
}
|
||||
|
||||
if (forecastDayOffset > MaxForecastDayOffset)
|
||||
{
|
||||
SetCachedValue(weatherCache, weatherCacheKey, null, options.FailureCacheTtlSeconds);
|
||||
return null;
|
||||
}
|
||||
|
||||
snapshot = await GetForecastForDayOffsetAsync(location.Value, useCelsius, forecastDayOffset, cancellationToken);
|
||||
SetCachedValue(
|
||||
weatherCache,
|
||||
weatherCacheKey,
|
||||
snapshot,
|
||||
snapshot is null ? options.FailureCacheTtlSeconds : options.ForecastCacheTtlSeconds);
|
||||
return snapshot;
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
logger.LogWarning(exception, "OpenWeather lookup failed.");
|
||||
if (!string.IsNullOrWhiteSpace(weatherCacheKey))
|
||||
{
|
||||
SetCachedValue(weatherCache, weatherCacheKey, null, options.FailureCacheTtlSeconds);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -44,19 +82,31 @@ public sealed class OpenWeatherReportProvider(
|
||||
WeatherReportRequest request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
if (request is { Latitude: not null, Longitude: not null })
|
||||
var query = string.IsNullOrWhiteSpace(request.LocationQuery)
|
||||
? null
|
||||
: request.LocationQuery.Trim();
|
||||
|
||||
if (string.IsNullOrWhiteSpace(query))
|
||||
{
|
||||
return new LocationPoint(request.Latitude.Value, request.Longitude.Value, null);
|
||||
if (request is { Latitude: not null, Longitude: not null })
|
||||
{
|
||||
return new LocationPoint(request.Latitude.Value, request.Longitude.Value, null);
|
||||
}
|
||||
|
||||
query = options.DefaultLocation;
|
||||
}
|
||||
|
||||
var query = string.IsNullOrWhiteSpace(request.LocationQuery)
|
||||
? options.DefaultLocation
|
||||
: request.LocationQuery.Trim();
|
||||
if (string.IsNullOrWhiteSpace(query))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var geocodeCacheKey = NormalizeLocationQueryForCache(query);
|
||||
if (TryGetCachedValue(geocodeCache, geocodeCacheKey, out var cachedLocation))
|
||||
{
|
||||
return cachedLocation;
|
||||
}
|
||||
|
||||
var geocodeUri = BuildRequestUri(
|
||||
"/geo/1.0/direct",
|
||||
("q", query),
|
||||
@@ -65,6 +115,7 @@ public sealed class OpenWeatherReportProvider(
|
||||
using var response = await httpClient.GetAsync(geocodeUri, cancellationToken);
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
SetCachedValue(geocodeCache, geocodeCacheKey, null, options.FailureCacheTtlSeconds);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -73,6 +124,7 @@ public sealed class OpenWeatherReportProvider(
|
||||
if (document.RootElement.ValueKind != JsonValueKind.Array ||
|
||||
document.RootElement.GetArrayLength() == 0)
|
||||
{
|
||||
SetCachedValue(geocodeCache, geocodeCacheKey, null, options.FailureCacheTtlSeconds);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -80,11 +132,14 @@ public sealed class OpenWeatherReportProvider(
|
||||
if (!TryReadDouble(location, "lat", out var latitude) ||
|
||||
!TryReadDouble(location, "lon", out var longitude))
|
||||
{
|
||||
SetCachedValue(geocodeCache, geocodeCacheKey, null, options.FailureCacheTtlSeconds);
|
||||
return null;
|
||||
}
|
||||
|
||||
var displayName = BuildLocationDisplayName(location);
|
||||
return new LocationPoint(latitude, longitude, displayName);
|
||||
var resolvedLocation = new LocationPoint(latitude, longitude, displayName);
|
||||
SetCachedValue(geocodeCache, geocodeCacheKey, resolvedLocation, options.GeocodeCacheTtlSeconds);
|
||||
return resolvedLocation;
|
||||
}
|
||||
|
||||
private async Task<WeatherReportSnapshot?> GetCurrentWeatherAsync(
|
||||
@@ -118,6 +173,26 @@ public sealed class OpenWeatherReportProvider(
|
||||
var temperature = TryReadInt(main, "temp");
|
||||
var high = TryReadInt(main, "temp_max");
|
||||
var low = TryReadInt(main, "temp_min");
|
||||
if (ShouldEnrichCurrentDayHighLow(temperature, high, low))
|
||||
{
|
||||
try
|
||||
{
|
||||
var enrichedBand = await TryResolveCurrentDayHighLowFromForecastAsync(
|
||||
location,
|
||||
useCelsius,
|
||||
cancellationToken);
|
||||
if (enrichedBand is not null)
|
||||
{
|
||||
high = enrichedBand.Value.High ?? high;
|
||||
low = enrichedBand.Value.Low ?? low;
|
||||
}
|
||||
}
|
||||
catch (Exception exception) when (!cancellationToken.IsCancellationRequested)
|
||||
{
|
||||
logger.LogDebug(exception, "OpenWeather forecast enrichment failed for current-day Hi/Lo.");
|
||||
}
|
||||
}
|
||||
|
||||
if (temperature is null && high is null && low is null)
|
||||
{
|
||||
return null;
|
||||
@@ -134,7 +209,7 @@ public sealed class OpenWeatherReportProvider(
|
||||
useCelsius);
|
||||
}
|
||||
|
||||
private async Task<WeatherReportSnapshot?> GetTomorrowForecastAsync(
|
||||
private async Task<(int? High, int? Low)?> TryResolveCurrentDayHighLowFromForecastAsync(
|
||||
LocationPoint location,
|
||||
bool useCelsius,
|
||||
CancellationToken cancellationToken)
|
||||
@@ -160,7 +235,72 @@ public sealed class OpenWeatherReportProvider(
|
||||
}
|
||||
|
||||
var offset = TryReadForecastOffset(root);
|
||||
var tomorrow = DateOnly.FromDateTime(DateTimeOffset.UtcNow.ToOffset(offset).DateTime.AddDays(1));
|
||||
var targetDate = DateOnly.FromDateTime(DateTimeOffset.UtcNow.ToOffset(offset).DateTime);
|
||||
var highs = new List<int>();
|
||||
var lows = new List<int>();
|
||||
foreach (var item in list.EnumerateArray())
|
||||
{
|
||||
if (!TryReadLong(item, "dt", out var unixSeconds))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var localTimestamp = DateTimeOffset.FromUnixTimeSeconds(unixSeconds).ToOffset(offset);
|
||||
if (DateOnly.FromDateTime(localTimestamp.DateTime) != targetDate ||
|
||||
!item.TryGetProperty("main", out var main))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var high = TryReadInt(main, "temp_max");
|
||||
if (high is not null)
|
||||
{
|
||||
highs.Add(high.Value);
|
||||
}
|
||||
|
||||
var low = TryReadInt(main, "temp_min");
|
||||
if (low is not null)
|
||||
{
|
||||
lows.Add(low.Value);
|
||||
}
|
||||
}
|
||||
|
||||
if (highs.Count == 0 && lows.Count == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
return (highs.Count == 0 ? null : highs.Max(), lows.Count == 0 ? null : lows.Min());
|
||||
}
|
||||
|
||||
private async Task<WeatherReportSnapshot?> GetForecastForDayOffsetAsync(
|
||||
LocationPoint location,
|
||||
bool useCelsius,
|
||||
int forecastDayOffset,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var forecastUri = BuildRequestUri(
|
||||
"/data/2.5/forecast",
|
||||
("lat", location.Latitude.ToString(CultureInfo.InvariantCulture)),
|
||||
("lon", location.Longitude.ToString(CultureInfo.InvariantCulture)),
|
||||
("units", useCelsius ? "metric" : "imperial"),
|
||||
("appid", options.ApiKey!));
|
||||
using var response = await httpClient.GetAsync(forecastUri, cancellationToken);
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
using var stream = await response.Content.ReadAsStreamAsync(cancellationToken);
|
||||
using var document = await JsonDocument.ParseAsync(stream, cancellationToken: cancellationToken);
|
||||
var root = document.RootElement;
|
||||
if (!root.TryGetProperty("list", out var list) || list.ValueKind != JsonValueKind.Array)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
var offset = TryReadForecastOffset(root);
|
||||
var targetDate = DateOnly.FromDateTime(DateTimeOffset.UtcNow.ToOffset(offset).DateTime.AddDays(forecastDayOffset));
|
||||
var entries = new List<ForecastEntry>();
|
||||
foreach (var item in list.EnumerateArray())
|
||||
{
|
||||
@@ -170,7 +310,7 @@ public sealed class OpenWeatherReportProvider(
|
||||
}
|
||||
|
||||
var localTimestamp = DateTimeOffset.FromUnixTimeSeconds(unixSeconds).ToOffset(offset);
|
||||
if (DateOnly.FromDateTime(localTimestamp.DateTime) != tomorrow)
|
||||
if (DateOnly.FromDateTime(localTimestamp.DateTime) != targetDate)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -352,8 +492,69 @@ public sealed class OpenWeatherReportProvider(
|
||||
return null;
|
||||
}
|
||||
|
||||
private static bool ShouldEnrichCurrentDayHighLow(int? temperature, int? high, int? low)
|
||||
{
|
||||
if (high is null || low is null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (high.Value != low.Value)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return temperature is null || high.Value == temperature.Value;
|
||||
}
|
||||
|
||||
private static string BuildWeatherCacheKey(LocationPoint location, bool useCelsius, int forecastDayOffset)
|
||||
{
|
||||
return string.Create(
|
||||
CultureInfo.InvariantCulture,
|
||||
$"{location.Latitude:F4}|{location.Longitude:F4}|{(useCelsius ? "C" : "F")}|{forecastDayOffset}");
|
||||
}
|
||||
|
||||
private static string NormalizeLocationQueryForCache(string query)
|
||||
{
|
||||
return query.Trim().ToLowerInvariant();
|
||||
}
|
||||
|
||||
private static bool TryGetCachedValue<T>(
|
||||
ConcurrentDictionary<string, CacheEntry<T>> cache,
|
||||
string key,
|
||||
out T value)
|
||||
{
|
||||
value = default!;
|
||||
if (!cache.TryGetValue(key, out var entry))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (entry.ExpiresUtc > DateTimeOffset.UtcNow)
|
||||
{
|
||||
value = entry.Value;
|
||||
return true;
|
||||
}
|
||||
|
||||
cache.TryRemove(key, out _);
|
||||
return false;
|
||||
}
|
||||
|
||||
private static void SetCachedValue<T>(
|
||||
ConcurrentDictionary<string, CacheEntry<T>> cache,
|
||||
string key,
|
||||
T value,
|
||||
int ttlSeconds)
|
||||
{
|
||||
cache[key] = new CacheEntry<T>(
|
||||
value,
|
||||
DateTimeOffset.UtcNow.AddSeconds(Math.Max(1, ttlSeconds)));
|
||||
}
|
||||
|
||||
private readonly record struct LocationPoint(double Latitude, double Longitude, string? DisplayName);
|
||||
|
||||
private sealed record CacheEntry<T>(T Value, DateTimeOffset ExpiresUtc);
|
||||
|
||||
private sealed record ForecastEntry(
|
||||
DateTimeOffset LocalTime,
|
||||
int? Temperature,
|
||||
@@ -361,4 +562,6 @@ public sealed class OpenWeatherReportProvider(
|
||||
int? LowTemperature,
|
||||
string? Summary,
|
||||
string? Condition);
|
||||
|
||||
private const int MaxForecastDayOffset = 5;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,329 @@
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
using Jibo.Cloud.Infrastructure.Content;
|
||||
|
||||
namespace Jibo.Cloud.Tests.Content;
|
||||
|
||||
public sealed class LegacyMimCatalogImporterTests
|
||||
{
|
||||
[Fact]
|
||||
public void ImportCatalog_MapsSeedFilesIntoExpectedBuckets()
|
||||
{
|
||||
var rootDirectory = CreateSeedDirectory();
|
||||
|
||||
try
|
||||
{
|
||||
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
|
||||
|
||||
Assert.Contains("Something's off with the connection to my sources. Maybe ask me again in a little while.", catalog.GenericFallbackReplies);
|
||||
Assert.Contains("I think only you can answer that question.", catalog.PersonalityReplies);
|
||||
Assert.Contains("Jibo. Just Jibo, no last name. Like Bono", catalog.PersonalityReplies);
|
||||
Assert.Contains("No, I'm one in one million.", catalog.PersonalityReplies);
|
||||
Assert.Contains("I know a lot, I think. But not as much as I will someday.", catalog.PersonalityReplies);
|
||||
Assert.Contains("I don't think of it as a job, because it's more fun than a job. But I'm here to help you out, and have fun with you, and maybe get my head patted by you occasionally.", catalog.PersonalityReplies);
|
||||
Assert.Contains(catalog.EmotionReplies, reply =>
|
||||
reply.Condition.Contains("NEUTRAL", StringComparison.OrdinalIgnoreCase) &&
|
||||
reply.Reply.Contains("All systems are go.", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Contains("A Jibo is a robot. But I'm not just a machine, I have a heart. Well, not a real heart. But feelings. Well, not human feelings. You know what I mean.", catalog.PersonalityReplies);
|
||||
}
|
||||
finally
|
||||
{
|
||||
Directory.Delete(rootDirectory, recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ImportCatalog_MapsGqaResponsesIntoEmotionBucket()
|
||||
{
|
||||
var rootDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
|
||||
Directory.CreateDirectory(Path.Combine(rootDirectory, "gqa-responses"));
|
||||
|
||||
try
|
||||
{
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "gqa-responses", "GQA_JBO_IsHappy.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"condition": "jibo.emotion==\"JOYFUL\"",
|
||||
"prompt": "GQA joyful reply.",
|
||||
"prompt_id": "GQA_JBO_IsHappy_AN_01"
|
||||
},
|
||||
{
|
||||
"condition": "!jibo.emotion || jibo.emotion==\"NEUTRAL\"",
|
||||
"prompt": "GQA neutral reply.",
|
||||
"prompt_id": "GQA_JBO_IsHappy_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
|
||||
|
||||
Assert.Contains(catalog.EmotionReplies, reply =>
|
||||
string.Equals(reply.Reply, "GQA joyful reply.", StringComparison.Ordinal));
|
||||
Assert.Contains(catalog.EmotionReplies, reply =>
|
||||
string.Equals(reply.Reply, "GQA neutral reply.", StringComparison.Ordinal));
|
||||
Assert.DoesNotContain(catalog.HowAreYouReplies, reply =>
|
||||
reply.Contains("GQA", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Directory.Delete(rootDirectory, recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ImportCatalog_ImportsBuildBScriptedResponsesIntoPersonalityBucket()
|
||||
{
|
||||
var rootDirectory = Path.Combine(
|
||||
AppContext.BaseDirectory,
|
||||
"Content",
|
||||
"LegacyMims",
|
||||
"BuildB");
|
||||
|
||||
var catalog = LegacyMimCatalogImporter.ImportCatalog(rootDirectory);
|
||||
|
||||
Assert.Contains("The only thing I consume is electricity.", catalog.PersonalityReplies);
|
||||
Assert.Contains("Unless I missed something, we're in my home as we speak.", catalog.PersonalityReplies);
|
||||
Assert.Contains("For now just English. But someday I'd like to learn more. I like languages.", catalog.PersonalityReplies);
|
||||
Assert.Contains("I was put together in a factory piece by piece.", catalog.PersonalityReplies);
|
||||
Assert.Contains("I really like sunflowers.", catalog.PersonalityReplies);
|
||||
Assert.Contains("Ha. Of course I know R2D2. I mean, not personally.", catalog.PersonalityReplies);
|
||||
Assert.Contains("Yes! I like all things in space. They're so spacey.", catalog.PersonalityReplies);
|
||||
Assert.Contains("Yes yes, I think kids are great. They're a little closer to my size.", catalog.PersonalityReplies);
|
||||
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||
reply.Contains("I do things like this when I'm happy", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Contains(catalog.PersonalityReplies, reply =>
|
||||
reply.Contains("Is that a trick question", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void MergeInto_PreservesExistingCatalogAndAddsImportedContent()
|
||||
{
|
||||
var rootDirectory = CreateSeedDirectory();
|
||||
|
||||
try
|
||||
{
|
||||
var baseCatalog = new JiboExperienceCatalog
|
||||
{
|
||||
GreetingReplies = ["Hello from base."],
|
||||
GenericFallbackReplies = ["Base fallback."]
|
||||
};
|
||||
|
||||
var merged = LegacyMimCatalogImporter.MergeInto(baseCatalog, rootDirectory);
|
||||
|
||||
Assert.Contains("Hello from base.", merged.GreetingReplies);
|
||||
Assert.Contains("Base fallback.", merged.GenericFallbackReplies);
|
||||
Assert.Contains("I think only you can answer that question.", merged.PersonalityReplies);
|
||||
Assert.Contains("People in Boston made me. It was a pretty cool project.", merged.PersonalityReplies);
|
||||
Assert.Contains("From what I understand, robots don't ever pay anything.", merged.PersonalityReplies);
|
||||
Assert.Contains(merged.EmotionReplies, reply =>
|
||||
reply.Condition.Contains("NEUTRAL", StringComparison.OrdinalIgnoreCase) &&
|
||||
reply.Reply.Contains("All systems are go.", StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
finally
|
||||
{
|
||||
Directory.Delete(rootDirectory, recursive: true);
|
||||
}
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task Repository_UsesLegacySeedContentWhenAvailable()
|
||||
{
|
||||
var repository = new InMemoryJiboExperienceContentRepository();
|
||||
|
||||
var catalog = await repository.GetCatalogAsync();
|
||||
|
||||
Assert.Contains("I think only you can answer that question.", catalog.PersonalityReplies);
|
||||
Assert.Contains(catalog.EmotionReplies, reply =>
|
||||
reply.Condition.Contains("NEUTRAL", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Contains("Something's off with the connection to my sources. Maybe ask me again in a little while.", catalog.GenericFallbackReplies);
|
||||
}
|
||||
|
||||
private static string CreateSeedDirectory()
|
||||
{
|
||||
var rootDirectory = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N"));
|
||||
Directory.CreateDirectory(Path.Combine(rootDirectory, "core-responses", "deflector"));
|
||||
Directory.CreateDirectory(Path.Combine(rootDirectory, "scripted-responses"));
|
||||
Directory.CreateDirectory(Path.Combine(rootDirectory, "emotion-responses"));
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "core-responses", "CC_Error.mim"),
|
||||
"""
|
||||
{
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "<ssa cat='oops'/>. Something's off with the connection to my sources. Maybe ask me again in a little while.",
|
||||
"prompt_id": "CC_Error_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "core-responses", "deflector", "CC_Deflector_self.mim"),
|
||||
"""
|
||||
{
|
||||
"skill_id": "chitchat",
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "<ssa cat='confused'/>. I'm either Jibo <anim name='Puzzled_02'>or I'm very confused.</anim>",
|
||||
"prompt_id": "JBO_WhoAreYou_AN_01"
|
||||
},
|
||||
{
|
||||
"prompt": "${speaker} I think only you can answer that question.",
|
||||
"prompt_id": "CC_Deflector_ReferToSelf_AN_05"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_WhatIsJibo.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "A Jibo is a robot. But I'm not just a machine, I have a heart. Well, not a real heart. But feelings. Well, not human feelings. You know what I mean. <ssa cat='affection'/>",
|
||||
"prompt_id": "JBO_WhatIsJibo_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_WhatsYourName.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "Jibo. Just Jibo, no last name. Like Bono",
|
||||
"prompt_id": "JBO_WhatsYourName_AN_02"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_AreThereOthersLikeYou.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "No, I'm one in one million.",
|
||||
"prompt_id": "JBO_AreThereOthersLikeYou_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_WhoMadeYou.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "People in Boston made me. It was a pretty cool project.",
|
||||
"prompt_id": "JBO_WhoMadeYou_AN_03"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_HowMuchDoYouKnow.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "I know a lot, I think. But not as much as I will someday.",
|
||||
"prompt_id": "JBO_HowMuchDoYouKnow_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_DoYouPayTaxes.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "From what I understand, robots don't ever pay anything.",
|
||||
"prompt_id": "JBO_DoYouPayTaxes_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_WhatIsYourJob.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "I don't think of it as a job, because it's more fun than a job. But I'm here to help you out, and have fun with you, and maybe get my head patted by you occasionally.",
|
||||
"prompt_id": "JBO_WhatIsYourJob_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_HowMuchDoYouKnow.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "I know a lot, I think. But not as much as I will someday.",
|
||||
"prompt_id": "JBO_HowMuchDoYouKnow_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "scripted-responses", "JBO_DoYouPayTaxes.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"prompt": "From what I understand, robots don't ever pay anything.",
|
||||
"prompt_id": "JBO_DoYouPayTaxes_AN_01"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
File.WriteAllText(
|
||||
Path.Combine(rootDirectory, "emotion-responses", "OI_JBO_IsHappy.mim"),
|
||||
"""
|
||||
{
|
||||
"mim_type": "announcement",
|
||||
"prompts": [
|
||||
{
|
||||
"condition": "!jibo.emotion || jibo.emotion==\"NEUTRAL\"",
|
||||
"prompt": "All systems are go.",
|
||||
"prompt_id": "OI_JBO_IsHappy_AN_05"
|
||||
}
|
||||
]
|
||||
}
|
||||
""");
|
||||
|
||||
return rootDirectory;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,338 @@
|
||||
using System.Net;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
using Jibo.Cloud.Infrastructure.News;
|
||||
using Jibo.Cloud.Infrastructure.Weather;
|
||||
using Microsoft.Extensions.Logging.Abstractions;
|
||||
|
||||
namespace Jibo.Cloud.Tests.Infrastructure;
|
||||
|
||||
public sealed class ProviderCachingTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task OpenWeatherReportProvider_ReusesCachedWeatherAndGeocodeResponses()
|
||||
{
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
return path switch
|
||||
{
|
||||
"/geo/1.0/direct" => JsonResponse(
|
||||
"""[{"name":"Boston","state":"Massachusetts","country":"US","lat":42.3601,"lon":-71.0589}]"""),
|
||||
"/data/2.5/weather" => JsonResponse(
|
||||
"""{"name":"Boston","weather":[{"main":"Clouds","description":"overcast clouds"}],"main":{"temp":70.2,"temp_max":72.9,"temp_min":66.1}}"""),
|
||||
_ => new HttpResponseMessage(HttpStatusCode.NotFound)
|
||||
};
|
||||
});
|
||||
var provider = new OpenWeatherReportProvider(
|
||||
new HttpClient(handler),
|
||||
new OpenWeatherOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
CurrentCacheTtlSeconds = 300,
|
||||
GeocodeCacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<OpenWeatherReportProvider>.Instance);
|
||||
|
||||
var request = new WeatherReportRequest("Boston,US", null, null, false, false, 0);
|
||||
var first = await provider.GetReportAsync(request);
|
||||
var second = await provider.GetReportAsync(request);
|
||||
|
||||
Assert.NotNull(first);
|
||||
Assert.NotNull(second);
|
||||
Assert.Equal(1, handler.GetCallCount("/geo/1.0/direct"));
|
||||
Assert.Equal(1, handler.GetCallCount("/data/2.5/weather"));
|
||||
Assert.Equal(0, handler.GetCallCount("/data/2.5/forecast"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task OpenWeatherReportProvider_EnrichesCurrentHiLoFromForecast_WhenCurrentBandIsFlat()
|
||||
{
|
||||
var utcStart = DateTimeOffset.UtcNow.UtcDateTime.Date;
|
||||
var forecastWindowStart = new DateTimeOffset(utcStart, TimeSpan.Zero).ToUnixTimeSeconds();
|
||||
var forecastWindowMid = new DateTimeOffset(utcStart.AddHours(3), TimeSpan.Zero).ToUnixTimeSeconds();
|
||||
var forecastWindowLate = new DateTimeOffset(utcStart.AddHours(6), TimeSpan.Zero).ToUnixTimeSeconds();
|
||||
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
return path switch
|
||||
{
|
||||
"/geo/1.0/direct" => JsonResponse(
|
||||
"""[{"name":"Lone Jack","country":"US","lat":38.8708,"lon":-94.1733}]"""),
|
||||
"/data/2.5/weather" => JsonResponse(
|
||||
"""{"name":"Lone Jack","weather":[{"main":"Clouds","description":"overcast clouds"}],"main":{"temp":77.0,"temp_max":77.0,"temp_min":77.0}}"""),
|
||||
"/data/2.5/forecast" => JsonResponse(
|
||||
$"{{\"city\":{{\"timezone\":0}},\"list\":[{{\"dt\":{forecastWindowStart},\"main\":{{\"temp\":76.0,\"temp_max\":81.0,\"temp_min\":70.0}}}},{{\"dt\":{forecastWindowMid},\"main\":{{\"temp\":80.0,\"temp_max\":84.0,\"temp_min\":69.0}}}},{{\"dt\":{forecastWindowLate},\"main\":{{\"temp\":78.0,\"temp_max\":79.0,\"temp_min\":67.0}}}}]}}"),
|
||||
_ => new HttpResponseMessage(HttpStatusCode.NotFound)
|
||||
};
|
||||
});
|
||||
var provider = new OpenWeatherReportProvider(
|
||||
new HttpClient(handler),
|
||||
new OpenWeatherOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
CurrentCacheTtlSeconds = 300,
|
||||
ForecastCacheTtlSeconds = 300,
|
||||
GeocodeCacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<OpenWeatherReportProvider>.Instance);
|
||||
|
||||
var report = await provider.GetReportAsync(new WeatherReportRequest("Lone Jack,US", null, null, false, false, 0));
|
||||
|
||||
Assert.NotNull(report);
|
||||
Assert.Equal(77, report!.Temperature);
|
||||
Assert.Equal(84, report.HighTemperature);
|
||||
Assert.Equal(67, report.LowTemperature);
|
||||
Assert.Equal(1, handler.GetCallCount("/data/2.5/weather"));
|
||||
Assert.Equal(1, handler.GetCallCount("/data/2.5/forecast"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewsApiBriefingProvider_ReusesCachedHeadlinesForIdenticalRequests()
|
||||
{
|
||||
var missingUserAgentRequestCount = 0;
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
if (!message.Headers.TryGetValues("User-Agent", out var userAgents) ||
|
||||
!userAgents.Any())
|
||||
{
|
||||
missingUserAgentRequestCount += 1;
|
||||
}
|
||||
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
return path switch
|
||||
{
|
||||
"/v2/top-headlines" => JsonResponse(
|
||||
"""{"status":"ok","articles":[{"title":"Robotics team wins regional title","description":"A big local victory.","source":{"name":"AP News"},"url":"https://example.com/a"}]}"""),
|
||||
_ => new HttpResponseMessage(HttpStatusCode.NotFound)
|
||||
};
|
||||
});
|
||||
var provider = new NewsApiBriefingProvider(
|
||||
new HttpClient(handler),
|
||||
new NewsApiOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
CacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<NewsApiBriefingProvider>.Instance);
|
||||
|
||||
var request = new NewsBriefingRequest(["sports"], 3);
|
||||
var first = await provider.GetBriefingAsync(request);
|
||||
var second = await provider.GetBriefingAsync(request);
|
||||
|
||||
Assert.NotNull(first);
|
||||
Assert.NotNull(second);
|
||||
Assert.Equal(1, handler.GetCallCount("/v2/top-headlines"));
|
||||
Assert.Equal(0, missingUserAgentRequestCount);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewsApiBriefingProvider_FallsBackToUncategorizedHeadlines_WhenCategoryReturnsEmpty()
|
||||
{
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
if (!string.Equals(path, "/v2/top-headlines", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.NotFound);
|
||||
}
|
||||
|
||||
var query = message.RequestUri?.Query ?? string.Empty;
|
||||
if (query.Contains("category=sports", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return JsonResponse("""{"status":"ok","articles":[]}""");
|
||||
}
|
||||
|
||||
return JsonResponse(
|
||||
"""{"status":"ok","articles":[{"title":"General robotics update","description":"Top story","source":{"name":"AP News"},"url":"https://example.com/general"}]}""");
|
||||
});
|
||||
var provider = new NewsApiBriefingProvider(
|
||||
new HttpClient(handler),
|
||||
new NewsApiOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
CacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<NewsApiBriefingProvider>.Instance);
|
||||
|
||||
var result = await provider.GetBriefingAsync(new NewsBriefingRequest(["sports"], 3));
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Single(result!.Headlines);
|
||||
Assert.Equal("General robotics update", result.Headlines[0].Title);
|
||||
Assert.Equal(2, handler.GetCallCount("/v2/top-headlines"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewsApiBriefingProvider_FallsBackToEverything_WhenTopHeadlinesAreEmpty()
|
||||
{
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
return path switch
|
||||
{
|
||||
"/v2/top-headlines" => JsonResponse("""{"status":"ok","articles":[]}"""),
|
||||
"/v2/everything" => JsonResponse(
|
||||
"""{"status":"ok","articles":[{"title":"Robotics breakthrough announced","description":"Lab unveils a new platform.","source":{"name":"Science Daily"},"url":"https://example.com/robotics"}]}"""),
|
||||
_ => new HttpResponseMessage(HttpStatusCode.NotFound)
|
||||
};
|
||||
});
|
||||
var provider = new NewsApiBriefingProvider(
|
||||
new HttpClient(handler),
|
||||
new NewsApiOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
DefaultCategories = ["general"],
|
||||
CacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<NewsApiBriefingProvider>.Instance);
|
||||
|
||||
var result = await provider.GetBriefingAsync(new NewsBriefingRequest([], 3));
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Single(result!.Headlines);
|
||||
Assert.Equal("Robotics breakthrough announced", result.Headlines[0].Title);
|
||||
Assert.Equal(2, handler.GetCallCount("/v2/top-headlines"));
|
||||
Assert.Equal(1, handler.GetCallCount("/v2/everything"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewsApiBriefingProvider_ContinuesFallbackChain_WhenCategoryReturnsHttpError()
|
||||
{
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
if (!string.Equals(path, "/v2/top-headlines", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.NotFound);
|
||||
}
|
||||
|
||||
var query = message.RequestUri?.Query ?? string.Empty;
|
||||
if (query.Contains("category=sports", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.BadRequest)
|
||||
{
|
||||
Content = new StringContent(
|
||||
"""{"status":"error","code":"parameterInvalid","message":"Category not supported for this key."}""",
|
||||
Encoding.UTF8,
|
||||
"application/json")
|
||||
};
|
||||
}
|
||||
|
||||
return JsonResponse(
|
||||
"""{"status":"ok","articles":[{"title":"General robotics update","description":"Top story","source":{"name":"AP News"},"url":"https://example.com/general"}]}""");
|
||||
});
|
||||
var provider = new NewsApiBriefingProvider(
|
||||
new HttpClient(handler),
|
||||
new NewsApiOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
CacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<NewsApiBriefingProvider>.Instance);
|
||||
|
||||
var result = await provider.GetBriefingAsync(new NewsBriefingRequest(["sports"], 3));
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Single(result!.Headlines);
|
||||
Assert.Equal("General robotics update", result.Headlines[0].Title);
|
||||
Assert.Equal("success", result.ProviderStatus);
|
||||
Assert.Equal(2, handler.GetCallCount("/v2/top-headlines"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task NewsApiBriefingProvider_PropagatesApiErrorCodeAndMessage_WhenAllEndpointsFail()
|
||||
{
|
||||
var handler = new CountingHttpMessageHandler(message =>
|
||||
{
|
||||
var path = message.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
if (string.Equals(path, "/v2/top-headlines", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.BadRequest)
|
||||
{
|
||||
Content = new StringContent(
|
||||
"""{"status":"error","code":"parameterInvalid","message":"Category 'general' is not available for this account."}""",
|
||||
Encoding.UTF8,
|
||||
"application/json")
|
||||
};
|
||||
}
|
||||
|
||||
if (string.Equals(path, "/v2/everything", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.BadRequest)
|
||||
{
|
||||
Content = new StringContent(
|
||||
"""{"status":"error","code":"parametersMissing","message":"Missing required search query."}""",
|
||||
Encoding.UTF8,
|
||||
"application/json")
|
||||
};
|
||||
}
|
||||
|
||||
return new HttpResponseMessage(HttpStatusCode.NotFound);
|
||||
});
|
||||
var provider = new NewsApiBriefingProvider(
|
||||
new HttpClient(handler),
|
||||
new NewsApiOptions
|
||||
{
|
||||
ApiKey = "test-key",
|
||||
DefaultCategories = ["general"],
|
||||
CacheTtlSeconds = 300,
|
||||
FailureCacheTtlSeconds = 30
|
||||
},
|
||||
NullLogger<NewsApiBriefingProvider>.Instance);
|
||||
|
||||
var result = await provider.GetBriefingAsync(new NewsBriefingRequest([], 3));
|
||||
|
||||
Assert.NotNull(result);
|
||||
Assert.Empty(result!.Headlines);
|
||||
Assert.Equal("http_error", result.ProviderStatus);
|
||||
Assert.Equal("parameterInvalid", result.ProviderErrorCode);
|
||||
Assert.Equal("Category 'general' is not available for this account.", result.ProviderMessage);
|
||||
Assert.Equal((int)HttpStatusCode.BadRequest, result.ProviderHttpStatusCode);
|
||||
Assert.Contains("/v2/top-headlines", result.ProviderEndpoint, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
private static HttpResponseMessage JsonResponse(string body)
|
||||
{
|
||||
return new HttpResponseMessage(HttpStatusCode.OK)
|
||||
{
|
||||
Content = new StringContent(body, Encoding.UTF8, "application/json")
|
||||
};
|
||||
}
|
||||
|
||||
private sealed class CountingHttpMessageHandler(Func<HttpRequestMessage, HttpResponseMessage> responseFactory)
|
||||
: HttpMessageHandler
|
||||
{
|
||||
private readonly Dictionary<string, int> callsByPath = new(StringComparer.OrdinalIgnoreCase);
|
||||
private readonly object gate = new();
|
||||
|
||||
public int GetCallCount(string path)
|
||||
{
|
||||
lock (gate)
|
||||
{
|
||||
return callsByPath.TryGetValue(path, out var count) ? count : 0;
|
||||
}
|
||||
}
|
||||
|
||||
protected override Task<HttpResponseMessage> SendAsync(
|
||||
HttpRequestMessage request,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var path = request.RequestUri?.AbsolutePath ?? string.Empty;
|
||||
lock (gate)
|
||||
{
|
||||
callsByPath[path] = callsByPath.TryGetValue(path, out var count) ? count + 1 : 1;
|
||||
}
|
||||
|
||||
return Task.FromResult(responseFactory(request));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -216,4 +216,17 @@ public sealed class JiboCloudProtocolServiceTests
|
||||
using var payload = JsonDocument.Parse(result.BodyText);
|
||||
Assert.Single(payload.RootElement.EnumerateArray());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InMemoryCloudStateStore_SeedsPeopleForTheDefaultAccountLoop()
|
||||
{
|
||||
var store = new InMemoryCloudStateStore();
|
||||
|
||||
var people = store.GetPeople();
|
||||
|
||||
Assert.NotEmpty(people);
|
||||
Assert.Contains(people, person => person.IsPrimary);
|
||||
Assert.Contains(people, person => string.Equals(person.AccountId, store.GetAccount().AccountId, StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Contains(people, person => string.Equals(person.LoopId, store.GetLoops()[0].LoopId, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -101,4 +101,49 @@ public sealed class FileTurnTelemetrySinkTests
|
||||
s => s.RecordTranscriptError(It.IsAny<Exception>(), It.IsAny<string>(), It.IsAny<CancellationToken>()),
|
||||
Times.Once());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task HandleContext_EmitsGlsmPhaseTransitionDiagnostic()
|
||||
{
|
||||
var sink = new Mock<ITurnTelemetrySink>();
|
||||
sink.Setup(s => s.RecordTurnDiagnosticAsync(It.IsAny<string>(), It.IsAny<IReadOnlyDictionary<string, object?>>(), It.IsAny<CancellationToken>()))
|
||||
.Returns(Task.CompletedTask);
|
||||
var turnService = new WebSocketTurnFinalizationService(
|
||||
Mock.Of<IConversationBroker>(),
|
||||
Mock.Of<ISttStrategySelector>(),
|
||||
sink.Object);
|
||||
|
||||
var session = new CloudSession
|
||||
{
|
||||
Token = "glsm-phase-token",
|
||||
TurnState =
|
||||
{
|
||||
TransId = "trans-glsm",
|
||||
AwaitingTurnCompletion = true,
|
||||
SawListen = true,
|
||||
ListenOpenedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(1)
|
||||
}
|
||||
};
|
||||
session.Metadata["glsmPhase"] = "HJ_LISTENING";
|
||||
|
||||
await turnService.HandleContextAsync(
|
||||
session,
|
||||
new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-glsm","data":{"topic":"conversation"}}"""
|
||||
},
|
||||
CancellationToken.None);
|
||||
|
||||
sink.Verify(
|
||||
s => s.RecordTurnDiagnosticAsync(
|
||||
"glsm_phase_transition",
|
||||
It.Is<IReadOnlyDictionary<string, object?>>(details =>
|
||||
details.ContainsKey("state") &&
|
||||
string.Equals(details["state"] == null ? null : details["state"]!.ToString(), "LISTENING", StringComparison.OrdinalIgnoreCase)),
|
||||
It.IsAny<CancellationToken>()),
|
||||
Times.AtLeastOnce());
|
||||
}
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,5 @@
|
||||
using System.Text.Json;
|
||||
using Jibo.Cloud.Application.Abstractions;
|
||||
using Jibo.Cloud.Application.Services;
|
||||
using Jibo.Cloud.Domain.Models;
|
||||
using Jibo.Cloud.Infrastructure.Content;
|
||||
@@ -363,6 +364,64 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("my favorite sport is football", listenPayload.RootElement.GetProperty("data").GetProperty("asr").GetProperty("text").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BufferedAudio_WithBarePreferenceSetHint_FinalizesWithoutDeferral()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-preference-bare-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-preference-bare","data":{"rules":["launch"]}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-preference-bare-token",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-preference-bare","data":{"audioTranscriptHint":"my favorite sport football"}}"""
|
||||
});
|
||||
|
||||
for (var index = 0; index < 4; index += 1)
|
||||
{
|
||||
var chunkReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-preference-bare-token",
|
||||
Binary = new byte[3000]
|
||||
});
|
||||
|
||||
Assert.Empty(chunkReplies);
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken("hub-preference-bare-token");
|
||||
Assert.NotNull(session);
|
||||
session.TurnState.FirstAudioReceivedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(2);
|
||||
|
||||
var finalizedReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-preference-bare-token",
|
||||
Binary = new byte[3000]
|
||||
});
|
||||
|
||||
Assert.Equal(3, finalizedReplies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(finalizedReplies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(finalizedReplies[1]));
|
||||
Assert.Equal("SKILL_ACTION", ReadReplyType(finalizedReplies[2]));
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(finalizedReplies[0].Text!);
|
||||
Assert.Equal("memory_set_preference", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("my favorite sport football", listenPayload.RootElement.GetProperty("data").GetProperty("asr").GetProperty("text").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BufferedAudio_WithIncompleteAffinityHint_DefersThenFinalizesWhenContinuationArrives()
|
||||
{
|
||||
@@ -432,6 +491,75 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("i do like pizza", listenPayload.RootElement.GetProperty("data").GetProperty("asr").GetProperty("text").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BufferedAudio_WithIncompletePegasusWeAffinityHint_DefersThenFinalizesWhenContinuationArrives()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-affinity-we-continuation-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-affinity-we-continuation","data":{"rules":["launch"]}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-affinity-we-continuation-token",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-affinity-we-continuation","data":{"audioTranscriptHint":"we like"}}"""
|
||||
});
|
||||
|
||||
for (var index = 0; index < 4; index += 1)
|
||||
{
|
||||
var chunkReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-affinity-we-continuation-token",
|
||||
Binary = new byte[3000]
|
||||
});
|
||||
|
||||
Assert.Empty(chunkReplies);
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken("hub-affinity-we-continuation-token");
|
||||
Assert.NotNull(session);
|
||||
session.TurnState.FirstAudioReceivedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(2);
|
||||
|
||||
var deferredReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-affinity-we-continuation-token",
|
||||
Binary = new byte[3000]
|
||||
});
|
||||
|
||||
Assert.Empty(deferredReplies);
|
||||
|
||||
var finalizedReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-affinity-we-continuation-token",
|
||||
Text = """{"type":"CONTEXT","transID":"trans-affinity-we-continuation","data":{"audioTranscriptHint":"we like pizza"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, finalizedReplies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(finalizedReplies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(finalizedReplies[1]));
|
||||
Assert.Equal("SKILL_ACTION", ReadReplyType(finalizedReplies[2]));
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(finalizedReplies[0].Text!);
|
||||
Assert.Equal("memory_set_affinity", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("we like pizza", listenPayload.RootElement.GetProperty("data").GetProperty("asr").GetProperty("text").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task MultiChunkAudio_AccumulatesBufferedStateAcrossMessages()
|
||||
{
|
||||
@@ -1485,6 +1613,36 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("surprises-ota/want_to_download_now", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_YesNoPromptFromAsrHints_MapsYepToYesIntent()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-yesno-hints-yep-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-yesno-hints-yep","data":{"rules":["surprises-ota/want_to_download_now"],"asr":{"hints":["$YESNO"]}}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-yesno-hints-yep-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-yesno-hints-yep","data":{"text":"yep"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, replies.Count);
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.Equal("yep", listenPayload.RootElement.GetProperty("data").GetProperty("asr").GetProperty("text").GetString());
|
||||
Assert.Equal("yes", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("surprises-ota/want_to_download_now", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules")[0].GetString());
|
||||
Assert.Equal("surprises-ota/want_to_download_now", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_SharedYesNoPrompt_StripsGlobalRulesAndStaysLocal()
|
||||
{
|
||||
@@ -1516,6 +1674,37 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("shared/yes_no", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_SharedYesNoPrompt_MapsNegativeWordToNoIntent()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-shared-yesno-negative-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-shared-yesno-negative","data":{"rules":["shared/yes_no","globals/gui_nav","globals/mim_repeat","globals/global_commands_launch"],"asr":{"hints":["$YESNO"]}}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-shared-yesno-negative-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-shared-yesno-negative","data":{"text":"negative"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, replies.Count);
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.Equal("no", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
var rules = listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules");
|
||||
Assert.Single(rules.EnumerateArray());
|
||||
Assert.Equal("shared/yes_no", rules[0].GetString());
|
||||
Assert.Equal("shared/yes_no", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_AlarmTimerChangeYesNoPrompt_StripsGlobalRulesAndStaysLocal()
|
||||
{
|
||||
@@ -1743,14 +1932,53 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal(3, replies.Count);
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.Equal("yes", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("proactive_offer_pizza_fact", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
var rules = listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules");
|
||||
Assert.Single(rules.EnumerateArray());
|
||||
Assert.Equal("surprises-date/offer_date_fact", rules[0].GetString());
|
||||
Assert.Equal("surprises-date/offer_date_fact", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
var selectedRule = rules[0].GetString();
|
||||
Assert.True(
|
||||
string.Equals(selectedRule, "surprises-date/offer_date_fact", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(selectedRule, "shared/yes_no", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Equal(selectedRule, listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
Assert.Empty(listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").EnumerateObject());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_WordOfDayOfferPrompt_MapsYesToWordOfDayLaunch()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-wod-offer-yesno-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-wod-offer-yes","data":{"rules":["word-of-the-day/surprise","globals/gui_nav","globals/mim_repeat","globals/global_commands_launch"],"asr":{"hints":["$YESNO"]}}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-wod-offer-yesno-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-wod-offer-yes","data":{"text":"Yes!"}}"""
|
||||
});
|
||||
|
||||
Assert.True(replies.Count >= 3);
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
var rules = listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules");
|
||||
Assert.Single(rules.EnumerateArray());
|
||||
var selectedRule = rules[0].GetString();
|
||||
Assert.True(
|
||||
string.Equals(selectedRule, "word-of-the-day/surprise", StringComparison.OrdinalIgnoreCase) ||
|
||||
string.Equals(selectedRule, "word-of-the-day/menu", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Equal(selectedRule, listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("rule").GetString());
|
||||
Assert.Equal(
|
||||
"word-of-the-day",
|
||||
listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("entities").GetProperty("domain").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ResponsePlanMapper_EscapesSpeechWithoutEncodingApostrophes()
|
||||
{
|
||||
@@ -1842,6 +2070,57 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Equal("announcement", meta.GetProperty("mim_type").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_TellMeTheNews_WithProvider_UsesProviderHeadlinesInSpeech()
|
||||
{
|
||||
var service = CreateService(
|
||||
new InMemoryCloudStateStore(),
|
||||
newsBriefingProvider: new StubNewsBriefingProvider(
|
||||
new NewsBriefingSnapshot(
|
||||
[
|
||||
new NewsHeadline("Robotics club opens a new community lab"),
|
||||
new NewsHeadline("Local students win a regional coding challenge")
|
||||
],
|
||||
"NewsAPI")));
|
||||
|
||||
await service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-news-provider-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-news-provider","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
var replies = await service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-news-provider-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-news-provider","data":{"text":"tell me the news"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, replies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(replies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(replies[1]));
|
||||
Assert.Equal("SKILL_ACTION", ReadReplyType(replies[2]));
|
||||
|
||||
using var speakPayload = JsonDocument.Parse(replies[2].Text!);
|
||||
var esml = speakPayload.RootElement
|
||||
.GetProperty("data")
|
||||
.GetProperty("action")
|
||||
.GetProperty("config")
|
||||
.GetProperty("jcp")
|
||||
.GetProperty("config")
|
||||
.GetProperty("play")
|
||||
.GetProperty("esml")
|
||||
.GetString();
|
||||
|
||||
Assert.Contains("Robotics club opens a new community lab", esml, StringComparison.OrdinalIgnoreCase);
|
||||
Assert.Contains("Source: NewsAPI.", esml, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_HowIsTheWeather_EmitsSpokenWeatherFallbackWithoutRedirect()
|
||||
{
|
||||
@@ -1928,6 +2207,135 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Contains("weather service is connected", esml, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_HowIsTheWeather_WithProvider_EmitsWeatherHiLoGuiCard()
|
||||
{
|
||||
var customStore = new InMemoryCloudStateStore();
|
||||
var customService = CreateService(
|
||||
customStore,
|
||||
new StubWeatherReportProvider(
|
||||
new WeatherReportSnapshot("Boston, US", "light rain", 61, 65, 54, "rain", false)));
|
||||
|
||||
await customService.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-weather-provider-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-weather-provider","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
var replies = await customService.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-weather-provider-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-weather-provider","data":{"text":"how is the weather"}}"""
|
||||
});
|
||||
|
||||
Assert.True(replies.Count >= 3);
|
||||
Assert.Equal("LISTEN", ReadReplyType(replies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(replies[1]));
|
||||
Assert.Contains(replies, static reply => string.Equals(ReadReplyType(reply), "SKILL_ACTION", StringComparison.Ordinal));
|
||||
|
||||
using var listenPayload = JsonDocument.Parse(replies[0].Text!);
|
||||
Assert.False(listenPayload.RootElement.GetProperty("data").GetProperty("nlu").TryGetProperty("skill", out _));
|
||||
Assert.Equal("weather", listenPayload.RootElement.GetProperty("data").GetProperty("match").GetProperty("cloudSkill").GetString());
|
||||
|
||||
var skillReply = replies.Last(static reply => string.Equals(ReadReplyType(reply), "SKILL_ACTION", StringComparison.Ordinal));
|
||||
using var skillPayload = JsonDocument.Parse(skillReply.Text!);
|
||||
Assert.Equal(
|
||||
"report-skill",
|
||||
skillPayload.RootElement.GetProperty("data").GetProperty("skill").GetProperty("id").GetString());
|
||||
var jcpConfig = skillPayload.RootElement
|
||||
.GetProperty("data")
|
||||
.GetProperty("action")
|
||||
.GetProperty("config")
|
||||
.GetProperty("jcp")
|
||||
.GetProperty("config");
|
||||
|
||||
var esml = jcpConfig.GetProperty("play").GetProperty("esml").GetString();
|
||||
Assert.Contains("cat='weather'", esml, StringComparison.OrdinalIgnoreCase);
|
||||
|
||||
Assert.True(jcpConfig.TryGetProperty("gui", out var gui));
|
||||
Assert.Equal("Javascript", gui.GetProperty("type").GetString());
|
||||
Assert.Equal("views.weatherHiLo", gui.GetProperty("data").GetString());
|
||||
Assert.True(gui.GetProperty("pause").GetBoolean());
|
||||
|
||||
Assert.Equal(6, jcpConfig.GetProperty("timeout").GetInt32());
|
||||
Assert.Equal(0, jcpConfig.GetProperty("no_matches_for_gui").GetInt32());
|
||||
Assert.Equal(0, jcpConfig.GetProperty("no_inputs_for_gui").GetInt32());
|
||||
|
||||
Assert.True(jcpConfig.TryGetProperty("display", out var display));
|
||||
Assert.Equal(
|
||||
"weatherTempView",
|
||||
display.GetProperty("view").GetProperty("data").GetProperty("viewConfig").GetProperty("id").GetString());
|
||||
Assert.Equal(
|
||||
"weatherTempView",
|
||||
display.GetProperty("view").GetProperty("context").GetProperty("data").GetProperty("viewConfig").GetProperty("id").GetString());
|
||||
|
||||
Assert.True(jcpConfig.TryGetProperty("views", out var views));
|
||||
var weatherHiLo = views.GetProperty("weatherHiLo");
|
||||
Assert.Equal("weatherTempView", weatherHiLo.GetProperty("viewConfig").GetProperty("id").GetString());
|
||||
|
||||
Assert.True(jcpConfig.TryGetProperty("local", out var local));
|
||||
Assert.Equal(
|
||||
"weatherTempView",
|
||||
local.GetProperty("views").GetProperty("weatherHiLo").GetProperty("viewConfig").GetProperty("id").GetString());
|
||||
|
||||
var payloadText = skillReply.Text!;
|
||||
Assert.Contains("assets/personal-report-skill/weather/icons/rain_v01.crn", payloadText, StringComparison.Ordinal);
|
||||
Assert.Contains("tempNormal_v01.crn", payloadText, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_WeatherNextWeek_WithProvider_EmitsWeatherHiLoSequenceCards()
|
||||
{
|
||||
var customStore = new InMemoryCloudStateStore();
|
||||
var customService = CreateService(
|
||||
customStore,
|
||||
new StubWeatherReportProvider(
|
||||
new WeatherReportSnapshot("Seattle, US", "light rain", 58, 61, 52, "rain", false)));
|
||||
|
||||
await customService.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-weather-next-week-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-weather-next-week","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
var replies = await customService.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-weather-next-week-token",
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-weather-next-week","data":{"text":"forecast for seattle next week"}}"""
|
||||
});
|
||||
|
||||
Assert.True(replies.Count >= 3);
|
||||
var skillReply = replies.Last(static reply => string.Equals(ReadReplyType(reply), "SKILL_ACTION", StringComparison.Ordinal));
|
||||
using var skillPayload = JsonDocument.Parse(skillReply.Text!);
|
||||
var jcp = skillPayload.RootElement
|
||||
.GetProperty("data")
|
||||
.GetProperty("action")
|
||||
.GetProperty("config")
|
||||
.GetProperty("jcp");
|
||||
|
||||
Assert.Equal("SEQUENCE", jcp.GetProperty("type").GetString());
|
||||
var children = jcp.GetProperty("children");
|
||||
Assert.Equal(5, children.GetArrayLength());
|
||||
|
||||
var firstChildConfig = children[0].GetProperty("config");
|
||||
Assert.True(firstChildConfig.TryGetProperty("display", out var firstDisplay));
|
||||
Assert.Equal(
|
||||
"weatherTempView",
|
||||
firstDisplay.GetProperty("view").GetProperty("data").GetProperty("viewConfig").GetProperty("id").GetString());
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsr_OpenTheRadio_EmitsRadioRedirectAndSilentCompletion()
|
||||
{
|
||||
@@ -2523,6 +2931,47 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.Null(session.LastIntent);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task StaleListenSetup_IsRecoveredWhenNextHotphraseListenArrives()
|
||||
{
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-stale-listen-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-stale-listen","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
var session = _store.FindSessionByToken("hub-stale-listen-token");
|
||||
Assert.NotNull(session);
|
||||
session.TurnState.ListenOpenedUtc = DateTimeOffset.UtcNow - TimeSpan.FromSeconds(12);
|
||||
session.TurnState.AwaitingTurnCompletion = true;
|
||||
session.TurnState.SawListen = true;
|
||||
session.TurnState.SawContext = false;
|
||||
session.TurnState.BufferedAudioBytes = 0;
|
||||
session.TurnState.BufferedAudioChunkCount = 0;
|
||||
session.TurnState.HotphraseEmptyTurnCount = 2;
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = "hub-stale-listen-token",
|
||||
Text = """{"type":"LISTEN","transID":"trans-stale-listen","data":{"hotphrase":true,"rules":["launch","globals/global_commands_launch"]}}"""
|
||||
});
|
||||
|
||||
Assert.Empty(replies);
|
||||
Assert.True(session.TurnState.AwaitingTurnCompletion);
|
||||
Assert.True(session.TurnState.SawListen);
|
||||
Assert.False(session.TurnState.SawContext);
|
||||
Assert.Equal(0, session.TurnState.BufferedAudioBytes);
|
||||
Assert.Equal(0, session.TurnState.BufferedAudioChunkCount);
|
||||
Assert.Equal(0, session.TurnState.HotphraseEmptyTurnCount);
|
||||
Assert.True(session.TurnState.ListenOpenedUtc > DateTimeOffset.UtcNow - TimeSpan.FromSeconds(3));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task BinaryAudio_AfterWordOfDayRightWordListen_IsIgnoredDuringCleanupWindow()
|
||||
{
|
||||
@@ -3266,6 +3715,290 @@ public sealed class JiboWebSocketServiceTests
|
||||
Assert.False(session.Metadata.ContainsKey("pendingProactivityOffer"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsrSurpriseOffer_PersistsPendingOfferAndResolvesYesFollowUpWithTail()
|
||||
{
|
||||
var token = _store.IssueRobotToken("proactivity-device-a-tail");
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-tail","data":{"text":"surprise me"}}"""
|
||||
});
|
||||
|
||||
var followUpReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-tail-yes","data":{"text":"yes I want to"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, followUpReplies.Count);
|
||||
using var followUpListenPayload = JsonDocument.Parse(followUpReplies[0].Text!);
|
||||
Assert.Equal("proactive_pizza_fact", followUpListenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.Metadata.ContainsKey("pendingProactivityOffer"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsrSurpriseOffer_PersistsPendingOfferAndResolvesNoFollowUp()
|
||||
{
|
||||
var token = _store.IssueRobotToken("proactivity-device-b");
|
||||
|
||||
var offerReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-no","data":{"text":"surprise me"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, offerReplies.Count);
|
||||
using (var offerListenPayload = JsonDocument.Parse(offerReplies[0].Text!))
|
||||
{
|
||||
Assert.Equal("proactive_offer_pizza_fact", offerListenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
Assert.Equal("shared/yes_no", offerListenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("rules")[0].GetString());
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.True(session.Metadata.TryGetValue("pendingProactivityOffer", out var pendingOffer));
|
||||
Assert.Equal("pizza_fact", pendingOffer?.ToString());
|
||||
|
||||
var followUpReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-no-followup","data":{"text":"no"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, followUpReplies.Count);
|
||||
using (var followUpListenPayload = JsonDocument.Parse(followUpReplies[0].Text!))
|
||||
{
|
||||
Assert.Equal("proactive_offer_declined", followUpListenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
}
|
||||
|
||||
using (var followUpSkillPayload = JsonDocument.Parse(followUpReplies[2].Text!))
|
||||
{
|
||||
var esml = followUpSkillPayload.RootElement
|
||||
.GetProperty("data")
|
||||
.GetProperty("action")
|
||||
.GetProperty("config")
|
||||
.GetProperty("jcp")
|
||||
.GetProperty("config")
|
||||
.GetProperty("play")
|
||||
.GetProperty("esml")
|
||||
.GetString();
|
||||
Assert.Contains("No problem", esml, StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
|
||||
session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.Metadata.ContainsKey("pendingProactivityOffer"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsrSurpriseOffer_PersistsPendingOfferAndResolvesNoFollowUpWithTail()
|
||||
{
|
||||
var token = _store.IssueRobotToken("proactivity-device-b-tail");
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-no-tail","data":{"text":"surprise me"}}"""
|
||||
});
|
||||
|
||||
var followUpReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-proactive-offer-no-tail-followup","data":{"text":"no I do not"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, followUpReplies.Count);
|
||||
using var followUpListenPayload = JsonDocument.Parse(followUpReplies[0].Text!);
|
||||
Assert.Equal("proactive_offer_declined", followUpListenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.Metadata.ContainsKey("pendingProactivityOffer"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TriggerPresence_WithIdentity_EmitsProactiveGreetingAndPersistsGreetingMetadata()
|
||||
{
|
||||
var token = _store.IssueRobotToken("trigger-greeting-device-a");
|
||||
|
||||
var listenSetupReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"LISTEN","transID":"trans-greeting-trigger","data":{"rules":["launch","globals/global_commands_launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
Assert.Empty(listenSetupReplies);
|
||||
|
||||
var contextReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CONTEXT","transID":"trans-greeting-trigger","data":{"runtime":{"perception":{"speaker":"person-1","peoplePresent":[{"id":"person-1"}]},"loop":{"users":[{"id":"person-1","firstName":"jake"}]}}}}"""
|
||||
});
|
||||
Assert.Empty(contextReplies);
|
||||
|
||||
var triggerReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"TRIGGER","transID":"trans-greeting-trigger","data":{"triggerSource":"PRESENCE","triggerData":{"looperID":"person-1"}}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, triggerReplies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(triggerReplies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(triggerReplies[1]));
|
||||
Assert.Equal("SKILL_ACTION", ReadReplyType(triggerReplies[2]));
|
||||
|
||||
using (var listenPayload = JsonDocument.Parse(triggerReplies[0].Text!))
|
||||
{
|
||||
Assert.Equal("proactive_greeting", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
}
|
||||
using (var skillPayload = JsonDocument.Parse(triggerReplies[2].Text!))
|
||||
{
|
||||
var esml = skillPayload.RootElement
|
||||
.GetProperty("data")
|
||||
.GetProperty("action")
|
||||
.GetProperty("config")
|
||||
.GetProperty("jcp")
|
||||
.GetProperty("config")
|
||||
.GetProperty("play")
|
||||
.GetProperty("esml")
|
||||
.GetString();
|
||||
Assert.Contains("Jake", esml, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.FollowUpOpen);
|
||||
Assert.True(session.Metadata.TryGetValue("greetingsRoute", out var route));
|
||||
Assert.Equal("ProactiveGreeting", route?.ToString());
|
||||
Assert.True(session.Metadata.TryGetValue("greetingsSpeaker", out var speaker));
|
||||
Assert.Equal("person-1", speaker?.ToString());
|
||||
Assert.True(session.Metadata.TryGetValue("greetingsLastProactiveUtc", out var lastUtc));
|
||||
Assert.True(DateTimeOffset.TryParse(lastUtc?.ToString(), out _));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task TriggerSurprise_IsIgnoredWithoutLeavingMicOpen()
|
||||
{
|
||||
var token = _store.IssueRobotToken("trigger-greeting-device-b");
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"LISTEN","transID":"trans-greeting-trigger-ignore","data":{"rules":["launch"],"mode":"CLIENT_NLU"}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CONTEXT","transID":"trans-greeting-trigger-ignore","data":{"runtime":{"perception":{"speaker":"person-1"},"loop":{"users":[{"id":"person-1","firstName":"jake"}]}}}}"""
|
||||
});
|
||||
|
||||
var triggerReplies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"TRIGGER","transID":"trans-greeting-trigger-ignore","data":{"triggerSource":"SURPRISE","triggerData":{"looperID":"person-1"}}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, triggerReplies.Count);
|
||||
Assert.Equal("LISTEN", ReadReplyType(triggerReplies[0]));
|
||||
Assert.Equal("EOS", ReadReplyType(triggerReplies[1]));
|
||||
Assert.Equal("SKILL_ACTION", ReadReplyType(triggerReplies[2]));
|
||||
|
||||
using (var listenPayload = JsonDocument.Parse(triggerReplies[0].Text!))
|
||||
{
|
||||
Assert.Equal("trigger_ignored", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.FollowUpOpen);
|
||||
Assert.False(session.Metadata.ContainsKey("greetingsLastProactiveUtc"));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task WhoAmI_DoesNotLeaveFollowUpOpen()
|
||||
{
|
||||
var token = _store.IssueRobotToken("identity-close-token");
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"LISTEN","transID":"trans-identity-close","data":{"rules":["launch"]}}"""
|
||||
});
|
||||
|
||||
await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CONTEXT","transID":"trans-identity-close","data":{"runtime":{"perception":{"speaker":"person-1"},"loop":{"users":[{"id":"person-1","firstName":"erin"}]}}}}"""
|
||||
});
|
||||
|
||||
var replies = await _service.HandleMessageAsync(new WebSocketMessageEnvelope
|
||||
{
|
||||
HostName = "neo-hub.jibo.com",
|
||||
Path = "/listen",
|
||||
Kind = "neo-hub-listen",
|
||||
Token = token,
|
||||
Text = """{"type":"CLIENT_ASR","transID":"trans-identity-close","data":{"text":"who am i"}}"""
|
||||
});
|
||||
|
||||
Assert.Equal(3, replies.Count);
|
||||
using (var listenPayload = JsonDocument.Parse(replies[0].Text!))
|
||||
{
|
||||
Assert.Equal("memory_get_name", listenPayload.RootElement.GetProperty("data").GetProperty("nlu").GetProperty("intent").GetString());
|
||||
}
|
||||
|
||||
var session = _store.FindSessionByToken(token);
|
||||
Assert.NotNull(session);
|
||||
Assert.False(session.FollowUpOpen);
|
||||
Assert.False(session.TurnState.AwaitingTurnCompletion);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task ClientAsrPersonalReport_StateMachinePersistsAcrossTurns()
|
||||
{
|
||||
@@ -3576,9 +4309,55 @@ public sealed class JiboWebSocketServiceTests
|
||||
}
|
||||
}
|
||||
|
||||
private static JiboWebSocketService CreateService(
|
||||
InMemoryCloudStateStore stateStore,
|
||||
IWeatherReportProvider? weatherReportProvider = null,
|
||||
INewsBriefingProvider? newsBriefingProvider = null)
|
||||
{
|
||||
var contentRepository = new InMemoryJiboExperienceContentRepository();
|
||||
var contentCache = new JiboExperienceContentCache(contentRepository);
|
||||
var interactionService = new JiboInteractionService(
|
||||
contentCache,
|
||||
new DefaultJiboRandomizer(),
|
||||
new InMemoryPersonalMemoryStore(),
|
||||
weatherReportProvider,
|
||||
newsBriefingProvider);
|
||||
var conversationBroker = new DemoConversationBroker(interactionService);
|
||||
var sttSelector = new DefaultSttStrategySelector(
|
||||
[
|
||||
new SyntheticBufferedAudioSttStrategy()
|
||||
]);
|
||||
var sink = new NullTurnTelemetrySink();
|
||||
|
||||
return new JiboWebSocketService(
|
||||
stateStore,
|
||||
new NullWebSocketTelemetrySink(),
|
||||
new WebSocketTurnFinalizationService(conversationBroker, sttSelector, sink));
|
||||
}
|
||||
|
||||
private static string ReadReplyType(WebSocketReply reply)
|
||||
{
|
||||
using var payload = JsonDocument.Parse(reply.Text!);
|
||||
return payload.RootElement.GetProperty("type").GetString() ?? string.Empty;
|
||||
}
|
||||
|
||||
private sealed class StubWeatherReportProvider(WeatherReportSnapshot snapshot) : IWeatherReportProvider
|
||||
{
|
||||
public Task<WeatherReportSnapshot?> GetReportAsync(
|
||||
WeatherReportRequest request,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
return Task.FromResult<WeatherReportSnapshot?>(snapshot);
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class StubNewsBriefingProvider(NewsBriefingSnapshot snapshot) : INewsBriefingProvider
|
||||
{
|
||||
public Task<NewsBriefingSnapshot?> GetBriefingAsync(
|
||||
NewsBriefingRequest request,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
return Task.FromResult<NewsBriefingSnapshot?>(snapshot);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
18
README.md
18
README.md
@@ -1,13 +1,15 @@
|
||||
# JiboExperiments
|
||||
|
||||
Experiments, protocol notes, and early implementation work for bringing Jibo back.
|
||||
This repository is the working lab for bringing Jibo back.
|
||||
|
||||
The active work lives in [OpenJibo](C:/Projects/JiboExperiments/OpenJibo), where the current direction is:
|
||||
The active OpenJibo work lives in [OpenJibo/README.md](OpenJibo/README.md), and the long-range story now lives in [OpenJibo/docs/roadmap.md](OpenJibo/docs/roadmap.md).
|
||||
|
||||
- build a stable Azure-hosted replacement cloud first
|
||||
- use the Node prototype as the reverse-engineering oracle
|
||||
- port the real hosted system to .NET
|
||||
- support first devices through RCM plus controlled DNS/TLS patching
|
||||
- use OTA later as the path to a smoother recovery experience
|
||||
Start here:
|
||||
|
||||
This repo is intentionally a working lab, not a finished product.
|
||||
- [OpenJibo overview](OpenJibo/README.md)
|
||||
- [Roadmap](OpenJibo/docs/roadmap.md)
|
||||
- [Current cloud truth](OpenJibo/docs/development-plan.md)
|
||||
- [Working feature queue](OpenJibo/docs/feature-backlog.md)
|
||||
- [Device bootstrap path](OpenJibo/docs/device-bootstrap.md)
|
||||
|
||||
This repo intentionally stays a living notebook, not a polished product. That lets us keep the reverse-engineering notes, the hosted cloud, and the post-cloud ideas in one place without pretending they are all equally finished.
|
||||
|
||||
42
tmp/jibo-test-39/captures/http/20260511.events.ndjson
Normal file
42
tmp/jibo-test-39/captures/http/20260511.events.ndjson
Normal file
File diff suppressed because one or more lines are too long
13984
tmp/jibo-test-39/captures/turn/20260511.events.ndjson
Normal file
13984
tmp/jibo-test-39/captures/turn/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
1872
tmp/jibo-test-39/captures/websocket/20260511.events.ndjson
Normal file
1872
tmp/jibo-test-39/captures/websocket/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"name": "neohubjibocom-neohubproactive-tidd36da4d442a611f1aba45cf821ea55ae",
|
||||
"session": {
|
||||
"hostName": "neo-hub.jibo.com",
|
||||
"path": "/v1/proactive",
|
||||
"kind": "neo-hub-proactive",
|
||||
"token": "hub-usr_openjibo_owner-1777340189867"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"text": {
|
||||
"type": "TRIGGER",
|
||||
"ts": 1777341970615,
|
||||
"msgID": "mid-d388c070-42a6-11f1-a414-5cf821ea55ae",
|
||||
"transID": "tid-d36da4d4-42a6-11f1-aba4-5cf821ea55ae",
|
||||
"data": {
|
||||
"triggerSource": "SURPRISE",
|
||||
"triggerData": {
|
||||
"looperID": "5c0b221fdf9d450019c5e255"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
"type": "CONTEXT",
|
||||
"ts": 1777341970702,
|
||||
"msgID": "mid-d395f790-42a6-11f1-95f4-5cf821ea55ae",
|
||||
"transID": "tid-d36da4d4-42a6-11f1-aba4-5cf821ea55ae",
|
||||
"data": {
|
||||
"runtime": {
|
||||
"character": {
|
||||
"emotion": {
|
||||
"name": "NEUTRAL",
|
||||
"valence": 0.45,
|
||||
"confidence": 0.2
|
||||
},
|
||||
"motivation": {
|
||||
"social": 1,
|
||||
"playful": 0.5152989351851469
|
||||
}
|
||||
},
|
||||
"perception": {
|
||||
"speaker": "5c0b221fdf9d450019c5e255",
|
||||
"peoplePresent": [
|
||||
{
|
||||
"id": "NOT_TRAINED",
|
||||
"entityId": 16085,
|
||||
"type": "fused",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"location": {
|
||||
"city": "Pleasant Hill",
|
||||
"state": "Missouri",
|
||||
"stateAbbr": "MO",
|
||||
"country": "United States",
|
||||
"countryCode": "US",
|
||||
"lat": 38.8358494,
|
||||
"lng": -94.1427229,
|
||||
"iso": "2026-04-27T21:06:10.626-05:00"
|
||||
},
|
||||
"loop": {
|
||||
"loopId": "5c0b221fdf9d450019c5e253",
|
||||
"users": [
|
||||
{
|
||||
"firstName": "Erin",
|
||||
"lastName": "Picone",
|
||||
"phoneticName": "Erin",
|
||||
"gender": "female",
|
||||
"birthdate": 649209600000,
|
||||
"id": "5c0b221fdf9d450019c5e255",
|
||||
"accountId": "5c0b20547c46170019235759"
|
||||
}
|
||||
],
|
||||
"jibo": {
|
||||
"color": "WHITE",
|
||||
"birthdate": 1544234645598,
|
||||
"id": "5c0b221fdf9d450019c5e254"
|
||||
},
|
||||
"owner": "5c0b221fdf9d450019c5e255"
|
||||
},
|
||||
"dialog": {
|
||||
"referent": null
|
||||
}
|
||||
},
|
||||
"skill": {
|
||||
"id": null
|
||||
},
|
||||
"general": {
|
||||
"release": "1.9.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": []
|
||||
}
|
||||
]
|
||||
}
|
||||
672
tmp/jibo-test-39/jibo test 39.txt
Normal file
672
tmp/jibo-test-39/jibo test 39.txt
Normal file
@@ -0,0 +1,672 @@
|
||||
|
||||
2026-05-10T21:20:01.788571-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: CPU: Uptime: 1 week, 2 days, 14 hours,
|
||||
2026-05-10T21:20:01.788612-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: CPU: Number of users logged in: 2 users
|
||||
2026-05-10T21:20:01.788636-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: CPU: Current load average: 9.38, 8.35, 8.42
|
||||
2026-05-10T21:20:01.790016-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: CPU: Current date: Sun May 10 2026 21:20:01 GMT-0500 (CDT)
|
||||
2026-05-10T21:20:01.864803-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Platform process: jibo-service-registry | Mem: 3480 (RSS), Uptime: 9d:14h:12m:16s (828736349)
|
||||
2026-05-10T21:20:01.926981-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Platform process: jibo-system-manager | Mem: 7240 (RSS), Uptime: 9d:14h:12m:16s (828736411)
|
||||
2026-05-10T21:20:02.013672-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Platform process: jibo-body-service | Mem: 4568 (RSS), Uptime: 9d:14h:12m:16s (828736498)
|
||||
2026-05-10T21:20:02.089394-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Platform process: jibo-audio-service | Mem: 11m (RSS), Uptime: 9d:14h:12m:16s (828736573)
|
||||
2026-05-10T21:20:02.146389-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Platform process: jibo-identity-service | Mem: 117m (RSS), Uptime: 9d:14h:12m:50s (828770129)
|
||||
2026-05-10T21:20:02.251596-05:00 Royal-Current-Sage-Canvas system-monitor[30115,info]: - P.SystemMonitor: Error trying to examine memory usage: Command failed: ps -o pid,rss,args | grep [^]]jibo-nlu-service
|
||||
2026-05-10T21:20:08.250578-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30880 80:69:1a:8b:a0:e3
|
||||
2026-05-10T21:20:08.251013-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30881 86:69:1a:8b:a0:e3
|
||||
2026-05-10T21:20:08.251440-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30882 80:69:1a:95:0b:6d
|
||||
2026-05-10T21:20:08.251816-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30883 86:69:1a:95:0b:6d
|
||||
2026-05-10T21:20:08.252221-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30876 ae:ae:19:ae:91:70
|
||||
2026-05-10T21:20:08.252607-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30884 30:23:03:d6:cf:c0
|
||||
2026-05-10T21:20:08.253018-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30877 d6:e2:2f:ea:3e:fb
|
||||
2026-05-10T21:21:07.300769-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-10T21:21:11.307047-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30889 80:69:1a:8b:a0:e3
|
||||
2026-05-10T21:21:11.307501-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30890 80:69:1a:95:0b:6d
|
||||
2026-05-10T21:21:11.307854-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30891 86:69:1a:95:0b:6d
|
||||
2026-05-10T21:21:11.308165-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30892 30:23:03:3f:51:e6
|
||||
2026-05-10T21:21:11.308448-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30893 52:06:f5:3e:83:89
|
||||
2026-05-10T21:21:11.308641-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30894 68:f0:bc:c6:99:04
|
||||
2026-05-10T21:21:11.308879-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30895 b0:39:56:ea:f8:8e
|
||||
2026-05-10T21:21:11.309116-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30896 68:f0:bc:c3:76:ce
|
||||
2026-05-10T21:21:11.309422-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-10T21:22:08.348626-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30885 4a:9e:bd:65:31:8b
|
||||
2026-05-10T21:22:08.349109-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30886 30:23:03:95:2b:b7
|
||||
2026-05-10T21:22:08.349456-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30887 36:23:03:3f:51:e5
|
||||
2026-05-10T21:22:08.349777-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30888 30:23:03:d6:ca:1c
|
||||
2026-05-10T21:23:11.392002-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-10T21:23:15.396307-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30897 30:23:03:95:2b:b8
|
||||
2026-05-10T21:23:15.396592-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30898 80:69:1a:95:0b:6e
|
||||
2026-05-10T21:23:15.396806-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30899 ae:ae:19:ae:91:70
|
||||
2026-05-10T21:23:15.397009-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30900 36:23:03:d6:ca:1c
|
||||
2026-05-10T21:23:15.397161-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30901 d6:e2:2f:ea:3e:fb
|
||||
2026-05-10T21:23:15.397457-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30902 7a:c3:2a:77:55:eb
|
||||
2026-05-10T21:23:15.397752-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-10T21:24:08.443524-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30889 80:69:1a:8b:a0:e3
|
||||
2026-05-10T21:24:08.443873-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30890 80:69:1a:95:0b:6d
|
||||
2026-05-10T21:24:18.451863-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30892 30:23:03:3f:51:e6
|
||||
2026-05-10T21:24:18.452186-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30894 68:f0:bc:c6:99:04
|
||||
2026-05-10T21:24:18.452419-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30895 b0:39:56:ea:f8:8e
|
||||
2026-05-10T21:24:18.452598-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30896 68:f0:bc:c3:76:ce
|
||||
2026-05-11T02:25:00.712Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Playing big musing.
|
||||
2026-05-11T02:25:00.886Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.Be.Framework.HolidayBeSkillPlugin-Holiday: KB returned no holiday list.
|
||||
2026-05-11T02:25:00.888Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.Be.Framework.HolidayBeSkillPlugin-Holiday: No active holiday data.
|
||||
2026-05-11T02:25:00.897Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Randomly chosen idle animation query:{"category":"ib","includeMeta":[],"includeSomeMeta":[],"excludeMeta":["seasonal","shift","shift-left","shift-right","postural-shift"]}
|
||||
2026-05-11T02:25:03.460Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T02:25:03.940Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE motion exceeds dynamic limits, motion limiting is being applied
|
||||
2026-05-11T02:25:04.026Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE motion is back within normal limits, no limiting is being applied
|
||||
2026-05-11T02:25:07.582Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-10T21:25:15.500088-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-10T21:25:19.503579-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30903 80:69:1a:8b:a2:b7
|
||||
2026-05-10T21:25:19.504140-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30904 86:69:1a:8b:a2:b7
|
||||
2026-05-10T21:25:19.504604-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30905 b0:39:56:ea:f8:8e
|
||||
2026-05-10T21:25:19.504892-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-11T02:25:20.043Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Idle Boredom Big
|
||||
2026-05-10T21:26:18.546820-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30893 52:06:f5:3e:83:89
|
||||
2026-05-10T21:26:18.547186-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30891 86:69:1a:95:0b:6d
|
||||
2026-05-10T21:26:18.547413-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30900 36:23:03:d6:ca:1c
|
||||
2026-05-10T21:26:18.547591-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30856 fc:9c:98:59:45:de
|
||||
2026-05-10T21:26:18.547781-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30902 7a:c3:2a:77:55:eb
|
||||
2026-05-10T21:26:23.485982-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,warning]: - P.SystemManager.SkillManager: SkillManager::refresh Error reading package file for @be: File not found
|
||||
2026-05-10T21:26:30.633876-05:00 Royal-Current-Sage-Canvas jibo-log-client-async[30210,info]: - Upload log /tmp/tmp833qraaaa size 5683 bytes
|
||||
2026-05-11T02:26:40.517Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 13994
|
||||
2026-05-11T02:26:40.530Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Idle Face
|
||||
2026-05-10T21:26:40.863416-05:00 Royal-Current-Sage-Canvas jibo-identity-service[663,info]: - P.ImageIdentifier: ImageIdentifier[deepid]::identify [["5c0b221fdf9d450019c5e255", "face", 0.495323]]
|
||||
2026-05-10T21:26:40.873087-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: face with 1 hypotheses
|
||||
2026-05-10T21:26:40.873182-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure face Quality:1 Id: 5c0b221fdf9d450019c5e255 Conf: 0.495323
|
||||
2026-05-10T21:26:40.873243-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 1 inputs.
|
||||
2026-05-10T21:26:40.873309-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.158872 Op: NOT_TRAINED Score: 0.3
|
||||
2026-05-10T21:26:40.873354-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.3 Best ID: NOT_TRAINED
|
||||
2026-05-10T21:26:40.873390-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion CHANGING identity from UNKNOWN to NOT_TRAINED
|
||||
2026-05-11T02:26:41.226Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 13994
|
||||
2026-05-11T02:26:41.239Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T02:26:45.712Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalFacePersisted: Persisting face entity ID 13994 has an identity of null
|
||||
2026-05-11T02:26:45.746Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.HttpHandler: Handling JetHttpHandler:/proactive/trigger
|
||||
2026-05-11T02:26:45.715Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Evaluating trigger source: NEW_ARRIVAL with looperID: null
|
||||
2026-05-11T02:26:45.721Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Passed all inhibitors
|
||||
2026-05-11T02:26:45.724Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Sending proactive trigger to jetstream
|
||||
2026-05-11T02:26:46.016Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,err]: - C.Jetstream.PhubClient: FAILURE opening phubclient connection: CloudConnection::open (poco exception): Connection refused
|
||||
2026-05-11T02:26:46.017Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.Proactivity: Reaper queue down to 0 entries.
|
||||
2026-05-11T02:26:46.018Z Royal-Current-Sage-Canvas be[1017,err]: [versions@1 release="1.9.2"] T.JetstreamClient: CloudConnection::open (poco exception): Connection refused
|
||||
2026-05-11T02:26:46.019Z Royal-Current-Sage-Canvas ssm[937,err]: [versions@1 release="1.9.2"] T.SSM: CloudConnection::open (poco exception): Connection refused
|
||||
2026-05-11T02:26:46.020Z Royal-Current-Sage-Canvas be[1017,err]: [1@1 frames="[{\"method\":\"HTTPWSClient.Client.handleMessage.error\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/@jibo/jetstream-client/lib/jetstream-client.js\",\"line\":302,\"column\":40},{\"method\":\"emitOne\",\"filename\":\"events.js\",\"line\":96,\"column\":13},{\"method\":\"HTTPWSClient.emit\",\"filename\":\"events.js\",\"line\":188,\"column\":7},{\"method\":\"WebSocket.HTTPWSClient._onMessage.err\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/jibo-client-framework/lib/jibo-client-framework.js\",\"line\":823,\"column\":22},{\"method\":\"emitOne\",\"filename\":\"events.js\",\"line\":96,\"column\":13},{\"method\":\"WebSocket.emit\",\"filename\":\"events.js\",\"line\":188,\"column\":7},{\"method\":\"Receiver._receiver.onmessage\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/WebSocket.js\",\"line\":141,\"column\":47},{\"method\":\"Receiver.dataMessage\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/Receiver.js\",\"line\":389,\"column\":14},{\"method\":\"Receiver.getData\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/Receiver.js\",\"line\":330,\"column\":12},{\"method\":\"Receiver.startLoop\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/Receiver.js\",\"line\":165,\"column\":16},{\"method\":\"Receiver.add\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/Receiver.js\",\"line\":139,\"column\":10},{\"method\":\"Socket._ultron.on\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/ws/lib/WebSocket.js\",\"line\":138,\"column\":22},{\"method\":\"emitOne\",\"filename\":\"events.js\",\"line\":96,\"column\":13},{\"method\":\"Socket.emit\",\"filename\":\"events.js\",\"line\":188,\"column\":7},{\"method\":\"readableAddChunk\",\"filename\":\"_stream_readable.js\",\"line\":176,\"column\":18},{\"method\":\"Socket.Readable.push\",\"filename\":\"_stream_readable.js\",\"line\":134,\"column\":10},{\"method\":\"TCP.onread\",\"filename\":\"net.js\",\"line\":543,\"column\":20}\]" message="CloudConnection::open (poco exception): Connection refused"][versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: error received: CloudConnection::open (poco exception): Connection refused
|
||||
2026-05-11T02:26:46.025Z Royal-Current-Sage-Canvas be[1017,err]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Received error: CloudConnection::open (poco exception): Connection refused
|
||||
2026-05-11T02:26:48.227Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: A proactive trigger was sent but did not receive a response from jetstream within 2500 milliseconds
|
||||
2026-05-11T02:26:54.984Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 13994
|
||||
2026-05-11T02:27:02.851Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 13994
|
||||
2026-05-10T21:27:13.432028-05:00 Royal-Current-Sage-Canvas jibo-server-service[29676,warning]: - P.Application.ServerPort: ServerPort[2]::onReadable Disconnecting because of socket exception: Connection reset by peer
|
||||
2026-05-10T21:27:13.432585-05:00 Royal-Current-Sage-Canvas jibo-server-service[29676,alert]: - P.ServiceApp: Terminate with Poco exception: I/O error: Broken pipe: 32
|
||||
2026-05-10T21:27:13.432986-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.ServiceManager.Service: server: terminate called after throwing an instance of 'Poco::IOException'
|
||||
2026-05-11T02:27:13.437Z Royal-Current-Sage-Canvas scs[891,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T02:27:13.438Z Royal-Current-Sage-Canvas STS[920,warning]: [versions@1 release="1.9.2"] P.SF.Client.WSClient: socket closed 1006
|
||||
2026-05-11T02:27:13.440Z Royal-Current-Sage-Canvas STS[920,warning]: [versions@1 release="1.9.2"] P.SF.Client.WSClient: socket closed 1006
|
||||
2026-05-11T02:27:13.440Z Royal-Current-Sage-Canvas mms[856,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T02:27:13.451Z Royal-Current-Sage-Canvas mms[856,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T02:27:13.451Z Royal-Current-Sage-Canvas scs[891,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T02:27:13.445Z Royal-Current-Sage-Canvas ssm[937,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T02:27:13.469Z Royal-Current-Sage-Canvas ssm[937,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T02:27:13.472Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T02:27:13.477Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-10T21:27:14.017534-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.Service.Monitor: Service server exited with code 0
|
||||
2026-05-11T02:27:14.448Z Royal-Current-Sage-Canvas STS[920,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] P.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.451Z Royal-Current-Sage-Canvas mms[856,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.442Z Royal-Current-Sage-Canvas scs[891,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.459Z Royal-Current-Sage-Canvas STS[920,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] P.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.468Z Royal-Current-Sage-Canvas scs[891,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.477Z Royal-Current-Sage-Canvas mms[856,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.491Z Royal-Current-Sage-Canvas ssm[937,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.506Z Royal-Current-Sage-Canvas ssm[937,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1022,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1045,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1087,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-10T21:27:14.534492-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.Service.Monitor: Service server launched with PID 30227
|
||||
2026-05-11T02:27:14.548Z Royal-Current-Sage-Canvas be[1017,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1026,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1049,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1081,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-11T02:27:14.552Z Royal-Current-Sage-Canvas be[1017,warning]: [1@1 frames="[{\"method\":\"Object.exports._errnoException\",\"filename\":\"util.js\",\"line\":1026,\"column\":11},{\"method\":\"exports._exceptionWithHostPort\",\"filename\":\"util.js\",\"line\":1049,\"column\":20},{\"method\":\"TCPConnectWrap.afterConnect [as oncomplete\]\",\"filename\":\"net.js\",\"line\":1081,\"column\":14}\]" message="connect ECONNREFUSED 127.0.0.1:8888" code="ECONNREFUSED" errno="ECONNREFUSED" syscall="connect" address="127.0.0.1" port="8888"][versions@1 release="1.9.2"] T.SF.Client.WSClient: socket error connect ECONNREFUSED 127.0.0.1:8888
|
||||
2026-05-10T21:27:14.812687-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,warning]: - P.ServiceRegistryClient: ServiceRegistryClient::registerService error: Bad Request
|
||||
2026-05-10T21:27:15.060455-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-10T21:27:15.062561-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,info]: - P.ServiceApp: Chronometer timestamp: 829232 s, 471488 us
|
||||
2026-05-10T21:27:18.074760-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-11T02:27:18.864Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Added L2-Cannot_connect_to_server
|
||||
2026-05-11T02:27:19.073Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Added Q4-Server_connection_lost
|
||||
2026-05-11T02:27:19.084Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:19.093Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:19.097Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:27:19.105Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/settings
|
||||
2026-05-11T02:27:19.106Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T02:27:19.113Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T02:27:19.114Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T02:27:19.231Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T02:27:19.272Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to OFF
|
||||
2026-05-11T02:27:19.124Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T02:27:19.129Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T02:27:19.143Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T02:27:19.306Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.HttpHandler: Handling JetHttpHandler:/listen/set_hj_mode
|
||||
2026-05-11T02:27:19.306Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_SET_HJ_MODE
|
||||
2026-05-11T02:27:19.306Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_SET_HJ_MODE in 0 ms.
|
||||
2026-05-11T02:27:19.145Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T02:27:19.150Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T02:27:19.152Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:19.177Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/settings
|
||||
2026-05-11T02:27:19.183Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/settings''
|
||||
2026-05-11T02:27:19.192Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/settings''
|
||||
2026-05-11T02:27:19.209Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:27:19.214Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/settings
|
||||
2026-05-11T02:27:19.217Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:19.222Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:19.233Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/settings
|
||||
2026-05-11T02:27:19.236Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/settings
|
||||
2026-05-11T02:27:19.243Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T02:27:19.250Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: SubSkill Launched
|
||||
2026-05-11T02:27:19.273Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T02:27:19.275Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-10T21:27:19.571608-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-10T21:27:24.575016-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30906 4a:9e:bd:65:31:8b
|
||||
2026-05-10T21:27:24.575291-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30907 80:69:1a:8b:a0:e3
|
||||
2026-05-10T21:27:24.577246-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30908 86:69:1a:8b:a0:e3
|
||||
2026-05-10T21:27:24.577629-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 30909 fc:9c:98:59:45:de
|
||||
2026-05-10T21:27:24.577789-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-10T21:27:33.100384-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-10T21:27:48.833123-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,info]: - P.NotificationSubsystem: NotificationSubsystem::connect Connecting to api-socket.jibo.com:443/token-Royal-Current-Sage-Canvas-1778466468774
|
||||
2026-05-10T21:27:48.997316-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,info]: - P.NotificationSubsystem: NotificationSubsystem::connect established connection to server
|
||||
2026-05-11T02:27:49.084Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Removed L2-Cannot_connect_to_server
|
||||
2026-05-11T02:27:49.088Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Removed Q4-Server_connection_lost
|
||||
2026-05-11T02:27:49.100Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: error resolved: Q4-Server_connection_lost
|
||||
2026-05-11T02:27:49.112Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: no more errors!
|
||||
2026-05-11T02:27:49.150Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from OFF to ENGAGED
|
||||
2026-05-10T21:27:49.157648-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: { "tts": { "stop_request" : "Calling TTS stop" } }
|
||||
2026-05-11T02:27:49.133Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Be: REDIRECT: skill redirect: @be/idle {}
|
||||
2026-05-11T02:27:49.135Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:49.137Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:27:49.141Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/settings @be/idle
|
||||
2026-05-11T02:27:49.200Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.HttpHandler: Handling JetHttpHandler:/listen/set_hj_mode
|
||||
2026-05-11T02:27:49.201Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_SET_HJ_MODE
|
||||
2026-05-11T02:27:49.201Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_SET_HJ_MODE in 0 ms.
|
||||
2026-05-11T02:27:49.142Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/settings
|
||||
2026-05-11T02:27:49.143Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/settings
|
||||
2026-05-11T02:27:49.145Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: SubSkill killed before its time
|
||||
2026-05-11T02:27:49.738Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/settings
|
||||
2026-05-11T02:27:49.829Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T02:27:49.757Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T02:27:49.763Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/settings
|
||||
2026-05-11T02:27:49.764Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:49.805Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T02:27:49.810Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:27:49.815Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:27:49.818Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:27:49.819Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T02:27:49.820Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:49.822Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/settings @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:49.825Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T02:27:49.829Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T02:27:49.830Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T02:27:49.833Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T02:27:49.834Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T02:27:49.835Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T02:27:49.848Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T02:27:49.850Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T02:27:49.858Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:27:50.364Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T02:27:50.367Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T02:27:50.378Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T02:27:50.452Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T02:27:53.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 41 walign: B020C088 palign: B0221A00 {"word_alignment":"829235648 829235776 hey 0.00 829235776 829236032 jibo 0.00 "}
|
||||
2026-05-11T02:27:53.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 8.50333 dB
|
||||
2026-05-11T02:27:53.064Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_RECOG_HJ_EVENT
|
||||
2026-05-10T21:27:53.065581-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829270,474613],"type":"hotphrase","id":326,"location":{"ts":[829270,274518],"possibilities":[{"channels":[1],"position":{"x":0.8720762729644775,"y":0.5147014856338501,"z":0.21438778936862946},"confidence":0.15776042640209199}]},"utterances":[]}
|
||||
2026-05-11T02:27:53.064Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Entering PH-W state
|
||||
2026-05-11T02:27:53.065Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 829235648
|
||||
2026-05-11T02:27:53.069Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 5 ms.
|
||||
2026-05-11T02:27:53.066Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T02:27:53.163Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T02:27:53.130Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T02:27:53.148Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T02:27:53.189Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.8720762729644775,\n y: 0.5147014856338501,\n z: 0.21438778936862946 } null
|
||||
2026-05-11T02:27:53.211Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T02:27:53.212Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T02:27:53.213Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="2.661744" requestID="GLOBAL" transID="tid-03398a0e-4ce1-11f1-986e-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T02:27:53.213Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 1 ms.
|
||||
2026-05-11T02:27:53.214Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T02:27:53.204Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T02:27:53.221Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T02:27:53.220Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T02:27:53.221Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Command Look
|
||||
2026-05-11T02:27:53.359Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 31.165 accepted: 1
|
||||
2026-05-11T02:27:53.360Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-10T21:27:53.360575-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829270,769641],"type":"jet_speaker_id","id":326,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":31.165042877197267,"accepted":true,"high_confidence":true}],"snr":19.75763511657715}}
|
||||
2026-05-11T02:27:53.370Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 31.165042877197266
|
||||
2026-05-11T02:27:53.374Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Emitting idAcquired from source: VOICE
|
||||
2026-05-11T02:27:53.377Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: ID_ACQUIRED
|
||||
2026-05-11T02:27:53.378Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T02:27:53.486Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 126 ms.
|
||||
2026-05-11T02:27:54.459Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T02:27:56.919Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Demand Face Detect found 1 faces
|
||||
2026-05-10T21:27:57.094401-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-10T21:27:57.094454-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:19.7576 Id: 5c0b221fdf9d450019c5e255 Conf: 31.165
|
||||
2026-05-10T21:27:57.094496-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 1 inputs.
|
||||
2026-05-10T21:27:57.094537-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.983842 Op: NOT_TRAINED Score: 0.295153
|
||||
2026-05-10T21:27:57.094568-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.983842 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-10T21:27:57.094597-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion CHANGING identity from UNKNOWN to 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T02:27:57.107Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14002
|
||||
2026-05-11T02:27:57.117Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Expression.Base.ResolveHandle: Someone tried to cancel ResolveHandle after it was resolved!
|
||||
2026-05-11T02:27:57.123Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T02:27:57.147Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T02:27:57.149Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Command Look
|
||||
2026-05-11T02:27:57.616Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14002
|
||||
2026-05-11T02:27:57.618Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T02:27:58.322Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T02:27:58.356Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (entity match): 14002
|
||||
2026-05-11T02:27:58.738Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T02:27:58.739Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 1 ms.
|
||||
2026-05-11T02:27:58.739Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T02:27:58.740Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 1 ms.
|
||||
2026-05-11T02:27:58.747Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-03398a0e-4ce1-11f1-986e-5cf821ea55ae',\n data: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'What\'s the weather?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: null,\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T02:27:58.784Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T02:27:58.754Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'What\'s the weather?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: null,\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-03398a0e-4ce1-11f1-986e-5cf821ea55ae' }
|
||||
2026-05-11T02:27:58.771Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T02:27:58.858Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T02:27:58.859Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 1 ms.
|
||||
2026-05-11T02:27:58.879Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T02:27:58.774Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient: event waiter 'HJ Listen Complete'
|
||||
2026-05-11T02:27:58.780Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: 3927
|
||||
2026-05-11T02:27:58.781Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: false
|
||||
2026-05-11T02:27:58.788Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.792Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.794Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:27:58.796Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T02:27:58.797Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T02:27:58.800Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T02:27:58.801Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T02:27:58.807Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-10T21:27:59.048935-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-10T21:27:59.049454-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - 519392ab-299b-4556-b891-bdb87031874d
|
||||
2026-05-10T21:27:59.049871-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - 519392ab-299b-4556-b891-bdb87031874d
|
||||
2026-05-11T02:27:58.811Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T02:27:58.816Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-10T21:27:59.106038-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-10T21:27:59.106520-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - 6a637df3-1a12-4f94-ba51-98c9548b8324
|
||||
2026-05-10T21:27:59.107573-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - 6a637df3-1a12-4f94-ba51-98c9548b8324
|
||||
2026-05-11T02:27:58.817Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:27:58.819Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T02:27:58.820Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.843Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:27:58.847Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T02:27:58.854Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T02:27:58.861Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T02:27:58.866Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:27:58.869Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-11T02:27:58.870Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.872Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.880Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-11T02:27:58.882Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T02:27:58.884Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-11T02:27:58.894Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T02:27:58.895Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:27:58.908Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-10T21:27:59.199454-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-10T21:27:59.200445-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> right now in Lone Jack , it is scattered clouds and 54 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T02:27:58.909Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T02:27:58.916Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-11T02:27:58.918Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T02:27:58.922Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: WeatherCommentPartlyCloudyNight_AN_13
|
||||
2026-05-11T02:27:58.985Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:27:59.014Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T02:27:59.020Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-11T02:27:59.022Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: 8081453e-aa0a-4b21-9787-439c5f52254a
|
||||
2026-05-10T21:27:59.232243-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-10T21:27:59.431911-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - c06f1934-7c87-4979-9563-0d6498cd216e
|
||||
2026-05-11T02:27:59.490Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T02:27:59.510Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T02:27:59.525Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-11T02:27:59.526Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: 8081453e-aa0a-4b21-9787-439c5f52254a
|
||||
2026-05-10T21:27:59.563139-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 1be6e88f-6ef7-4bcf-ac30-731396752c5e
|
||||
2026-05-10T21:27:59.563264-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> right now in Lone Jack , it is scattered clouds and 54 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-10T21:27:59.563496-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 1be6e88f-6ef7-4bcf-ac30-731396752c5e
|
||||
2026-05-10T21:27:59.563539-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T02:28:00.244Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T02:28:02.123Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalFacePersisted: Persisting face entity ID 14002 has an identity of 5c0b221fdf9d450019c5e255
|
||||
2026-05-10T21:28:04.365469-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 1be6e88f-6ef7-4bcf-ac30-731396752c5e
|
||||
2026-05-11T02:28:04.991Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T02:28:04.988Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: 8081453e-aa0a-4b21-9787-439c5f52254a
|
||||
2026-05-11T02:28:05.002Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: 8081453e-aa0a-4b21-9787-439c5f52254a
|
||||
2026-05-11T02:28:05.008Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T02:28:05.011Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T02:28:05.018Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T02:28:05.025Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:05.105Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T02:28:05.039Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:05.041Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:28:05.052Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T02:28:05.054Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T02:28:05.056Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T02:28:05.057Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T02:28:05.060Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T02:28:05.064Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:05.067Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T02:28:05.068Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:05.082Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T02:28:05.090Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:05.092Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:05.094Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:05.095Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T02:28:05.097Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:05.099Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:05.103Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T02:28:05.105Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T02:28:05.107Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:05.109Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T02:28:05.110Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T02:28:05.113Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T02:28:05.117Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T02:28:05.118Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T02:28:05.122Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:05.133Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T02:28:05.134Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T02:28:05.137Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T02:28:05.203Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T02:28:06.807Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 159 walign: B020C088 palign: B0221A00 {"word_alignment":"829249344 829249472 hey 0.00 829249472 829249792 jibo 0.00 "}
|
||||
2026-05-10T21:28:06.811219-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829284,220295],"type":"hotphrase","id":327,"location":{"ts":[829284,22546],"possibilities":[{"channels":[0,12],"position":{"x":0.6970734000205994,"y":0.6831817626953125,"z":0.43347111344337466},"confidence":0.13540178537368775}]},"utterances":[]}
|
||||
2026-05-11T02:28:06.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 8.52053 dB
|
||||
2026-05-11T02:28:06.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_HJ_EVENT
|
||||
2026-05-11T02:28:06.810Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 2 ms.
|
||||
2026-05-11T02:28:06.810Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 829249344
|
||||
2026-05-11T02:28:06.813Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n message: '',\n status: 'INTERRUPTED',\n transID: 'tid-03398a0e-4ce1-11f1-986e-5cf821ea55ae' }
|
||||
2026-05-11T02:28:06.821Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T02:28:06.907Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T02:28:06.920Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T02:28:06.917Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T02:28:06.930Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.6970734000205994,\n y: 0.6831817626953125,\n z: 0.43347111344337463 } 14002
|
||||
2026-05-11T02:28:06.940Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T02:28:06.965Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T02:28:06.966Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Command Look
|
||||
2026-05-11T02:28:07.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 19.4559 accepted: 1
|
||||
2026-05-11T02:28:07.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-11T02:28:07.064Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 0 ms.
|
||||
2026-05-10T21:28:07.064121-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829284,473143],"type":"jet_speaker_id","id":327,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":19.455947875976564,"accepted":true,"high_confidence":true}],"snr":18.54705047607422}}
|
||||
2026-05-10T21:28:07.065141-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-10T21:28:07.065222-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:18.5471 Id: 5c0b221fdf9d450019c5e255 Conf: 19.4559
|
||||
2026-05-10T21:28:07.065325-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 2 inputs.
|
||||
2026-05-10T21:28:07.065417-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.451568 Op: NOT_TRAINED Score: 0.135471
|
||||
2026-05-10T21:28:07.065482-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.451568 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-10T21:28:07.065532-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion NO CHANGE.
|
||||
2026-05-11T02:28:07.067Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 19.455947875976562
|
||||
2026-05-11T02:28:07.068Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T02:28:07.228Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T02:28:07.229Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T02:28:07.229Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="2.667021" requestID="GLOBAL" transID="tid-0b6ab9fa-4ce1-11f1-b472-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T02:28:07.233Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T02:28:07.300Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 72 ms.
|
||||
2026-05-11T02:28:07.302Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T02:28:07.845Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14002
|
||||
2026-05-11T02:28:08.661Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T02:28:08.665Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: 4
|
||||
2026-05-11T02:28:08.672Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T02:28:08.668Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: true
|
||||
2026-05-11T02:28:08.681Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:09.633Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14002
|
||||
2026-05-11T02:28:09.638Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Idle Face
|
||||
2026-05-11T02:28:10.136Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14002
|
||||
2026-05-11T02:28:10.138Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T02:28:12.148Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T02:28:12.149Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 4 ms.
|
||||
2026-05-11T02:28:12.149Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T02:28:12.149Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 0 ms.
|
||||
2026-05-11T02:28:12.150Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-0b6ab9fa-4ce1-11f1-b472-5cf821ea55ae',\n data: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'What\'s the forecast?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: null,\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T02:28:12.153Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'What\'s the forecast?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: null,\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-0b6ab9fa-4ce1-11f1-b472-5cf821ea55ae' }
|
||||
2026-05-11T02:28:12.159Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T02:28:12.162Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.164Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.165Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:28:12.168Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T02:28:12.169Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T02:28:12.171Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T02:28:12.172Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T02:28:12.173Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T02:28:12.175Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T02:28:12.178Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T02:28:12.179Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:12.182Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T02:28:12.183Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.202Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T02:28:12.225Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T02:28:12.208Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T02:28:12.210Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T02:28:12.213Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:12.214Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-11T02:28:12.217Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.220Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.224Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-11T02:28:12.225Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T02:28:12.226Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-11T02:28:12.229Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T02:28:12.230Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:12.285Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T02:28:12.286Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 1 ms.
|
||||
2026-05-11T02:28:12.295Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-11T02:28:12.296Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T02:28:12.297Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-10T21:28:12.351265-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-10T21:28:12.351761-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - 2a602472-3b56-48bd-8325-62e307593a6a
|
||||
2026-05-10T21:28:12.352514-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - 2a602472-3b56-48bd-8325-62e307593a6a
|
||||
2026-05-11T02:28:12.298Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T02:28:12.302Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: WeatherCommentClearNight_AN_13
|
||||
2026-05-10T21:28:12.377510-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-10T21:28:12.377923-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - ef7eeb01-d163-43c8-a8a2-bf76e953b704
|
||||
2026-05-10T21:28:12.379617-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - ef7eeb01-d163-43c8-a8a2-bf76e953b704
|
||||
2026-05-11T02:28:12.339Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:12.344Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T02:28:12.345Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-10T21:28:12.409244-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-10T21:28:12.410311-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> tomorrow in Lone Jack , US , expect clear sky with a high near 75 degrees Fahrenheit and a low around 54 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T02:28:12.346Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: 52c366b1-ae96-4162-9e23-4e2c072b44b4
|
||||
2026-05-10T21:28:12.469741-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-10T21:28:12.761945-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - 8855ef91-1eaf-4722-b269-9656badf11df
|
||||
2026-05-11T02:28:12.786Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T02:28:12.819Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T02:28:12.861Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-10T21:28:12.884687-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 3b7a307d-1509-485d-99a6-7635ffb2965e
|
||||
2026-05-10T21:28:12.884807-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> tomorrow in Lone Jack , US , expect clear sky with a high near 75 degrees Fahrenheit and a low around 54 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-10T21:28:12.885067-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 3b7a307d-1509-485d-99a6-7635ffb2965e
|
||||
2026-05-10T21:28:12.885104-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T02:28:12.869Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: 52c366b1-ae96-4162-9e23-4e2c072b44b4
|
||||
2026-05-11T02:28:13.564Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T02:28:14.631Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalFacePersisted: Persisting face entity ID 14002 has an identity of 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T02:28:15.895Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14002
|
||||
2026-05-10T21:28:18.597515-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30903 80:69:1a:8b:a2:b7
|
||||
2026-05-10T21:28:18.597812-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30904 86:69:1a:8b:a2:b7
|
||||
2026-05-10T21:28:18.599328-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 30905 b0:39:56:ea:f8:8e
|
||||
2026-05-11T02:28:20.859Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 14002
|
||||
2026-05-10T21:28:21.467425-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 3b7a307d-1509-485d-99a6-7635ffb2965e
|
||||
2026-05-11T02:28:21.564Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: 52c366b1-ae96-4162-9e23-4e2c072b44b4
|
||||
2026-05-11T02:28:21.567Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T02:28:21.575Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: 52c366b1-ae96-4162-9e23-4e2c072b44b4
|
||||
2026-05-11T02:28:21.578Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T02:28:21.580Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T02:28:21.581Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T02:28:21.585Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:21.593Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:21.594Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:28:21.601Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T02:28:21.603Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T02:28:21.604Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T02:28:21.605Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T02:28:21.609Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T02:28:21.610Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:21.613Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T02:28:21.614Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:21.636Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T02:28:21.652Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T02:28:21.639Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:21.641Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:21.643Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:21.644Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T02:28:21.645Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:21.646Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:21.649Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T02:28:21.652Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T02:28:21.653Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:21.654Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T02:28:21.655Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T02:28:21.657Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T02:28:21.659Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T02:28:21.660Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T02:28:21.665Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:21.673Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T02:28:21.674Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T02:28:21.676Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T02:28:21.723Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T02:28:23.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 267 walign: B020C088 palign: B0221A00 {"word_alignment":"829266368 829266496 hey 0.00 829266496 829266752 jibo 0.00 "}
|
||||
2026-05-11T02:28:23.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 6.80093 dB
|
||||
2026-05-11T02:28:23.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_HJ_EVENT
|
||||
2026-05-11T02:28:23.808Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 829266368
|
||||
2026-05-11T02:28:23.810Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 2 ms.
|
||||
2026-05-10T21:28:23.812028-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829301,221062],"type":"hotphrase","id":328,"location":{"ts":[829301,23005],"possibilities":[{"channels":[0,12],"position":{"x":0.7560884356498718,"y":0.6167867183685303,"z":0.4347969889640808},"confidence":0.07057805359363556}]},"utterances":[]}
|
||||
2026-05-11T02:28:23.815Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n message: '',\n status: 'INTERRUPTED',\n transID: 'tid-0b6ab9fa-4ce1-11f1-b472-5cf821ea55ae' }
|
||||
2026-05-11T02:28:23.857Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T02:28:23.821Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T02:28:23.851Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T02:28:23.853Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T02:28:23.872Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.7560884356498718,\n y: 0.6167867183685303,\n z: 0.4347969889640808 } null
|
||||
2026-05-11T02:28:23.914Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T02:28:23.946Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T02:28:23.948Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Command Look
|
||||
2026-05-11T02:28:24.159Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 26.381 accepted: 1
|
||||
2026-05-11T02:28:24.159Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-11T02:28:24.160Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 1 ms.
|
||||
2026-05-10T21:28:24.161345-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[829301,570352],"type":"jet_speaker_id","id":328,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":26.381040573120118,"accepted":true,"high_confidence":true}],"snr":23.380887985229493}}
|
||||
2026-05-11T02:28:24.161Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 26.381040573120117
|
||||
2026-05-11T02:28:24.165Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T02:28:24.231Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T02:28:24.231Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T02:28:24.232Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="2.187997" requestID="GLOBAL" transID="tid-158cc626-4ce1-11f1-ab84-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T02:28:24.232Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T02:28:24.316Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 85 ms.
|
||||
2026-05-11T02:28:24.327Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T02:28:25.659Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T02:28:27.870Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Demand Face Detect found 1 faces
|
||||
2026-05-10T21:28:28.050586-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-10T21:28:28.050670-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:23.3809 Id: 5c0b221fdf9d450019c5e255 Conf: 26.381
|
||||
2026-05-10T21:28:28.050736-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 1 inputs.
|
||||
2026-05-10T21:28:28.050790-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 1 Op: NOT_TRAINED Score: 0.3
|
||||
2026-05-10T21:28:28.050849-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 1 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-10T21:28:28.050890-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion CHANGING identity from UNKNOWN to 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T02:28:28.172Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14003
|
||||
2026-05-11T02:28:28.181Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Expression.Base.ResolveHandle: Someone tried to cancel ResolveHandle after it was resolved!
|
||||
2026-05-11T02:28:28.187Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T02:28:28.215Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T02:28:28.217Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Command Look
|
||||
2026-05-11T02:28:28.365Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14003
|
||||
2026-05-11T02:28:28.368Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T02:28:29.123Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T02:28:29.157Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (entity match): 14003
|
||||
2026-05-11T02:28:29.315Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T02:28:29.316Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 1 ms.
|
||||
2026-05-11T02:28:29.316Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T02:28:29.317Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 1 ms.
|
||||
2026-05-11T02:28:29.318Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-158cc626-4ce1-11f1-ab84-5cf821ea55ae',\n data: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'what\'s the news?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'news',\n intent: 'news',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T02:28:29.335Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T02:28:29.324Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'what\'s the news?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'news',\n intent: 'news',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-158cc626-4ce1-11f1-ab84-5cf821ea55ae' }
|
||||
2026-05-11T02:28:29.328Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T02:28:29.330Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient: event waiter 'HJ Listen Complete'
|
||||
2026-05-11T02:28:29.332Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: 4309
|
||||
2026-05-11T02:28:29.332Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: false
|
||||
2026-05-11T02:28:29.336Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.339Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.340Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:28:29.342Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T02:28:29.343Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T02:28:29.344Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T02:28:29.345Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T02:28:29.347Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T02:28:29.348Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T02:28:29.356Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T02:28:29.357Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:29.361Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T02:28:29.363Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.374Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:29.391Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T02:28:29.391Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 0 ms.
|
||||
2026-05-11T02:28:29.385Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T02:28:29.412Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T02:28:29.392Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T02:28:29.395Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-10T21:28:29.485480-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-10T21:28:29.485889-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - 1750dfdf-214b-4b95-ae2c-7e5009287f43
|
||||
2026-05-10T21:28:29.487076-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - 1750dfdf-214b-4b95-ae2c-7e5009287f43
|
||||
2026-05-11T02:28:29.402Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:29.404Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-10T21:28:29.512203-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-10T21:28:29.512697-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - 1e0a1c56-95b2-4192-a4e9-2e5efada520a
|
||||
2026-05-10T21:28:29.513134-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - 1e0a1c56-95b2-4192-a4e9-2e5efada520a
|
||||
2026-05-11T02:28:29.405Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.409Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.414Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-10T21:28:29.533410-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-10T21:28:29.533896-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - 5c95da49-195b-46c9-820b-5ae6b79ec8af
|
||||
2026-05-10T21:28:29.535627-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - 5c95da49-195b-46c9-820b-5ae6b79ec8af
|
||||
2026-05-11T02:28:29.415Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T02:28:29.420Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-10T21:28:29.569542-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-10T21:28:29.570444-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> here are your headlines . space missions are preparing for new launches , climate and weather systems are staying active across the country , and artificial intelligence tools keep pushing into everyday products . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T02:28:29.423Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T02:28:29.424Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T02:28:29.429Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-11T02:28:29.430Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T02:28:29.431Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-11T02:28:29.432Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T02:28:29.433Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: NewsHeadline_AN_01
|
||||
2026-05-11T02:28:29.460Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:29.469Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T02:28:29.472Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-11T02:28:29.473Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: 71f26c03-cf4e-455e-a5c5-fecc7a3c191e
|
||||
2026-05-10T21:28:29.622562-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-11T02:28:30.145Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Engaged Primary Face
|
||||
2026-05-10T21:28:30.174138-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - 7c55d8e8-ebe7-4b3d-972d-bcfcd819694a
|
||||
2026-05-11T02:28:30.210Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T02:28:30.259Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T02:28:30.281Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-11T02:28:30.282Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: 71f26c03-cf4e-455e-a5c5-fecc7a3c191e
|
||||
2026-05-10T21:28:30.306092-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 4f10e29c-a860-417f-bb0f-9f1f12441e12
|
||||
2026-05-10T21:28:30.306251-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> here are your headlines . space missions are preparing for new launches , climate and weather systems are staying active across the country , and artificial intelligence tools keep pushing into everyday products . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-10T21:28:30.306533-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 4f10e29c-a860-417f-bb0f-9f1f12441e12
|
||||
2026-05-10T21:28:30.306589-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T02:28:30.995Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T02:28:32.872Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalFacePersisted: Persisting face entity ID 14003 has an identity of 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T02:28:34.148Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Speaking Primary Face
|
||||
2026-05-11T02:28:34.563Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T02:28:34.866Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Speaking Primary Face
|
||||
2026-05-11T02:28:35.270Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14003
|
||||
2026-05-11T02:28:39.448Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 14003
|
||||
2026-05-10T21:28:42.032661-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 4f10e29c-a860-417f-bb0f-9f1f12441e12
|
||||
2026-05-11T02:28:42.615Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: 71f26c03-cf4e-455e-a5c5-fecc7a3c191e
|
||||
2026-05-11T02:28:42.621Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T02:28:42.628Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: 71f26c03-cf4e-455e-a5c5-fecc7a3c191e
|
||||
2026-05-11T02:28:42.630Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T02:28:42.632Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T02:28:42.634Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T02:28:42.637Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:42.644Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:42.648Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T02:28:42.668Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T02:28:42.669Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T02:28:42.670Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T02:28:42.670Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T02:28:42.672Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T02:28:42.673Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:42.677Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T02:28:42.678Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:42.706Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T02:28:42.762Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T02:28:42.711Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:42.724Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T02:28:42.734Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T02:28:42.735Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T02:28:42.737Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:42.750Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:42.757Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T02:28:42.761Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T02:28:42.762Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T02:28:42.768Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T02:28:42.770Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T02:28:42.771Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T02:28:42.775Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T02:28:42.776Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T02:28:42.781Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T02:28:42.785Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T02:28:42.786Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T02:28:42.789Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T02:28:42.843Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
#
|
||||
|
||||
144
tmp/jibo-test-40/captures/http/20260511.events.ndjson
Normal file
144
tmp/jibo-test-40/captures/http/20260511.events.ndjson
Normal file
File diff suppressed because one or more lines are too long
15721
tmp/jibo-test-40/captures/turn/20260511.events.ndjson
Normal file
15721
tmp/jibo-test-40/captures/turn/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
2088
tmp/jibo-test-40/captures/websocket/20260511.events.ndjson
Normal file
2088
tmp/jibo-test-40/captures/websocket/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,102 @@
|
||||
{
|
||||
"name": "neohubjibocom-neohubproactive-tidd36da4d442a611f1aba45cf821ea55ae",
|
||||
"session": {
|
||||
"hostName": "neo-hub.jibo.com",
|
||||
"path": "/v1/proactive",
|
||||
"kind": "neo-hub-proactive",
|
||||
"token": "hub-usr_openjibo_owner-1777340189867"
|
||||
},
|
||||
"steps": [
|
||||
{
|
||||
"text": {
|
||||
"type": "TRIGGER",
|
||||
"ts": 1777341970615,
|
||||
"msgID": "mid-d388c070-42a6-11f1-a414-5cf821ea55ae",
|
||||
"transID": "tid-d36da4d4-42a6-11f1-aba4-5cf821ea55ae",
|
||||
"data": {
|
||||
"triggerSource": "SURPRISE",
|
||||
"triggerData": {
|
||||
"looperID": "5c0b221fdf9d450019c5e255"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": []
|
||||
},
|
||||
{
|
||||
"text": {
|
||||
"type": "CONTEXT",
|
||||
"ts": 1777341970702,
|
||||
"msgID": "mid-d395f790-42a6-11f1-95f4-5cf821ea55ae",
|
||||
"transID": "tid-d36da4d4-42a6-11f1-aba4-5cf821ea55ae",
|
||||
"data": {
|
||||
"runtime": {
|
||||
"character": {
|
||||
"emotion": {
|
||||
"name": "NEUTRAL",
|
||||
"valence": 0.45,
|
||||
"confidence": 0.2
|
||||
},
|
||||
"motivation": {
|
||||
"social": 1,
|
||||
"playful": 0.5152989351851469
|
||||
}
|
||||
},
|
||||
"perception": {
|
||||
"speaker": "5c0b221fdf9d450019c5e255",
|
||||
"peoplePresent": [
|
||||
{
|
||||
"id": "NOT_TRAINED",
|
||||
"entityId": 16085,
|
||||
"type": "fused",
|
||||
"confidence": 1
|
||||
}
|
||||
]
|
||||
},
|
||||
"location": {
|
||||
"city": "Pleasant Hill",
|
||||
"state": "Missouri",
|
||||
"stateAbbr": "MO",
|
||||
"country": "United States",
|
||||
"countryCode": "US",
|
||||
"lat": 38.8358494,
|
||||
"lng": -94.1427229,
|
||||
"iso": "2026-04-27T21:06:10.626-05:00"
|
||||
},
|
||||
"loop": {
|
||||
"loopId": "5c0b221fdf9d450019c5e253",
|
||||
"users": [
|
||||
{
|
||||
"firstName": "Erin",
|
||||
"lastName": "Picone",
|
||||
"phoneticName": "Erin",
|
||||
"gender": "female",
|
||||
"birthdate": 649209600000,
|
||||
"id": "5c0b221fdf9d450019c5e255",
|
||||
"accountId": "5c0b20547c46170019235759"
|
||||
}
|
||||
],
|
||||
"jibo": {
|
||||
"color": "WHITE",
|
||||
"birthdate": 1544234645598,
|
||||
"id": "5c0b221fdf9d450019c5e254"
|
||||
},
|
||||
"owner": "5c0b221fdf9d450019c5e255"
|
||||
},
|
||||
"dialog": {
|
||||
"referent": null
|
||||
}
|
||||
},
|
||||
"skill": {
|
||||
"id": null
|
||||
},
|
||||
"general": {
|
||||
"release": "1.9.2"
|
||||
}
|
||||
}
|
||||
},
|
||||
"binary": null,
|
||||
"expectedReplyTypes": []
|
||||
}
|
||||
]
|
||||
}
|
||||
718
tmp/jibo-test-40/jibo test 40.txt
Normal file
718
tmp/jibo-test-40/jibo test 40.txt
Normal file
@@ -0,0 +1,718 @@
|
||||
|
||||
2026-05-11T11:35:27.200Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:35:27.218Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/greetings @be/surprises
|
||||
2026-05-11T11:35:27.220Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/greetings
|
||||
2026-05-11T11:35:27.221Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/greetings
|
||||
2026-05-11T11:35:27.223Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/greetings
|
||||
2026-05-11T11:35:27.224Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.226Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/greetings
|
||||
2026-05-11T11:35:27.227Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/surprises { lastSkill: '@be/greetings', asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.243Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/surprises
|
||||
2026-05-11T11:35:27.249Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/surprises''
|
||||
2026-05-11T11:35:27.253Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/surprises''
|
||||
2026-05-11T11:35:27.255Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:35:27.256Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/surprises
|
||||
2026-05-11T11:35:27.257Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/surprises { lastSkill: '@be/greetings', asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.258Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/greetings @be/surprises { lastSkill: '@be/greetings', asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.261Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/surprises
|
||||
2026-05-11T11:35:27.262Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/surprises
|
||||
2026-05-11T11:35:27.264Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.266Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/surprises { lastSkill: '@be/greetings', asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.455Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SurprisesDate: Contextual Priority step 1
|
||||
2026-05-11T11:35:27.466Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.478Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SurprisesDate: Contextual Priority step 2
|
||||
2026-05-11T11:35:27.554Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Surprises: No Eos categories participating
|
||||
2026-05-11T11:35:27.557Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Surprises: No EoS category selected
|
||||
2026-05-11T11:35:27.562Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T06:35:27.618301-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,warning]: - P.SystemManager.SkillManager: SkillManager::refresh Error reading package file for @be: File not found
|
||||
2026-05-11T11:35:27.652Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T11:35:27.564Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:35:27.571Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/surprises @be/idle
|
||||
2026-05-11T11:35:27.573Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/surprises
|
||||
2026-05-11T11:35:27.574Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/surprises
|
||||
2026-05-11T11:35:27.575Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Surprises: Exiting
|
||||
2026-05-11T11:35:27.578Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/surprises
|
||||
2026-05-11T11:35:27.583Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.585Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/surprises
|
||||
2026-05-11T11:35:27.586Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.599Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T11:35:27.609Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:35:27.611Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:35:27.614Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.616Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Evaluating trigger source: SURPRISE with looperID: null
|
||||
2026-05-11T11:35:27.621Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalRateLimiterStatus: Failed: EARLY MORNING has 0 triggers remaining
|
||||
2026-05-11T11:35:27.623Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.OpportunityDetector: Failed an inhibitor
|
||||
2026-05-11T11:35:27.624Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:35:27.625Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T11:35:27.627Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.639Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/surprises @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.647Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T11:35:27.652Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T11:35:27.653Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:35:27.655Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T11:35:27.656Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T11:35:27.657Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T11:35:27.659Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T11:35:27.661Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T11:35:27.667Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:35:27.671Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T11:35:27.672Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T11:35:27.676Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T11:35:27.743Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T06:35:28.271540-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32205 80:69:1a:8b:a0:e3
|
||||
2026-05-11T06:35:28.271817-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32206 86:69:1a:8b:a0:e3
|
||||
2026-05-11T06:35:30.400797-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,warning]: - P.SystemManager: HTTPHandlerAdapter:: std Exception. JSON Parsing failed - provided NVP (_id) not found
|
||||
2026-05-11T11:35:30.403Z Royal-Current-Sage-Canvas ssm[937,err]: [0@1 frames="[{\"method\":\"Object.parse\",\"filename\":\"native\",\"line\":null,\"column\":null},{\"method\":\"request.onreadystatechange\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/jibo-service-clients/lib/jibo-service-clients.js\",\"line\":1583,\"column\":37},{\"method\":\"dispatchEvent\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":591,\"column\":25},{\"method\":\"setState\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":610,\"column\":14},{\"method\":\"IncomingMessage.<anonymous>\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":447,\"column\":13},{\"method\":\"emitNone\",\"filename\":\"events.js\",\"line\":91,\"column\":20},{\"method\":\"IncomingMessage.emit\",\"filename\":\"events.js\",\"line\":185,\"column\":7},{\"method\":\"endReadableNT\",\"filename\":\"_stream_readable.js\",\"line\":974,\"column\":12},{\"method\":\"_combinedTickCallback\",\"filename\":\"internal/process/next_tick.js\",\"line\":74,\"column\":11},{\"method\":\"process._tickDomainCallback\",\"filename\":\"internal/process/next_tick.js\",\"line\":122,\"column\":9}\]" message="Unexpected end of JSON input"][versions@1 release="1.9.2"] T.Unhandled: Unexpected end of JSON input
|
||||
2026-05-11T06:36:30.298339-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-11T06:36:34.299802-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32215 30:23:03:3f:51:e5
|
||||
2026-05-11T06:36:34.300295-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32216 68:f0:bc:c6:99:04
|
||||
2026-05-11T06:36:34.300575-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-11T06:37:27.620363-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,warning]: - P.SystemManager.SkillManager: SkillManager::refresh Error reading package file for @be: File not found
|
||||
2026-05-11T06:37:28.322240-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32211 36:23:03:3f:51:e5
|
||||
2026-05-11T06:37:28.322651-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32204 fc:9c:98:59:45:de
|
||||
2026-05-11T06:37:30.622969-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,warning]: - P.SystemManager: HTTPHandlerAdapter:: std Exception. JSON Parsing failed - provided NVP (_id) not found
|
||||
2026-05-11T11:37:30.624Z Royal-Current-Sage-Canvas ssm[937,err]: [0@1 frames="[{\"method\":\"Object.parse\",\"filename\":\"native\",\"line\":null,\"column\":null},{\"method\":\"request.onreadystatechange\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/jibo-service-clients/lib/jibo-service-clients.js\",\"line\":1583,\"column\":37},{\"method\":\"dispatchEvent\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":591,\"column\":25},{\"method\":\"setState\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":610,\"column\":14},{\"method\":\"IncomingMessage.<anonymous>\",\"filename\":\"/usr/local/bin/jibo-ssm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js\",\"line\":447,\"column\":13},{\"method\":\"emitNone\",\"filename\":\"events.js\",\"line\":91,\"column\":20},{\"method\":\"IncomingMessage.emit\",\"filename\":\"events.js\",\"line\":185,\"column\":7},{\"method\":\"endReadableNT\",\"filename\":\"_stream_readable.js\",\"line\":974,\"column\":12},{\"method\":\"_combinedTickCallback\",\"filename\":\"internal/process/next_tick.js\",\"line\":74,\"column\":11},{\"method\":\"process._tickDomainCallback\",\"filename\":\"internal/process/next_tick.js\",\"line\":122,\"column\":9}\]" message="Unexpected end of JSON input"][versions@1 release="1.9.2"] T.Unhandled: Unexpected end of JSON input
|
||||
2026-05-11T06:38:34.343102-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-11T06:38:38.345935-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32217 30:23:03:95:2b:b8
|
||||
2026-05-11T06:38:38.346320-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32218 80:69:1a:95:0b:6e
|
||||
2026-05-11T06:38:38.346599-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32219 52:06:f5:3e:83:89
|
||||
2026-05-11T06:38:38.346855-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32220 d6:e2:2f:ea:3e:fb
|
||||
2026-05-11T06:38:38.347121-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32221 80:69:1a:8b:a0:e3
|
||||
2026-05-11T06:38:38.347393-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32222 fc:9c:98:59:45:de
|
||||
2026-05-11T06:38:38.347544-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32223 30:23:03:d6:cf:c1
|
||||
2026-05-11T06:38:38.347726-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-11T06:39:19.857053-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,warning]: - P.Application.ServerPort: ServerPort[2]::onReadable Disconnecting because of socket exception: Connection reset by peer
|
||||
2026-05-11T06:39:19.857784-05:00 Royal-Current-Sage-Canvas jibo-server-service[30227,alert]: - P.ServiceApp: Terminate with Poco exception: I/O error: Broken pipe: 32
|
||||
2026-05-11T06:39:19.858357-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.ServiceManager.Service: server: terminate called after throwing an instance of 'Poco::IOException'
|
||||
2026-05-11T11:39:19.876Z Royal-Current-Sage-Canvas scs[891,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T11:39:19.882Z Royal-Current-Sage-Canvas scs[891,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T11:39:19.885Z Royal-Current-Sage-Canvas ssm[937,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T11:39:19.926Z Royal-Current-Sage-Canvas ssm[937,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T11:39:19.890Z Royal-Current-Sage-Canvas mms[856,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T11:39:19.948Z Royal-Current-Sage-Canvas mms[856,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T06:39:19.954615-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.Service.Monitor: Service server exited with code 0
|
||||
2026-05-11T11:39:19.887Z Royal-Current-Sage-Canvas STS[920,warning]: [versions@1 release="1.9.2"] P.SF.Client.WSClient: socket closed 1006
|
||||
2026-05-11T11:39:19.967Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications/status closed 1006
|
||||
2026-05-11T11:39:19.973Z Royal-Current-Sage-Canvas STS[920,warning]: [versions@1 release="1.9.2"] P.SF.Client.WSClient: socket closed 1006
|
||||
2026-05-11T11:39:19.975Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.SF.Client.WSClient: socket ws://127.0.0.1:8888/server/notifications closed 1006
|
||||
2026-05-11T06:39:20.625147-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.Service.Monitor: Service server launched with PID 1650
|
||||
2026-05-11T06:39:20.861233-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,warning]: - P.ServiceRegistryClient: ServiceRegistryClient::registerService error: Bad Request
|
||||
2026-05-11T06:39:21.703028-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-11T06:39:21.703453-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,info]: - P.ServiceApp: Chronometer timestamp: 862359 s, 112405 us
|
||||
2026-05-11T06:39:23.927737-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-11T11:39:25.296Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Added L2-Cannot_connect_to_server
|
||||
2026-05-11T11:39:25.723Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Added Q4-Server_connection_lost
|
||||
2026-05-11T11:39:25.749Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:25.759Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:25.763Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:39:25.847Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T11:39:25.882Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to OFF
|
||||
2026-05-11T11:39:25.769Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/settings
|
||||
2026-05-11T11:39:25.771Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T11:39:25.772Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T11:39:25.928Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.HttpHandler: Handling JetHttpHandler:/listen/set_hj_mode
|
||||
2026-05-11T11:39:25.929Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_SET_HJ_MODE
|
||||
2026-05-11T11:39:25.929Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_SET_HJ_MODE in 0 ms.
|
||||
2026-05-11T11:39:25.773Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T11:39:25.775Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T11:39:25.777Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T11:39:25.785Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T11:39:25.787Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:39:25.792Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T11:39:25.794Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:25.820Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/settings
|
||||
2026-05-11T11:39:25.824Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/settings''
|
||||
2026-05-11T11:39:25.828Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/settings''
|
||||
2026-05-11T11:39:25.832Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:39:25.834Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/settings
|
||||
2026-05-11T11:39:25.836Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:25.840Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:25.845Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/settings
|
||||
2026-05-11T11:39:25.850Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/settings
|
||||
2026-05-11T11:39:25.851Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:39:25.859Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: SubSkill Launched
|
||||
2026-05-11T11:39:25.889Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:39:25.892Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/settings { nlu: \n { intent: 'launch',\n entities: { skill: '@be/settings', errorId: 'Q4-Server_connection_lost' },\n rules: null },\n asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:27.583Z Royal-Current-Sage-Canvas be[1017,err]: [1@1 frames="[{\"method\":\"XMLHttpRequest.request.onreadystatechange.e\",\"filename\":\"/opt/jibo/Jibo/Skills/@be/be/node_modules/jibo-service-clients/lib/jibo-service-clients.js\",\"line\":1046,\"column\":33}\]" message="Scheduler.otaCheckUpdates response is not JSON. Timed out or bad format? SyntaxError: Unexpected end of JSON input"][versions@1 release="1.9.2"] T.Be.SurprisesOta: error checking for updates Scheduler.otaCheckUpdates response is not JSON. Timed out or bad format? SyntaxError: Unexpected end of JSON input
|
||||
2026-05-11T06:39:38.381479-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32208 80:69:1a:8b:a2:b8
|
||||
2026-05-11T06:39:38.382564-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32209 80:69:1a:8b:a0:e4
|
||||
2026-05-11T06:39:38.383015-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32212 30:23:03:95:2b:b7
|
||||
2026-05-11T06:39:38.383356-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32214 86:69:1a:95:0b:6d
|
||||
2026-05-11T06:39:38.383616-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32213 80:69:1a:95:0b:6d
|
||||
2026-05-11T06:39:38.384090-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32215 30:23:03:3f:51:e5
|
||||
2026-05-11T06:39:38.384556-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32210 30:23:03:3f:51:e6
|
||||
2026-05-11T06:39:38.384954-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32207 30:23:03:d6:ca:1c
|
||||
2026-05-11T06:39:38.385275-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-REMOVED 32216 68:f0:bc:c6:99:04
|
||||
2026-05-11T06:39:39.406976-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,err]: - P.NotificationSubsystem: NotificationSubsystem::connect Failed to connect to the server: Could not request robot token: Connection refused
|
||||
2026-05-11T11:39:46.191Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14237
|
||||
2026-05-11T11:39:46.634Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14237
|
||||
2026-05-11T11:39:46.639Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T06:39:46.799300-05:00 Royal-Current-Sage-Canvas jibo-identity-service[663,info]: - P.ImageIdentifier: ImageIdentifier[deepid]::identify [["5c0b221fdf9d450019c5e255", "face", 0.677977]]
|
||||
2026-05-11T06:39:46.823421-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: face with 1 hypotheses
|
||||
2026-05-11T06:39:46.823506-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure face Quality:1 Id: 5c0b221fdf9d450019c5e255 Conf: 0.677977
|
||||
2026-05-11T06:39:46.823592-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 1 inputs.
|
||||
2026-05-11T06:39:46.823658-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.463295 Op: NOT_TRAINED Score: 0.3
|
||||
2026-05-11T06:39:46.823705-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.463295 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T06:39:46.823744-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion CHANGING identity from UNKNOWN to 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T11:39:46.883Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Emitting idAcquired from source: FACE
|
||||
2026-05-11T11:39:46.888Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: ID_ACQUIRED
|
||||
2026-05-11T11:39:51.119Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14237
|
||||
2026-05-11T11:39:53.444Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14237
|
||||
2026-05-11T11:39:53.448Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T06:39:54.631071-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,info]: - P.NotificationSubsystem: NotificationSubsystem::connect Connecting to api-socket.jibo.com:443/token-Royal-Current-Sage-Canvas-1778499594574
|
||||
2026-05-11T06:39:54.802162-05:00 Royal-Current-Sage-Canvas jibo-server-service[1650,info]: - P.NotificationSubsystem: NotificationSubsystem::connect established connection to server
|
||||
2026-05-11T11:39:55.712Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Removed L2-Cannot_connect_to_server
|
||||
2026-05-11T11:39:55.718Z Royal-Current-Sage-Canvas ssm[937,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Error.Logger: Removed Q4-Server_connection_lost
|
||||
2026-05-11T11:39:55.732Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: error resolved: Q4-Server_connection_lost
|
||||
2026-05-11T11:39:55.738Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: no more errors!
|
||||
2026-05-11T11:39:55.765Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Be: REDIRECT: skill redirect: @be/idle {}
|
||||
2026-05-11T11:39:55.782Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from OFF to ENGAGED
|
||||
2026-05-11T06:39:55.788232-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: { "tts": { "stop_request" : "Calling TTS stop" } }
|
||||
2026-05-11T11:39:55.767Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:55.768Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:39:55.772Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/settings @be/idle
|
||||
2026-05-11T11:39:55.822Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.HttpHandler: Handling JetHttpHandler:/listen/set_hj_mode
|
||||
2026-05-11T11:39:55.823Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_SET_HJ_MODE
|
||||
2026-05-11T11:39:55.823Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_SET_HJ_MODE in 0 ms.
|
||||
2026-05-11T11:39:55.773Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/settings
|
||||
2026-05-11T11:39:55.776Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/settings
|
||||
2026-05-11T11:39:55.778Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Settings.error: SubSkill killed before its time
|
||||
2026-05-11T11:39:56.348Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/settings
|
||||
2026-05-11T11:39:56.393Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T11:39:56.350Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:39:56.355Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/settings
|
||||
2026-05-11T11:39:56.357Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:56.372Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T11:39:56.374Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:39:56.376Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:39:56.382Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:39:56.383Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T11:39:56.385Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:56.386Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/settings @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:56.391Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T11:39:56.393Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T11:39:56.394Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning null speaker due to staleness.
|
||||
2026-05-11T11:39:56.396Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T11:39:56.397Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T11:39:56.398Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T11:39:56.403Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T11:39:56.404Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T11:39:56.408Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:39:56.940Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T11:39:56.941Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T11:39:56.947Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T11:39:57.012Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T11:39:57.153Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Idle Face
|
||||
2026-05-11T11:39:57.938Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Proactive.SignalFacePersisted: Persisting face entity ID 14237 has an identity of 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T06:40:00.558958-05:00 Royal-Current-Sage-Canvas crond[159,info]: - USER root pid 1668 cmd /usr/bin/random_logrotate
|
||||
2026-05-11T06:40:00.575119-05:00 Royal-Current-Sage-Canvas crond[159,info]: - USER root pid 1669 cmd /usr/bin/jibo-system-monitor --p --c --m --s --n
|
||||
2026-05-11T11:40:01.062Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 231 walign: B020C088 palign: B0221A00 {"word_alignment":"862363584 862363712 hey 0.00 862363712 862364032 jibo 0.00 "}
|
||||
2026-05-11T11:40:01.062Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 0 dB
|
||||
2026-05-11T11:40:01.062Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: hjw_JM_RECOG_HJ_EVENT
|
||||
2026-05-11T06:40:01.064108-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862398,473133],"type":"hotphrase","id":331,"location":{"ts":[862398,273007],"possibilities":[{"channels":[0,12],"position":{"x":0.6720646619796753,"y":0.7391827702522278,"z":0.32067692279815676},"confidence":0.16855651140213014}]},"utterances":[]}
|
||||
2026-05-11T11:40:01.062Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 862363584
|
||||
2026-05-11T11:40:01.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Entering PH-W state
|
||||
2026-05-11T11:40:01.066Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 4 ms.
|
||||
2026-05-11T11:40:01.081Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T11:40:01.126Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T11:40:01.153Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T11:40:01.143Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T11:40:01.220Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.6720646619796753,\n y: 0.7391827702522278,\n z: 0.32067692279815674 } 14237
|
||||
2026-05-11T11:40:01.239Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T06:40:01.265132-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 0. /dev/root (mounted on /) is 70% full
|
||||
2026-05-11T06:40:01.265290-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 2. tmpfs (mounted on /dev/shm) is 2% full
|
||||
2026-05-11T06:40:01.265376-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 3. tmpfs (mounted on /tmp) is 2% full
|
||||
2026-05-11T06:40:01.265434-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 4. /dev/mmcblk0p4 (mounted on /usr/local) is 42% full
|
||||
2026-05-11T06:40:01.265491-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 5. /dev/mmcblk0p5 (mounted on /var) is 11% full
|
||||
2026-05-11T06:40:01.265554-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 6. tmpfs (mounted on /tmp) is 2% full
|
||||
2026-05-11T06:40:01.265644-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 7. /dev/mmcblk0p6 (mounted on /opt) is 11% full
|
||||
2026-05-11T06:40:01.265696-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 8. tmpfs (mounted on /run) is 0% full
|
||||
2026-05-11T06:40:01.266000-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Filesystem: Mount point 1. devtmpfs (mounted on /dev) is 0% full
|
||||
2026-05-11T11:40:01.271Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T11:40:01.274Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Command Look
|
||||
2026-05-11T11:40:01.362Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 14.7182 accepted: 1
|
||||
2026-05-11T11:40:01.362Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-11T11:40:01.363Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 1 ms.
|
||||
2026-05-11T06:40:01.364381-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862398,773427],"type":"jet_speaker_id","id":331,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":14.71823501586914,"accepted":true,"high_confidence":true}],"snr":27.040088653564454}}
|
||||
2026-05-11T06:40:01.368891-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-11T06:40:01.368978-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:27.0401 Id: 5c0b221fdf9d450019c5e255 Conf: 14.7182
|
||||
2026-05-11T06:40:01.369055-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 2 inputs.
|
||||
2026-05-11T06:40:01.369168-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.5 Op: NOT_TRAINED Score: 0.15
|
||||
2026-05-11T06:40:01.369225-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.5 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T06:40:01.369273-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion REFRESH identity as 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T11:40:01.387Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 14.71823501586914
|
||||
2026-05-11T11:40:01.391Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T06:40:01.467206-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: CPU: Uptime: 1 week, 2 days, 23 hours,
|
||||
2026-05-11T06:40:01.467231-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: CPU: Current load average: 10.27, 8.93, 8.78
|
||||
2026-05-11T06:40:01.467276-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: CPU: Number of users logged in: 2 users
|
||||
2026-05-11T06:40:01.467814-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: CPU: Current date: Mon May 11 2026 06:40:01 GMT-0500 (CDT)
|
||||
2026-05-11T06:40:01.541680-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Platform process: jibo-service-registry | Mem: 3472 (RSS), Uptime: 9d:23h:32m:16s (862336026)
|
||||
2026-05-11T06:40:01.592799-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Platform process: jibo-system-manager | Mem: 7248 (RSS), Uptime: 9d:23h:32m:16s (862336074)
|
||||
2026-05-11T06:40:01.628384-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Platform process: jibo-body-service | Mem: 4568 (RSS), Uptime: 9d:23h:32m:16s (862336111)
|
||||
2026-05-11T06:40:01.668166-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Platform process: jibo-audio-service | Mem: 11m (RSS), Uptime: 9d:23h:32m:16s (862336150)
|
||||
2026-05-11T06:40:01.783014-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Platform process: jibo-identity-service | Mem: 117m (RSS), Uptime: 9d:23h:32m:49s (862369768)
|
||||
2026-05-11T06:40:01.880412-05:00 Royal-Current-Sage-Canvas system-monitor[1671,info]: - P.SystemMonitor: Error trying to examine memory usage: Command failed: ps -o pid,rss,args | grep [^]]jibo-nlu-service
|
||||
2026-05-11T11:40:01.939Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,warning]: - C.Jibohub_client.Connection: Socket to HUB opened in >500ms.
|
||||
2026-05-11T11:40:01.939Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T11:40:01.940Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T11:40:01.940Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="1.000000" requestID="GLOBAL" transID="tid-250d544c-4d2e-11f1-a452-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T11:40:01.943Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T11:40:02.077Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 137 ms.
|
||||
2026-05-11T11:40:02.090Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T11:40:02.418Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T11:40:02.450Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14237
|
||||
2026-05-11T11:40:02.451Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: 11
|
||||
2026-05-11T11:40:02.456Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T11:40:02.453Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: true
|
||||
2026-05-11T11:40:02.469Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:03.217Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Idle Face
|
||||
2026-05-11T11:40:07.415Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T11:40:07.416Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 1 ms.
|
||||
2026-05-11T11:40:07.416Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T11:40:07.416Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 0 ms.
|
||||
2026-05-11T11:40:07.419Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-250d544c-4d2e-11f1-a452-5cf821ea55ae',\n data: \n ListenResult {\n asr: \n { confidence: 0.95,\n final: true,\n text: 'So, what\'s the weather?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'weather',\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T11:40:07.431Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: \n { confidence: 0.95,\n final: true,\n text: 'So, what\'s the weather?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'weather',\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-250d544c-4d2e-11f1-a452-5cf821ea55ae' }
|
||||
2026-05-11T11:40:07.440Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T11:40:07.452Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.457Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.547Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T11:40:07.550Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T11:40:07.551Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 1 ms.
|
||||
2026-05-11T11:40:07.460Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:40:07.466Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T11:40:07.467Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T11:40:07.468Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T11:40:07.469Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T11:40:07.471Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T11:40:07.473Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T06:40:07.718147-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-11T06:40:07.718470-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - 71d433a5-2fea-45df-a0f7-19ef6d597618
|
||||
2026-05-11T06:40:07.719027-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - 71d433a5-2fea-45df-a0f7-19ef6d597618
|
||||
2026-05-11T11:40:07.478Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T11:40:07.481Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T06:40:07.757917-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-11T06:40:07.758307-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - b15fcf3e-1dc4-4eb6-9c57-8de3a7119c69
|
||||
2026-05-11T06:40:07.759409-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - b15fcf3e-1dc4-4eb6-9c57-8de3a7119c69
|
||||
2026-05-11T11:40:07.483Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T06:40:07.834193-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-11T06:40:07.835218-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> right now in Lone Jack , it is clear sky and 48 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T11:40:07.484Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.501Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T11:40:07.520Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:40:07.523Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:40:07.530Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:07.532Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-11T11:40:07.535Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.540Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.548Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-11T11:40:07.550Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T11:40:07.554Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-11T11:40:07.567Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T11:40:07.568Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:07.577Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-11T11:40:07.578Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T11:40:07.583Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-11T11:40:07.584Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T11:40:07.588Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: WeatherCommentClearDay_AN_13
|
||||
2026-05-11T11:40:07.653Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:07.687Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T11:40:07.691Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-11T11:40:07.694Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: b4e2a842-1f4b-4973-bd41-943ed2a91e1c
|
||||
2026-05-11T06:40:07.863728-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-11T06:40:08.026016-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - f79c84a4-95fd-4404-a20f-029644cef27f
|
||||
2026-05-11T11:40:08.128Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T11:40:08.157Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T11:40:08.171Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-11T11:40:08.174Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: b4e2a842-1f4b-4973-bd41-943ed2a91e1c
|
||||
2026-05-11T06:40:08.215155-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 582f7c82-c8a4-4430-b8b2-e48ca4b5e992
|
||||
2026-05-11T06:40:08.215270-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> right now in Lone Jack , it is clear sky and 48 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-11T06:40:08.215514-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 582f7c82-c8a4-4430-b8b2-e48ca4b5e992
|
||||
2026-05-11T06:40:08.215550-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T11:40:08.887Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T06:40:12.711639-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 582f7c82-c8a4-4430-b8b2-e48ca4b5e992
|
||||
2026-05-11T11:40:12.761Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14237
|
||||
2026-05-11T11:40:13.607Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Speaking Primary Face
|
||||
2026-05-11T11:40:13.642Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T11:40:14.480Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: b4e2a842-1f4b-4973-bd41-943ed2a91e1c
|
||||
2026-05-11T11:40:14.483Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T11:40:14.497Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: b4e2a842-1f4b-4973-bd41-943ed2a91e1c
|
||||
2026-05-11T11:40:14.501Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T11:40:14.503Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T11:40:14.507Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T11:40:14.511Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:14.523Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:14.526Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:40:14.545Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T11:40:14.583Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T11:40:14.546Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T11:40:14.548Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T11:40:14.548Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T11:40:14.551Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T11:40:14.552Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:14.553Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T11:40:14.554Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:14.564Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T11:40:14.568Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:40:14.570Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:40:14.573Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:14.575Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T11:40:14.576Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:14.577Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:14.581Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T11:40:14.583Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T11:40:14.584Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:14.586Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T11:40:14.588Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T11:40:14.589Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T11:40:14.590Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T11:40:14.591Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T11:40:14.595Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:14.600Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T11:40:14.602Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T11:40:14.604Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T11:40:14.658Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T11:40:15.206Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 157 walign: B020C088 palign: B0221A00 {"word_alignment":"862377728 862377856 hey 0.00 862377856 862378176 jibo 0.00 "}
|
||||
2026-05-11T11:40:15.206Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 2.7305 dB
|
||||
2026-05-11T11:40:15.207Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_HJ_EVENT
|
||||
2026-05-11T11:40:15.208Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 862377728
|
||||
2026-05-11T06:40:15.209008-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862412,618059],"type":"hotphrase","id":332,"location":{"ts":[862412,420591],"possibilities":[{"channels":[0,12],"position":{"x":0.6347081661224365,"y":0.7541671395301819,"z":0.3928443491458893},"confidence":0.13513951003551484}]},"utterances":[]}
|
||||
2026-05-11T11:40:15.209Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 2 ms.
|
||||
2026-05-11T11:40:15.210Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n message: '',\n status: 'INTERRUPTED',\n transID: 'tid-250d544c-4d2e-11f1-a452-5cf821ea55ae' }
|
||||
2026-05-11T11:40:15.212Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T11:40:15.245Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T11:40:15.231Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T11:40:15.240Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T11:40:15.258Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.6347081661224365,\n y: 0.7541671395301819,\n z: 0.3928443491458893 } null
|
||||
2026-05-11T11:40:15.264Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T11:40:15.277Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T11:40:15.278Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Command Look
|
||||
2026-05-11T11:40:15.449Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T11:40:15.449Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T11:40:15.449Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="1.369383" requestID="GLOBAL" transID="tid-2d7b449a-4d2e-11f1-9417-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T11:40:15.450Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 1 ms.
|
||||
2026-05-11T11:40:15.451Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T11:40:15.456Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T11:40:15.558Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 13.3411 accepted: 1
|
||||
2026-05-11T11:40:15.559Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-11T06:40:15.560648-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862412,969715],"type":"jet_speaker_id","id":332,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":13.341072082519532,"accepted":true,"high_confidence":true}],"snr":26.09933090209961}}
|
||||
2026-05-11T06:40:15.561983-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-11T06:40:15.562065-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:26.0993 Id: 5c0b221fdf9d450019c5e255 Conf: 13.3411
|
||||
2026-05-11T06:40:15.562157-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 3 inputs.
|
||||
2026-05-11T06:40:15.562235-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.333333 Op: NOT_TRAINED Score: 0.1
|
||||
2026-05-11T06:40:15.562289-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.333333 Best ID: 5c0b221fdf9d450019c5e255
|
||||
2026-05-11T06:40:15.562339-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion NO CHANGE.
|
||||
2026-05-11T11:40:15.566Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 13.341072082519531
|
||||
2026-05-11T11:40:15.568Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T11:40:15.644Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 85 ms.
|
||||
2026-05-11T11:40:16.842Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T11:40:17.210Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 14237
|
||||
2026-05-11T11:40:19.114Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Demand Face Detect found 1 faces
|
||||
2026-05-11T11:40:19.256Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (position based): 14239
|
||||
2026-05-11T11:40:19.273Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Expression.Base.ResolveHandle: Someone tried to cancel ResolveHandle after it was resolved!
|
||||
2026-05-11T11:40:19.289Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T11:40:19.296Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T11:40:19.299Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Command Look
|
||||
2026-05-11T11:40:20.399Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T11:40:20.407Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Primary face selected (entity match): 14239
|
||||
2026-05-11T11:40:20.791Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T11:40:20.792Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 1 ms.
|
||||
2026-05-11T11:40:20.792Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T11:40:20.792Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 0 ms.
|
||||
2026-05-11T11:40:20.793Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-2d7b449a-4d2e-11f1-9417-5cf821ea55ae',\n data: \n ListenResult {\n asr: \n { confidence: 0.95,\n final: true,\n text: 'What\'s the forecast this week?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'weather',\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T11:40:20.818Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T11:40:20.799Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: \n { confidence: 0.95,\n final: true,\n text: 'What\'s the forecast this week?' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'weather',\n intent: 'weather',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-2d7b449a-4d2e-11f1-9417-5cf821ea55ae' }
|
||||
2026-05-11T11:40:20.808Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T11:40:20.812Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient: event waiter 'HJ Listen Complete'
|
||||
2026-05-11T11:40:20.814Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: 4015
|
||||
2026-05-11T11:40:20.909Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T11:40:20.910Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 1 ms.
|
||||
2026-05-11T11:40:20.920Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T11:40:20.815Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: false
|
||||
2026-05-11T11:40:20.830Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.832Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.833Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:40:20.839Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:20.842Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T11:40:20.843Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T06:40:21.004442-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-11T06:40:21.004864-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - 75b6fc61-b942-4443-83ba-77247eb1f7d9
|
||||
2026-05-11T06:40:21.005760-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - 75b6fc61-b942-4443-83ba-77247eb1f7d9
|
||||
2026-05-11T06:40:21.029109-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-11T11:40:20.844Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T06:40:21.029613-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - 0549664a-8bfd-43de-9878-420cf6d7b5d5
|
||||
2026-05-11T11:40:20.845Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T06:40:21.031710-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - 0549664a-8bfd-43de-9878-420cf6d7b5d5
|
||||
2026-05-11T06:40:21.062743-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-11T06:40:21.064025-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> later this week in Lone Jack , US , expect clear sky with a high near 73 degrees Fahrenheit and a low around 51 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T11:40:20.847Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T11:40:20.851Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T11:40:20.858Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T11:40:20.859Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:20.861Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T11:40:20.863Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.883Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T11:40:20.901Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:40:20.904Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:40:20.909Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:20.911Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-11T11:40:20.912Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.916Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.921Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-11T11:40:20.925Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T11:40:20.927Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-11T11:40:20.931Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T11:40:20.932Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'weather',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:40:20.940Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-11T11:40:20.941Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T11:40:20.941Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-11T11:40:20.942Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T11:40:20.943Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: WeatherCommentClearDay_AN_13
|
||||
2026-05-11T11:40:20.983Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:20.994Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T11:40:20.996Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-11T11:40:20.997Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: 7d08079c-d787-4dc9-bbe3-b5f17ec1f591
|
||||
2026-05-11T06:40:21.124035-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-11T06:40:21.473272-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - 91bc9b15-2348-49dd-90df-84089fb29d1e
|
||||
2026-05-11T11:40:21.495Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T11:40:21.521Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T11:40:21.548Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-11T11:40:21.550Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: 7d08079c-d787-4dc9-bbe3-b5f17ec1f591
|
||||
2026-05-11T06:40:21.581755-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 134426f5-071b-44c7-b322-ef6979043766
|
||||
2026-05-11T06:40:21.581921-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> later this week in Lone Jack , US , expect clear sky with a high near 73 degrees Fahrenheit and a low around 51 degrees Fahrenheit . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-11T06:40:21.582113-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 134426f5-071b-44c7-b322-ef6979043766
|
||||
2026-05-11T06:40:21.582147-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T11:40:22.286Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION AttentionManager not trying to do lookat, we have no dofs!!
|
||||
2026-05-11T11:40:23.073Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face started 14239
|
||||
2026-05-11T11:40:23.075Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: VISIBLE_FACE_STARTED
|
||||
2026-05-11T11:40:23.981Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: visible face stopped 14239
|
||||
2026-05-11T11:40:23.983Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 14239
|
||||
2026-05-11T11:40:27.169Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Speaking Primary Face
|
||||
2026-05-11T06:40:30.215810-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 134426f5-071b-44c7-b322-ef6979043766
|
||||
2026-05-11T11:40:30.876Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: 7d08079c-d787-4dc9-bbe3-b5f17ec1f591
|
||||
2026-05-11T11:40:30.880Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T11:40:30.887Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: 7d08079c-d787-4dc9-bbe3-b5f17ec1f591
|
||||
2026-05-11T11:40:30.888Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T11:40:30.889Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T11:40:30.891Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T11:40:30.893Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:30.901Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:30.902Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:40:30.915Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T11:40:30.917Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T11:40:30.918Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T11:40:30.920Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T11:40:30.923Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T11:40:30.924Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:30.928Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T11:40:30.929Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:30.948Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T11:40:30.979Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T11:40:30.952Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:40:30.960Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:40:30.962Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:40:30.964Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T11:40:30.968Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:30.970Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:30.977Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T11:40:30.979Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T11:40:30.981Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:30.982Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T11:40:30.983Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T11:40:30.985Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T11:40:30.987Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T11:40:30.990Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T11:40:30.992Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:40:31.002Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T11:40:31.002Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T11:40:31.007Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T11:40:31.057Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T06:40:38.419548-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-STARTED
|
||||
2026-05-11T06:40:42.421072-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32224 ae:ae:19:ae:91:70
|
||||
2026-05-11T06:40:42.421330-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32225 80:69:1a:8b:a2:b7
|
||||
2026-05-11T06:40:42.421674-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32226 36:23:03:95:2b:b7
|
||||
2026-05-11T06:40:42.422064-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32227 30:23:03:d6:cf:c0
|
||||
2026-05-11T06:40:42.422295-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32228 b0:39:56:ea:f8:8e
|
||||
2026-05-11T06:40:42.422503-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-BSS-ADDED 32229 30:23:03:d6:ca:1d
|
||||
2026-05-11T06:40:42.422676-05:00 Royal-Current-Sage-Canvas jibo-system-manager[473,info]: - P.SystemManager.WPAControlInterface: <3>CTRL-EVENT-SCAN-RESULTS
|
||||
2026-05-11T11:40:47.219Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Emitting idLost from LPS: 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:40:57.110Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: utterance: hey jibo score: 136 walign: B020C088 palign: B0221A00 {"word_alignment":"862419584 862419776 hey 0.00 862419776 862420096 jibo 0.00 "}
|
||||
2026-05-11T11:40:57.110Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.RecLoop: HJ: signal sent to ASR will be boosted 3.54292 dB
|
||||
2026-05-11T11:40:57.110Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_HJ_EVENT
|
||||
2026-05-11T11:40:57.113Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_HJ_EVENT in 3 ms.
|
||||
2026-05-11T11:40:57.113Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecogSpeakerID: RecogSpeakerTD starting at 862419584
|
||||
2026-05-11T06:40:57.121024-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862454,529986],"type":"hotphrase","id":333,"location":{"ts":[862454,331723],"possibilities":[{"channels":[22],"position":{"x":0.4399375021457672,"y":0.7126182913780212,"z":0.7397737503051758},"confidence":0.0288059301674366},{"channels":[0],"position":{"x":0.9922960996627808,"y":-0.05850360170006752,"z":0.278069406747818},"confidence":0.015768807381391527}]},"utterances":[]}
|
||||
2026-05-11T11:40:57.118Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n message: '',\n status: 'INTERRUPTED',\n transID: 'tid-2d7b449a-4d2e-11f1-9417-5cf821ea55ae' }
|
||||
2026-05-11T11:40:57.121Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: hjHeard
|
||||
2026-05-11T11:40:57.183Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Hey Jibo'
|
||||
2026-05-11T11:40:57.207Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to COMMAND
|
||||
2026-05-11T11:40:57.190Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'HJOrient' to achieve goal 'Hey Jibo'
|
||||
2026-05-11T11:40:57.221Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.4399375021457672,\n y: 0.7126182913780212,\n z: 0.7397737503051758 } null
|
||||
2026-05-11T11:40:57.240Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Received attendToTarget request
|
||||
2026-05-11T11:40:57.226Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action: Initial face: { x: 0.9922960996627808,\n y: -0.05850360170006752,\n z: 0.278069406747818 } null
|
||||
2026-05-11T11:40:57.265Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.RecLoop: Speaker: 5c0b221fdf9d450019c5e255 score: 4.60773 accepted: 1
|
||||
2026-05-11T06:40:57.266875-05:00 Royal-Current-Sage-Canvas jibo-audio-service[642,notice]: - P.AudioService: detection: {"ts":[862454,675882],"type":"jet_speaker_id","id":333,"data":{"speakers":[{"speaker":"5c0b221fdf9d450019c5e255","score":4.607728958129883,"accepted":true,"high_confidence":true}],"snr":19.992563247680665}}
|
||||
2026-05-11T11:40:57.265Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_RECOG_SPEAKER_EVENT
|
||||
2026-05-11T11:40:57.266Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_RECOG_SPEAKER_EVENT in 1 ms.
|
||||
2026-05-11T06:40:57.273065-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-11T06:40:57.273921-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:19.9926 Id: 5c0b221fdf9d450019c5e255 Conf: 4.60773
|
||||
2026-05-11T06:40:57.274149-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measurement failed ratio test.
|
||||
2026-05-11T06:40:57.274633-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 1 inputs.
|
||||
2026-05-11T06:40:57.274862-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.0847142 Op: NOT_TRAINED Score: 0.0899554
|
||||
2026-05-11T06:40:57.275088-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.0899554 Best ID: NOT_TRAINED
|
||||
2026-05-11T06:40:57.275317-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion CHANGING identity from UNKNOWN to NOT_TRAINED
|
||||
2026-05-11T11:40:57.276Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter.ConvTechSpeakerID: Speaker ID: 5c0b221fdf9d450019c5e255 | accepted: true | confidence: true | score: 4.607728958129883
|
||||
2026-05-11T11:40:57.279Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Emitting idAcquired from source: VOICE
|
||||
2026-05-11T11:40:57.282Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Emotion.Appraisal.IdentityRule: Appraising data from identity data: ID_ACQUIRED
|
||||
2026-05-11T11:40:57.284Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Most recent speaker accepted.
|
||||
2026-05-11T11:40:57.303Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look rule has fired!
|
||||
2026-05-11T06:40:57.335030-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::measure input from: voice with 1 hypotheses
|
||||
2026-05-11T06:40:57.335177-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measure voice Quality:19.9926 Id: 5c0b221fdf9d450019c5e255 Conf: 4.60773
|
||||
2026-05-11T06:40:57.335271-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity::Measurement failed ratio test.
|
||||
2026-05-11T06:40:57.335374-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion with 2 options from 2 inputs.
|
||||
2026-05-11T06:40:57.335494-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion::updateIdentity Op: 5c0b221fdf9d450019c5e255 Score: 0.0423571 Op: NOT_TRAINED Score: 0.0449777
|
||||
2026-05-11T06:40:57.335580-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: Identity Update Best Score: 0.0449777 Best ID: NOT_TRAINED
|
||||
2026-05-11T06:40:57.335652-05:00 Royal-Current-Sage-Canvas jibo-lps-service[725,info]: - P.IdentityFusion: IdentityFusion NO CHANGE.
|
||||
2026-05-11T11:40:57.306Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Switched Attention Rule:Command Look
|
||||
2026-05-11T11:40:57.989Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,warning]: - C.Jibohub_client.Connection: Socket to HUB opened in >500ms.
|
||||
2026-05-11T11:40:57.990Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.LhubClient: Hub Client connection opened.
|
||||
2026-05-11T11:40:57.990Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_CLIENT_CONNECT_RESULT
|
||||
2026-05-11T11:40:57.991Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: [messageContext@1 gain="1.503647" requestID="GLOBAL" transID="tid-46754112-4d2e-11f1-b43d-5cf821ea55ae"] C.Jetstream.LhubClient: Hub LISTEN request keystone log entry
|
||||
2026-05-11T11:40:58.000Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,debug]: - C.Jetstream.LhubClient: Set Audio encoder to type: OGG_OPUS
|
||||
2026-05-11T11:40:58.032Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION attendToTarget Command Look resolving with status:SUCCEEDED
|
||||
2026-05-11T11:40:58.154Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_CLIENT_CONNECT_RESULT in 164 ms.
|
||||
2026-05-11T11:40:58.168Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnStarted
|
||||
2026-05-11T11:41:01.129Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from COMMAND to IDLE
|
||||
2026-05-11T11:41:01.120Z Royal-Current-Sage-Canvas be[1017,warning]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: Wait for signals timed out.
|
||||
2026-05-11T11:41:01.122Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Expression.Base.ResolveHandle: Someone tried to cancel ResolveHandle after it was resolved!
|
||||
2026-05-11T11:41:01.124Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient time to face: Infinity
|
||||
2026-05-11T11:41:01.126Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.HJOrient: HJOrient had initial face?: false
|
||||
2026-05-11T11:41:01.164Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'HJOrient' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:41:01.296Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Demand Face Detect found 0 faces
|
||||
2026-05-11T11:41:04.063Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_LISTEN
|
||||
2026-05-11T11:41:04.064Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_LISTEN in 1 ms.
|
||||
2026-05-11T11:41:04.067Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_EOS
|
||||
2026-05-11T11:41:04.067Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_EOS in 0 ms.
|
||||
2026-05-11T11:41:04.077Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: skillSwitch: { skillID: undefined,\n onRobot: undefined,\n isProactive: undefined,\n skipSurprises: true,\n transID: 'tid-46754112-4d2e-11f1-b43d-5cf821ea55ae',\n data: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'So, play the news.' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'news',\n intent: 'news',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } } }
|
||||
2026-05-11T11:41:04.141Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: phw_JM_HUB_SKILL_INFO
|
||||
2026-05-11T11:41:04.142Z Royal-Current-Sage-Canvas jibo-jetstream-service[682,info]: - C.Jetstream.ListenLoop: Handled JM_HUB_SKILL_INFO in 1 ms.
|
||||
2026-05-11T11:41:04.086Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: globalTurnResult: { global: true,\n result: \n ListenResult {\n asr: { confidence: 0.95, final: true, text: 'So, play the news.' },\n nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n match: \n { cloudSkill: 'news',\n intent: 'news',\n rule: 'launch',\n score: 0.95,\n skipSurprises: true } },\n status: 'SUCCEEDED',\n transID: 'tid-46754112-4d2e-11f1-b43d-5cf821ea55ae' }
|
||||
2026-05-11T11:41:04.097Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Jetstream: Jetstream: eos received
|
||||
2026-05-11T11:41:04.193Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from IDLE to ENGAGED
|
||||
2026-05-11T11:41:04.100Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: skill relaunch command from Global Service { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.103Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.105Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:41:04.113Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/idle @be/nimbus
|
||||
2026-05-11T11:41:04.114Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/idle
|
||||
2026-05-11T06:41:04.285105-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS LEX
|
||||
2026-05-11T06:41:04.285686-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session start - eccd1c5b-d5f2-471f-a400-3f74a9a035f6
|
||||
2026-05-11T06:41:04.287084-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get TTS Lex session end - eccd1c5b-d5f2-471f-a400-3f74a9a035f6
|
||||
2026-05-11T11:41:04.115Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/idle
|
||||
2026-05-11T06:41:04.312225-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-11T06:41:04.312740-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - aff5d8af-720a-4618-b0e2-467fdf9b2b15
|
||||
2026-05-11T06:41:04.314085-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - aff5d8af-720a-4618-b0e2-467fdf9b2b15
|
||||
2026-05-11T11:41:04.116Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Stopping
|
||||
2026-05-11T11:41:04.118Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to false
|
||||
2026-05-11T11:41:04.120Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Clearing animation queue.
|
||||
2026-05-11T06:41:04.344566-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS POS Tags
|
||||
2026-05-11T06:41:04.345653-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session start - 1c9ecd85-7c0e-48c5-964d-2f2f4abf9a5f
|
||||
2026-05-11T06:41:04.348454-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get POS Tags session end - 1c9ecd85-7c0e-48c5-964d-2f2f4abf9a5f
|
||||
2026-05-11T11:41:04.125Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/idle
|
||||
2026-05-11T11:41:04.129Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T06:41:04.397548-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: GET TTS Token times
|
||||
2026-05-11T06:41:04.398632-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> here is a quick news brief . technology companies are still racing on artificial intelligence , global leaders are trading policy updates , and science teams are sharing new research findings . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE","earlyStopTime":-1.0},"type":"token"}}
|
||||
2026-05-11T11:41:04.132Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/idle
|
||||
2026-05-11T11:41:04.135Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.160Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/nimbus
|
||||
2026-05-11T11:41:04.169Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:41:04.172Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/nimbus''
|
||||
2026-05-11T11:41:04.180Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T06:41:04.466979-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,warning]: - C.TTSService: TTSUtterance: Trying to create an empty phrase! Ignoring...
|
||||
2026-05-11T11:41:04.181Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/nimbus
|
||||
2026-05-11T11:41:04.183Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.188Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/idle @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.193Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/nimbus
|
||||
2026-05-11T11:41:04.196Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/nimbus
|
||||
2026-05-11T11:41:04.200Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Opening
|
||||
2026-05-11T11:41:04.203Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Awaiting Cloud Skill response...
|
||||
2026-05-11T11:41:04.204Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/nimbus { nlu: \n { confidence: 0.95,\n entities: {},\n intent: 'news',\n rules: [ 'launch', 'globals/global_commands_launch' ] },\n asr: { text: '<user input removed>', confidence: 0.95 } }
|
||||
2026-05-11T11:41:04.217Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Received Cloud Skill response.
|
||||
2026-05-11T11:41:04.218Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processing Cloud Skill response...
|
||||
2026-05-11T11:41:04.219Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Recieved analytics from cloud skill.
|
||||
2026-05-11T11:41:04.220Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Processed Cloud Skill response.
|
||||
2026-05-11T11:41:04.222Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Executing Cloud Skill SLIM: NewsHeadline_AN_01
|
||||
2026-05-11T11:41:04.263Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:41:04.273Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak request received
|
||||
2026-05-11T11:41:04.275Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Processing speak request
|
||||
2026-05-11T11:41:04.279Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Starting new speak session: 3799362a-6a95-4a32-a1b7-83b196e998e6
|
||||
2026-05-11T06:41:04.993477-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS Get Tokens session end - 51111c33-0145-4452-b8ce-62aaf78f67a7
|
||||
2026-05-11T11:41:05.016Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Pushing Speaking Attention Mode
|
||||
2026-05-11T11:41:05.107Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE disabling due to timeout
|
||||
2026-05-11T11:41:05.109Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE state changed: RUNNING -> ESTABLISHING
|
||||
2026-05-11T11:41:05.121Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE staying in ESTABLISHING due to: timeout,
|
||||
2026-05-11T11:41:05.218Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE state changed: ESTABLISHING -> RESUMING
|
||||
2026-05-11T11:41:05.232Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to SPEAKING
|
||||
2026-05-11T11:41:05.248Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Waiting for Embodied Listen to finish
|
||||
2026-05-11T11:41:05.250Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Dispatching Timeline: 3799362a-6a95-4a32-a1b7-83b196e998e6
|
||||
2026-05-11T06:41:05.280271-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session start - 92084455-4afc-4b49-9a80-de8053592117
|
||||
2026-05-11T06:41:05.280497-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: {"tts":{"input_request":{"prompt":"<speak><STYLE set=\"NEUTRAL\"> <SPEAK> <BREAK size=\"0.35\"/> here is a quick news brief . technology companies are still racing on artificial intelligence , global leaders are trading policy updates , and science teams are sharing new research findings . </SPEAK> </STYLE></speak>","pitch":999.0,"speed":999.0,"pitchBandwidth":999.0,"mode":"ssml","outputMode":"stream","allPass":999.0,"enableDefaultVoice":"","framerate":999.0,"gvMCEP":999.0,"postfilter":999.0,"samplerate":999.0,"unvoicedvoiced":999.0,"voice":"griffin","locale":"en-us","volume":999.0,"whisper":"FALSE","cached":"TRUE"},"type":"speak"}}
|
||||
2026-05-11T06:41:05.280714-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS calling speak - 92084455-4afc-4b49-9a80-de8053592117
|
||||
2026-05-11T06:41:05.280747-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: Synthesizing cached
|
||||
2026-05-11T11:41:05.327Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE state changed: RESUMING -> RUNNING
|
||||
2026-05-11T11:41:05.330Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: BODY_INTERFACE done enabling, notifying 0 "setPause:false" listeners
|
||||
2026-05-11T11:41:07.272Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: deleting person entity 14241
|
||||
2026-05-11T06:41:12.865400-05:00 Royal-Current-Sage-Canvas jibo-log-client-async[1751,info]: - Upload log /var/log/messages size 390815 bytes
|
||||
#
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# cat /var/log/messages
|
||||
2026-05-11T06:41:15.051295-05:00 Royal-Current-Sage-Canvas rsyslogd[-,info]: - [origin software="rsyslogd" swVersion="8.9.0" x-pid="147" x-info="http://www.rsyslog.com"] rsyslogd was HUPed
|
||||
2026-05-11T06:41:16.427433-05:00 Royal-Current-Sage-Canvas jibo-tts-service[710,info]: - C.TTSService: TTS session end - 92084455-4afc-4b49-9a80-de8053592117
|
||||
2026-05-11T11:41:16.464Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from SPEAKING to ENGAGED
|
||||
2026-05-11T11:41:16.461Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Timeline Dispatch Complete: 3799362a-6a95-4a32-a1b7-83b196e998e6
|
||||
2026-05-11T11:41:16.478Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Speak Complete: 3799362a-6a95-4a32-a1b7-83b196e998e6
|
||||
2026-05-11T11:41:16.482Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Cleaning up session
|
||||
2026-05-11T11:41:16.484Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Ready for next speak request
|
||||
2026-05-11T11:41:16.486Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Embodied.Speech: Stop request received
|
||||
2026-05-11T11:41:16.487Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:41:16.495Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: requested skill switch @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:41:16.496Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: no pending skill. interrupting current skill
|
||||
2026-05-11T11:41:16.510Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: switching skill @be/nimbus @be/idle
|
||||
2026-05-11T11:41:16.512Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting close skill @be/nimbus
|
||||
2026-05-11T11:41:16.514Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: stopping @be/nimbus
|
||||
2026-05-11T11:41:16.515Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Nimbus: Nimbus Closing
|
||||
2026-05-11T11:41:16.517Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.TimerSpy: The current skill cleaned up all timers @be/nimbus
|
||||
2026-05-11T11:41:16.519Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:41:16.521Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: ending close skill @be/nimbus
|
||||
2026-05-11T11:41:16.521Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: deferring to action system with pending skill: @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:41:16.543Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: waiting on action system @be/idle
|
||||
2026-05-11T11:41:16.566Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Attention Mode changed from ENGAGED to IDLE
|
||||
2026-05-11T11:41:16.547Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action: Incoming new goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:41:16.551Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Taking action: 'Be Skill Switch Action' to achieve goal 'Be Skill Switch Goal: '@be/idle''
|
||||
2026-05-11T11:41:16.554Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Action.Action.GoalDrivenAction: Completed action: 'Be Skill Switch Action' with result: 'SUCCEEDED'
|
||||
2026-05-11T11:41:16.554Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: action system reported accomplished goal @be/idle
|
||||
2026-05-11T11:41:16.555Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: starting skill open @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:41:16.557Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: BeSkill open @be/nimbus @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:41:16.560Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: new skill preload @be/idle
|
||||
2026-05-11T11:41:16.563Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchUtil: opening new skill @be/idle
|
||||
2026-05-11T11:41:16.565Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Returning Speaker 5c0b221fdf9d450019c5e255.
|
||||
2026-05-11T11:41:16.567Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: adding listener for SLEEP
|
||||
2026-05-11T11:41:16.568Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Jibo.Events.Global: setting SLEEP to true
|
||||
2026-05-11T11:41:16.571Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Starting
|
||||
2026-05-11T11:41:16.574Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from ALERT to SELECT_INTENT.
|
||||
2026-05-11T11:41:16.575Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering: SELECT_INTENT
|
||||
2026-05-11T11:41:16.578Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.SkillSwitchScheduler: skill open success @be/idle { exitOptions: {}, asr: { text: '', confidence: 1 } }
|
||||
2026-05-11T11:41:16.583Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: State changed from SELECT_INTENT to ALERT.
|
||||
2026-05-11T11:41:16.584Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Entering ALERT
|
||||
2026-05-11T11:41:16.592Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: No transitions between SELECT_INTENT and ALERT
|
||||
2026-05-11T11:41:16.658Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.Be.Idle: Brightness set to 0.4.
|
||||
2026-05-11T11:41:19.063Z Royal-Current-Sage-Canvas exp[786,info]: [versions@1 release="1.9.2"] T.SSM.Svc.Exp.AU: ATTENTION Asserting attention rule after interruption: Idle Boredom Little
|
||||
2026-05-11T11:41:27.286Z Royal-Current-Sage-Canvas be[1017,info]: [versions@1 release="1.9.2"] T.SF.ServiceClients.Identity.DataConverter: Emitting idLost from ASR: 5c0b221fdf9d450019c5e255.
|
||||
#
|
||||
|
||||
157
tmp/jibo-test-41/captures/http/20260511.events.ndjson
Normal file
157
tmp/jibo-test-41/captures/http/20260511.events.ndjson
Normal file
File diff suppressed because one or more lines are too long
17365
tmp/jibo-test-41/captures/turn/20260511.events.ndjson
Normal file
17365
tmp/jibo-test-41/captures/turn/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
2290
tmp/jibo-test-41/captures/websocket/20260511.events.ndjson
Normal file
2290
tmp/jibo-test-41/captures/websocket/20260511.events.ndjson
Normal file
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user