@pellux/goodvibes-agent 1.1.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +46 -30
  3. package/dist/package/{ast-grep-napi.linux-x64-gnu-mkk8xwww.node → ast-grep-napi.linux-x64-gnu-swtppvy9.node} +0 -0
  4. package/dist/package/{ast-grep-napi.linux-x64-musl-ryqtgdv6.node → ast-grep-napi.linux-x64-musl-ttfcdtap.node} +0 -0
  5. package/dist/package/main.js +132577 -91483
  6. package/docs/README.md +14 -7
  7. package/docs/channels-remote-and-api.md +8 -5
  8. package/docs/connected-host.md +14 -12
  9. package/docs/getting-started.md +56 -30
  10. package/docs/knowledge-artifacts-and-multimodal.md +7 -5
  11. package/docs/project-planning.md +2 -2
  12. package/docs/providers-and-routing.md +11 -3
  13. package/docs/tools-and-commands.md +114 -45
  14. package/docs/voice-and-live-tts.md +3 -1
  15. package/package.json +3 -2
  16. package/release/release-notes.md +130 -5
  17. package/release/release-readiness.json +120 -90
  18. package/src/agent/assistant-cockpit.ts +247 -0
  19. package/src/agent/autonomy-schedule-format.ts +96 -0
  20. package/src/agent/autonomy-schedule.ts +514 -0
  21. package/src/agent/channel-delivery-receipts.ts +292 -0
  22. package/src/agent/competitive-feature-inventory.ts +296 -0
  23. package/src/agent/document-registry-types.ts +106 -0
  24. package/src/agent/document-registry.ts +734 -0
  25. package/src/agent/harness-control.ts +2 -2
  26. package/src/agent/memory-prompt.ts +2 -2
  27. package/src/agent/operator-actions.ts +50 -6
  28. package/src/agent/persona-registry.ts +8 -0
  29. package/src/agent/project-context-files.ts +273 -0
  30. package/src/agent/prompt-context-receipts.ts +502 -0
  31. package/src/agent/reminder-schedule-format.ts +16 -2
  32. package/src/agent/research-run-registry.ts +582 -0
  33. package/src/agent/research-source-registry.ts +441 -0
  34. package/src/agent/routine-registry.ts +19 -3
  35. package/src/agent/routine-schedule-format.ts +27 -2
  36. package/src/agent/runtime-profile-starters.ts +7 -0
  37. package/src/agent/runtime-profile.ts +106 -4
  38. package/src/agent/schedule-edit-format.ts +129 -0
  39. package/src/agent/schedule-edit.ts +496 -0
  40. package/src/agent/schedule-next-routes.ts +42 -0
  41. package/src/agent/setup-wizard-checkpoint.ts +140 -0
  42. package/src/agent/setup-wizard.ts +447 -0
  43. package/src/agent/skill-registry-types.ts +102 -0
  44. package/src/agent/skill-registry.ts +81 -107
  45. package/src/agent/vibe-confirmation-routes.ts +62 -0
  46. package/src/agent/vibe-file.ts +285 -0
  47. package/src/cli/agent-knowledge-command.ts +45 -2
  48. package/src/cli/help.ts +3 -0
  49. package/src/cli/profiles-command.ts +25 -11
  50. package/src/config/agent-settings-policy.ts +1 -18
  51. package/src/input/agent-workspace-activation.ts +53 -0
  52. package/src/input/agent-workspace-artifact-browser-editor.ts +494 -0
  53. package/src/input/agent-workspace-artifact-metadata.ts +17 -0
  54. package/src/input/agent-workspace-basic-command-editors.ts +5 -1
  55. package/src/input/agent-workspace-categories.ts +153 -155
  56. package/src/input/agent-workspace-channel-triage.ts +481 -0
  57. package/src/input/agent-workspace-channels.ts +263 -0
  58. package/src/input/agent-workspace-command-editor.ts +152 -0
  59. package/src/input/agent-workspace-context-snapshot.ts +349 -0
  60. package/src/input/agent-workspace-delegation-editor-submission.ts +8 -0
  61. package/src/input/agent-workspace-document-editor.ts +502 -0
  62. package/src/input/agent-workspace-document-ops-editor.ts +523 -0
  63. package/src/input/agent-workspace-host-category.ts +1 -1
  64. package/src/input/agent-workspace-local-library-snapshot.ts +167 -0
  65. package/src/input/agent-workspace-model-compare-editor.ts +376 -0
  66. package/src/input/agent-workspace-model-compare-prompt-submission.ts +552 -0
  67. package/src/input/agent-workspace-model-compare-types.ts +82 -0
  68. package/src/input/agent-workspace-model-compare-utils.ts +35 -0
  69. package/src/input/agent-workspace-onboarding-categories.ts +141 -0
  70. package/src/input/agent-workspace-operations-command-editor-submission.ts +53 -0
  71. package/src/input/agent-workspace-operations-command-editors.ts +22 -0
  72. package/src/input/agent-workspace-research-report-editor.ts +212 -0
  73. package/src/input/agent-workspace-research-run-editor.ts +144 -0
  74. package/src/input/agent-workspace-research-source-editor.ts +167 -0
  75. package/src/input/agent-workspace-review-packet-snapshot.ts +593 -0
  76. package/src/input/agent-workspace-review-packet-utils.ts +265 -0
  77. package/src/input/agent-workspace-settings.ts +262 -30
  78. package/src/input/agent-workspace-setup-checkpoint-action.ts +127 -0
  79. package/src/input/agent-workspace-setup-snapshot.ts +198 -0
  80. package/src/input/agent-workspace-setup.ts +34 -1
  81. package/src/input/agent-workspace-snapshot.ts +162 -147
  82. package/src/input/agent-workspace-types.ts +287 -2
  83. package/src/input/agent-workspace.ts +18 -0
  84. package/src/input/command-registry.ts +9 -2
  85. package/src/input/commands/agent-runtime-profile-runtime.ts +28 -13
  86. package/src/input/commands/channels-runtime.ts +102 -114
  87. package/src/input/commands/delegation-runtime.ts +87 -24
  88. package/src/input/commands/knowledge-browser-flags.ts +12 -0
  89. package/src/input/commands/knowledge.ts +28 -14
  90. package/src/input/commands/operator-actions-runtime.ts +6 -3
  91. package/src/input/commands/schedule-runtime.ts +71 -14
  92. package/src/input/commands/session-content.ts +2 -2
  93. package/src/input/commands/shell-core.ts +2 -0
  94. package/src/input/commands/vibe-runtime.ts +140 -0
  95. package/src/input/commands.ts +2 -0
  96. package/src/input/connected-host-routes.ts +123 -0
  97. package/src/input/settings-modal-types.ts +14 -0
  98. package/src/main.ts +15 -15
  99. package/src/panels/qr-panel.ts +2 -2
  100. package/src/renderer/agent-workspace-context-lines.ts +686 -0
  101. package/src/renderer/agent-workspace.ts +30 -419
  102. package/src/renderer/settings-modal-helpers.ts +12 -0
  103. package/src/renderer/settings-modal.ts +12 -0
  104. package/src/runtime/bootstrap-command-context.ts +11 -1
  105. package/src/runtime/bootstrap-command-parts.ts +14 -3
  106. package/src/runtime/bootstrap-core.ts +39 -1
  107. package/src/runtime/bootstrap-shell.ts +6 -0
  108. package/src/runtime/bootstrap.ts +113 -30
  109. package/src/runtime/connected-host-auth.ts +3 -2
  110. package/src/runtime/execution-ledger.ts +231 -0
  111. package/src/runtime/services.ts +88 -10
  112. package/src/runtime/tool-permission-safety.ts +199 -5
  113. package/src/shell/session-continuity-hints.ts +39 -0
  114. package/src/tools/agent-artifacts-tool.ts +606 -0
  115. package/src/tools/agent-audit-tool.ts +155 -0
  116. package/src/tools/agent-autonomy-schedule-tool.ts +238 -0
  117. package/src/tools/agent-autonomy-tool.ts +140 -0
  118. package/src/tools/agent-channel-send-tool.ts +24 -2
  119. package/src/tools/agent-channels-tool.ts +140 -0
  120. package/src/tools/agent-computer-tool.ts +168 -0
  121. package/src/tools/agent-context-policy.ts +137 -7
  122. package/src/tools/agent-context-tool.ts +143 -0
  123. package/src/tools/agent-delegation-tool.ts +128 -0
  124. package/src/tools/agent-device-tool.ts +240 -0
  125. package/src/tools/agent-documents-tool.ts +684 -0
  126. package/src/tools/agent-execution-tool.ts +230 -0
  127. package/src/tools/agent-harness-agent-orchestration.ts +703 -0
  128. package/src/tools/agent-harness-autonomy-intake.ts +785 -0
  129. package/src/tools/agent-harness-autonomy-live-records.ts +588 -0
  130. package/src/tools/agent-harness-autonomy-queue-types.ts +88 -0
  131. package/src/tools/agent-harness-autonomy-queue.ts +560 -0
  132. package/src/tools/agent-harness-background-processes-types.ts +35 -0
  133. package/src/tools/agent-harness-background-processes.ts +794 -0
  134. package/src/tools/agent-harness-browser-cockpit-route.ts +219 -0
  135. package/src/tools/agent-harness-browser-control.ts +338 -0
  136. package/src/tools/agent-harness-channel-metadata.ts +168 -10
  137. package/src/tools/agent-harness-cli-command-policy.ts +110 -0
  138. package/src/tools/agent-harness-command-catalog.ts +4 -2
  139. package/src/tools/agent-harness-command-runner.ts +42 -0
  140. package/src/tools/agent-harness-connected-host-status.ts +7 -4
  141. package/src/tools/agent-harness-delegation-posture.ts +234 -19
  142. package/src/tools/agent-harness-document-ops-reviewer-readiness.ts +234 -0
  143. package/src/tools/agent-harness-document-ops-types.ts +72 -0
  144. package/src/tools/agent-harness-document-ops.ts +671 -0
  145. package/src/tools/agent-harness-execution-history.ts +489 -0
  146. package/src/tools/agent-harness-execution-posture.ts +382 -0
  147. package/src/tools/agent-harness-file-recovery.ts +135 -0
  148. package/src/tools/agent-harness-keybinding-metadata.ts +16 -12
  149. package/src/tools/agent-harness-learning-curator-common.ts +102 -0
  150. package/src/tools/agent-harness-learning-curator-consolidation.ts +295 -0
  151. package/src/tools/agent-harness-learning-curator-proposals.ts +606 -0
  152. package/src/tools/agent-harness-learning-curator-types.ts +151 -0
  153. package/src/tools/agent-harness-learning-curator.ts +417 -0
  154. package/src/tools/agent-harness-local-model-benchmarks.ts +199 -0
  155. package/src/tools/agent-harness-local-model-cookbook.ts +238 -0
  156. package/src/tools/agent-harness-local-model-endpoints.ts +673 -0
  157. package/src/tools/agent-harness-media-posture.ts +208 -2
  158. package/src/tools/agent-harness-memory-posture.ts +556 -0
  159. package/src/tools/agent-harness-metadata.ts +100 -168
  160. package/src/tools/agent-harness-mode-catalog.ts +84 -33
  161. package/src/tools/agent-harness-model-catalog.ts +162 -0
  162. package/src/tools/agent-harness-model-provider-health.ts +186 -0
  163. package/src/tools/agent-harness-model-readiness.ts +406 -0
  164. package/src/tools/agent-harness-model-routing-types.ts +266 -0
  165. package/src/tools/agent-harness-model-routing-utils.ts +30 -0
  166. package/src/tools/agent-harness-model-routing.ts +137 -190
  167. package/src/tools/agent-harness-operator-methods.ts +115 -133
  168. package/src/tools/agent-harness-pairing-posture.ts +431 -18
  169. package/src/tools/agent-harness-personal-ops-discovery.ts +533 -0
  170. package/src/tools/agent-harness-personal-ops-intake.ts +385 -0
  171. package/src/tools/agent-harness-personal-ops-lanes.ts +204 -0
  172. package/src/tools/agent-harness-personal-ops-records.ts +732 -0
  173. package/src/tools/agent-harness-personal-ops-runner.ts +637 -0
  174. package/src/tools/agent-harness-personal-ops-types.ts +222 -0
  175. package/src/tools/agent-harness-personal-ops.ts +606 -0
  176. package/src/tools/agent-harness-project-context.ts +144 -0
  177. package/src/tools/agent-harness-prompt-context.ts +589 -0
  178. package/src/tools/agent-harness-provider-account-metadata.ts +2 -2
  179. package/src/tools/agent-harness-release-evidence.ts +9 -7
  180. package/src/tools/agent-harness-release-readiness.ts +9 -7
  181. package/src/tools/agent-harness-research-briefing.ts +427 -0
  182. package/src/tools/agent-harness-research-queue.ts +250 -0
  183. package/src/tools/agent-harness-research-runs.ts +295 -0
  184. package/src/tools/agent-harness-research-workflow.ts +322 -0
  185. package/src/tools/agent-harness-security-posture.ts +2 -2
  186. package/src/tools/agent-harness-service-posture.ts +9 -9
  187. package/src/tools/agent-harness-session-metadata.ts +3 -3
  188. package/src/tools/agent-harness-setup-connected-host.ts +501 -0
  189. package/src/tools/agent-harness-setup-describe.ts +557 -0
  190. package/src/tools/agent-harness-setup-handoffs.ts +502 -0
  191. package/src/tools/agent-harness-setup-model-helpers.ts +101 -0
  192. package/src/tools/agent-harness-setup-plan.ts +253 -0
  193. package/src/tools/agent-harness-setup-posture-types.ts +218 -0
  194. package/src/tools/agent-harness-setup-posture-utils.ts +173 -0
  195. package/src/tools/agent-harness-setup-posture.ts +449 -221
  196. package/src/tools/agent-harness-setup-smoke.ts +508 -0
  197. package/src/tools/agent-harness-sudo-posture.ts +114 -0
  198. package/src/tools/agent-harness-tool-schema.ts +120 -7
  199. package/src/tools/agent-harness-tool-types.ts +78 -0
  200. package/src/tools/agent-harness-tool-utils.ts +43 -0
  201. package/src/tools/agent-harness-tool.ts +311 -370
  202. package/src/tools/agent-harness-ui-surface-metadata.ts +76 -69
  203. package/src/tools/agent-harness-ui-surface-types.ts +46 -0
  204. package/src/tools/agent-harness-vibe-health.ts +105 -0
  205. package/src/tools/agent-harness-workspace-action-runner.ts +149 -0
  206. package/src/tools/agent-harness-workspace-actions.ts +114 -8
  207. package/src/tools/agent-harness-workspace-editor-execution.ts +214 -0
  208. package/src/tools/agent-harness-workspace-editor-runner.ts +755 -0
  209. package/src/tools/agent-host-tool.ts +159 -0
  210. package/src/tools/agent-knowledge-ingest-tool.ts +34 -1
  211. package/src/tools/agent-learning-consolidation-core.ts +327 -0
  212. package/src/tools/agent-learning-consolidation-tool.ts +758 -0
  213. package/src/tools/agent-memory-tool.ts +214 -0
  214. package/src/tools/agent-model-compare-export.ts +315 -0
  215. package/src/tools/agent-model-compare-handoff.ts +592 -0
  216. package/src/tools/agent-model-compare-judgment.ts +633 -0
  217. package/src/tools/agent-model-compare-run.ts +722 -0
  218. package/src/tools/agent-model-compare-tool.ts +698 -0
  219. package/src/tools/agent-model-compare-types.ts +191 -0
  220. package/src/tools/agent-model-compare-utils.ts +93 -0
  221. package/src/tools/agent-models-tool.ts +208 -0
  222. package/src/tools/agent-operator-action-tool.ts +1 -1
  223. package/src/tools/agent-operator-method-tool.ts +643 -0
  224. package/src/tools/agent-personal-ops-tool.ts +197 -0
  225. package/src/tools/agent-policy-explanation.ts +415 -0
  226. package/src/tools/agent-research-report-tool.ts +608 -0
  227. package/src/tools/agent-research-runs-tool.ts +434 -0
  228. package/src/tools/agent-research-sources-tool.ts +443 -0
  229. package/src/tools/agent-research-tool.ts +687 -0
  230. package/src/tools/agent-review-packet-presets-core.ts +757 -0
  231. package/src/tools/agent-review-packet-presets-tool.ts +466 -0
  232. package/src/tools/agent-review-packet-share-tool.ts +305 -0
  233. package/src/tools/agent-route-planner-candidates-setup.ts +411 -0
  234. package/src/tools/agent-route-planner-candidates-surfaces.ts +432 -0
  235. package/src/tools/agent-route-planner-candidates-work.ts +251 -0
  236. package/src/tools/agent-route-planner-helpers.ts +667 -0
  237. package/src/tools/agent-route-planner.ts +185 -0
  238. package/src/tools/agent-route-tool.ts +105 -0
  239. package/src/tools/agent-schedule-edit-tool.ts +210 -0
  240. package/src/tools/agent-schedule-tool.ts +282 -0
  241. package/src/tools/agent-security-tool.ts +145 -0
  242. package/src/tools/agent-sessions-tool.ts +122 -0
  243. package/src/tools/agent-settings-import-tool.ts +104 -0
  244. package/src/tools/agent-settings-tool.ts +176 -0
  245. package/src/tools/agent-setup-tool.ts +226 -0
  246. package/src/tools/agent-support-tool.ts +122 -0
  247. package/src/tools/agent-terminal-process-tools.ts +167 -0
  248. package/src/tools/agent-tool-policy-guard-types.ts +77 -0
  249. package/src/tools/agent-tool-policy-guard.ts +106 -85
  250. package/src/tools/agent-vibe-tool.ts +297 -0
  251. package/src/tools/agent-work-plan-tool.ts +265 -6
  252. package/src/tools/agent-workspace-tool.ts +305 -0
  253. package/src/tools/artifact-archive.ts +169 -0
  254. package/src/tools/tool-definition-compaction.ts +36 -0
  255. package/src/version.ts +1 -1
@@ -16,6 +16,8 @@ type MediaProviderResolution =
16
16
  | { readonly status: 'ambiguous'; readonly input: string; readonly candidates: readonly Record<string, unknown>[] }
17
17
  | { readonly status: 'missing_lookup'; readonly usage: string };
18
18
 
19
+ type VoiceWorkflowStatus = 'ready' | 'attention' | 'setup-needed' | 'not-published';
20
+
19
21
  interface RuntimeProviderStatus {
20
22
  readonly id: string;
21
23
  readonly state: string;
@@ -23,6 +25,21 @@ interface RuntimeProviderStatus {
23
25
  readonly detail?: string;
24
26
  }
25
27
 
28
+ interface VoiceInteractionWorkflow {
29
+ readonly id: string;
30
+ readonly label: string;
31
+ readonly status: VoiceWorkflowStatus;
32
+ readonly userOutcome: string;
33
+ readonly summary: string;
34
+ readonly nextStep: string;
35
+ readonly capabilities: readonly string[];
36
+ readonly modelRoute: string;
37
+ readonly userRoute?: string;
38
+ readonly setupRoutes: readonly string[];
39
+ readonly evidence: Record<string, unknown>;
40
+ readonly policy: string;
41
+ }
42
+
26
43
  function readString(value: unknown): string {
27
44
  return typeof value === 'string' ? value.trim() : '';
28
45
  }
@@ -70,6 +87,184 @@ function providerSearchText(provider: AgentWorkspaceVoiceMediaProviderStatus, ru
70
87
  ].join('\n').toLowerCase();
71
88
  }
72
89
 
90
+ function voiceWorkflowSearchText(workflow: VoiceInteractionWorkflow): string {
91
+ return [
92
+ workflow.id,
93
+ workflow.label,
94
+ workflow.status,
95
+ workflow.userOutcome,
96
+ workflow.summary,
97
+ workflow.nextStep,
98
+ workflow.modelRoute,
99
+ workflow.userRoute ?? '',
100
+ ...workflow.capabilities,
101
+ ].join('\n').toLowerCase();
102
+ }
103
+
104
+ function voiceWorkflowMatches(workflow: VoiceInteractionWorkflow, query: string): boolean {
105
+ if (!query) return true;
106
+ const text = voiceWorkflowSearchText(workflow);
107
+ if (text.includes(query)) return true;
108
+ const tokens = query.split(/\s+/).map((token) => token.trim()).filter(Boolean);
109
+ return tokens.length > 0 && tokens.every((token) => text.includes(token));
110
+ }
111
+
112
+ function voiceWorkflowSummary(workflows: readonly VoiceInteractionWorkflow[]): Record<string, unknown> {
113
+ return {
114
+ total: workflows.length,
115
+ ready: workflows.filter((workflow) => workflow.status === 'ready').length,
116
+ attention: workflows.filter((workflow) => workflow.status === 'attention').length,
117
+ setupNeeded: workflows.filter((workflow) => workflow.status === 'setup-needed').length,
118
+ notPublished: workflows.filter((workflow) => workflow.status === 'not-published').length,
119
+ primaryNextStep: workflows.find((workflow) => workflow.status !== 'ready')?.nextStep
120
+ ?? 'Voice workflows are ready; keep effects on explicit user-visible routes.',
121
+ };
122
+ }
123
+
124
+ function hasReadyVoiceFeature(readiness: ReturnType<typeof buildReadiness>, featureIds: readonly string[]): boolean {
125
+ return readiness.voiceProviders.some((provider) => (
126
+ provider.setupState === 'ready'
127
+ && featureIds.some((feature) => provider.features.includes(feature))
128
+ ));
129
+ }
130
+
131
+ function hasRegisteredVoiceFeature(readiness: ReturnType<typeof buildReadiness>, featureIds: readonly string[]): boolean {
132
+ return readiness.voiceProviders.some((provider) => featureIds.some((feature) => provider.features.includes(feature)));
133
+ }
134
+
135
+ function buildVoiceInteractionWorkflows(
136
+ context: CommandContext,
137
+ readiness: ReturnType<typeof buildReadiness>,
138
+ ): readonly VoiceInteractionWorkflow[] {
139
+ const voiceEnabled = readConfigBoolean(context, 'ui.voiceEnabled', false);
140
+ const spokenTurnRuntime = typeof context.submitSpokenInput === 'function';
141
+ const stopSpokenOutputRuntime = typeof context.stopSpokenOutput === 'function';
142
+ const transcribeRuntime = typeof context.platform.voiceService?.transcribe === 'function';
143
+ const speechInputReady = hasReadyVoiceFeature(readiness, ['stt', 'realtime']);
144
+ const speechInputRegistered = hasRegisteredVoiceFeature(readiness, ['stt', 'realtime']);
145
+ const selectedTtsReady = readiness.selectedTtsProviderStatus === 'ready';
146
+ const spokenReady = spokenTurnRuntime && selectedTtsReady && readiness.ttsVoiceConfigured;
147
+ const spokenAttention = spokenTurnRuntime && selectedTtsReady && !readiness.ttsVoiceConfigured;
148
+ const pushToTalkReady = voiceEnabled && spokenTurnRuntime && speechInputReady;
149
+ const pushToTalkAttention = voiceEnabled && (spokenTurnRuntime || speechInputRegistered);
150
+ const transcriptionReady = transcribeRuntime && speechInputReady;
151
+ const transcriptionAttention = transcribeRuntime || speechInputRegistered;
152
+
153
+ return [
154
+ {
155
+ id: 'push-to-talk',
156
+ label: 'Push-to-talk input',
157
+ status: pushToTalkReady ? 'ready' : pushToTalkAttention ? 'attention' : 'setup-needed',
158
+ userOutcome: 'Speak a short prompt when the local voice surface and speech-input provider are ready.',
159
+ summary: pushToTalkReady
160
+ ? 'Voice surface, spoken-turn runtime, and a ready STT/realtime provider are available.'
161
+ : pushToTalkAttention
162
+ ? 'Some voice input pieces are present, but the full push-to-talk route is not ready.'
163
+ : 'Voice input needs the voice surface plus a ready STT or realtime provider.',
164
+ nextStep: pushToTalkReady
165
+ ? 'Use the visible voice surface when the user asks to speak to the assistant.'
166
+ : 'Review /voice and media provider posture before presenting push-to-talk as available.',
167
+ capabilities: ['push-to-talk', 'speech input', 'stt', 'realtime voice'],
168
+ modelRoute: 'agent_harness mode:"media_posture" query:"push to talk" includeParameters:true',
169
+ userRoute: '/voice review',
170
+ setupRoutes: [
171
+ 'settings action:"get" query:"ui.voiceEnabled" includeParameters:true',
172
+ 'agent_harness mode:"media_posture" query:"stt realtime" includeParameters:true',
173
+ ],
174
+ evidence: {
175
+ voiceSurfaceEnabled: voiceEnabled,
176
+ spokenTurnRuntime,
177
+ speechInputReady,
178
+ speechInputRegistered,
179
+ },
180
+ policy: 'Voice input stays a visible local operator surface; provider setup and transcript submission are separate explicit routes.',
181
+ },
182
+ {
183
+ id: 'voice-memo-transcription',
184
+ label: 'Voice memo transcription',
185
+ status: transcriptionReady ? 'ready' : transcriptionAttention ? 'attention' : 'setup-needed',
186
+ userOutcome: 'Transcribe an audio note only when a speech-to-text provider and runtime route are both present.',
187
+ summary: transcriptionReady
188
+ ? 'Speech-to-text provider and voiceService.transcribe are available.'
189
+ : transcriptionAttention
190
+ ? 'A speech-to-text provider or runtime route is present, but transcription is not fully ready.'
191
+ : 'No ready speech-to-text transcription route is available.',
192
+ nextStep: transcriptionReady
193
+ ? 'Route audio transcription through reviewed media or connected-host voice routes when the user supplies audio.'
194
+ : 'Configure a provider with STT capability and confirm the runtime exposes voiceService.transcribe.',
195
+ capabilities: ['voice memo', 'speech-to-text', 'audio transcription'],
196
+ modelRoute: 'agent_harness mode:"media_posture" query:"voice memo transcription" includeParameters:true',
197
+ setupRoutes: [
198
+ 'agent_harness mode:"media_posture" query:"stt" includeParameters:true',
199
+ 'host action:"methods" query:"voice.stt"',
200
+ ],
201
+ evidence: {
202
+ transcribeRuntime,
203
+ speechInputReady,
204
+ speechInputRegistered,
205
+ },
206
+ policy: 'Audio bytes are not printed into chat; transcription must use reviewed media or connected-host voice routes.',
207
+ },
208
+ {
209
+ id: 'spoken-responses',
210
+ label: 'Spoken responses',
211
+ status: spokenReady ? 'ready' : spokenAttention ? 'attention' : 'setup-needed',
212
+ userOutcome: 'Play an assistant answer aloud with a predictable TTS provider and voice.',
213
+ summary: spokenReady
214
+ ? 'Spoken-turn runtime, selected TTS provider, and voice setting are ready.'
215
+ : spokenAttention
216
+ ? 'Spoken-turn runtime and provider are ready, but the exact voice is not configured.'
217
+ : 'Spoken responses need a ready selected TTS provider and runtime spoken-turn route.',
218
+ nextStep: spokenReady
219
+ ? 'Use /tts only when the user asks for spoken output.'
220
+ : 'Choose a ready TTS provider and voice, then verify the runtime exposes submitSpokenInput.',
221
+ capabilities: ['tts', 'spoken answer', 'stop spoken output'],
222
+ modelRoute: 'agent_harness mode:"media_posture" query:"spoken responses" includeParameters:true',
223
+ userRoute: '/tts <prompt>',
224
+ setupRoutes: [
225
+ 'agent_harness mode:"open_ui_surface" surfaceId:"tts-provider-picker" confirm:true explicitUserRequest:"..."',
226
+ 'agent_harness mode:"open_ui_surface" surfaceId:"tts-voice-picker" confirm:true explicitUserRequest:"..."',
227
+ ],
228
+ evidence: {
229
+ spokenTurnRuntime,
230
+ stopSpokenOutputRuntime,
231
+ selectedTtsProviderStatus: readiness.selectedTtsProviderStatus,
232
+ ttsVoiceConfigured: readiness.ttsVoiceConfigured,
233
+ },
234
+ policy: 'Spoken turns submit normal assistant prompts and may call model/speech providers; playback stop is local runtime control.',
235
+ },
236
+ {
237
+ id: 'wake-and-speak',
238
+ label: 'Wake and speak',
239
+ status: 'not-published',
240
+ userOutcome: 'Use wake-word or always-listening input only after a permission-scoped runtime contract exists.',
241
+ summary: 'Wake-word or always-listening voice capture is not published by the current Agent runtime contract.',
242
+ nextStep: 'Use explicit voice input or /tts until a wake-word route is published with visible permission controls.',
243
+ capabilities: ['wake word', 'always listening', 'permission repair'],
244
+ modelRoute: 'agent_harness mode:"media_posture" query:"wake word" includeParameters:true',
245
+ setupRoutes: [
246
+ 'agent_harness mode:"media_posture" query:"push to talk" includeParameters:true',
247
+ 'agent_harness mode:"pairing_posture" query:"device" includeParameters:true',
248
+ ],
249
+ evidence: {
250
+ publishedByCurrentAgentContract: false,
251
+ },
252
+ policy: 'Agent does not claim always-listening behavior without an explicit permission-scoped runtime contract.',
253
+ },
254
+ ];
255
+ }
256
+
257
+ function describeVoiceWorkflow(workflow: VoiceInteractionWorkflow, includeParameters: boolean): Record<string, unknown> {
258
+ if (includeParameters) return { ...workflow };
259
+ return {
260
+ workflowId: workflow.id,
261
+ label: workflow.label,
262
+ status: workflow.status,
263
+ summary: previewHarnessText(workflow.summary),
264
+ modelRoute: workflow.modelRoute,
265
+ };
266
+ }
267
+
73
268
  function describeProviderCandidate(provider: AgentWorkspaceVoiceMediaProviderStatus): Record<string, unknown> {
74
269
  return {
75
270
  mediaProviderId: `${provider.domain}:${provider.id}`,
@@ -124,7 +319,7 @@ function describeProvider(
124
319
  inspectPosture: 'agent_harness mode:"media_posture"',
125
320
  inspectProvider: 'agent_harness mode:"media_provider"',
126
321
  generateMedia: 'agent_media_generate with confirm:true and explicitUserRequest',
127
- ttsSettings: 'agent_harness mode:"settings", mode:"get_setting", mode:"set_setting" for tts.provider, tts.voice, tts.llmProvider, and tts.llmModel',
322
+ ttsSettings: 'settings action:"list|get|set" for tts.provider, tts.voice, tts.llmProvider, and tts.llmModel',
128
323
  },
129
324
  policy: {
130
325
  effect: 'read-only',
@@ -179,12 +374,14 @@ function buildReadiness(context: CommandContext) {
179
374
 
180
375
  export function mediaPostureCatalogStatus(context: CommandContext): Record<string, unknown> {
181
376
  const readiness = buildReadiness(context);
377
+ const voiceWorkflows = buildVoiceInteractionWorkflows(context, readiness);
182
378
  return {
183
379
  modes: ['media_posture', 'media_provider'],
184
380
  voiceProviders: readiness.voiceProviders.length,
185
381
  mediaProviders: readiness.mediaProviders.length,
186
382
  readyVoiceProviders: readiness.readyVoiceProviderCount,
187
383
  readyMediaProviders: readiness.readyMediaProviderCount,
384
+ voiceWorkflowSummary: voiceWorkflowSummary(voiceWorkflows),
188
385
  readOnly: true,
189
386
  };
190
387
  }
@@ -199,9 +396,14 @@ export async function mediaPostureSummary(context: CommandContext, args: AgentHa
199
396
  ...readiness.mediaProviders.map((provider) => ({ provider, runtimeStatus: mediaStatuses.get(provider.id) })),
200
397
  ];
201
398
  const query = readString(args.query).toLowerCase();
399
+ const limit = readLimit(args.limit, 100);
400
+ const voiceWorkflows = buildVoiceInteractionWorkflows(context, readiness);
202
401
  const filtered = providers
203
402
  .filter(({ provider, runtimeStatus }) => !query || providerSearchText(provider, runtimeStatus).includes(query))
204
- .slice(0, readLimit(args.limit, 100));
403
+ .slice(0, limit);
404
+ const filteredVoiceWorkflows = voiceWorkflows
405
+ .filter((workflow) => voiceWorkflowMatches(workflow, query))
406
+ .slice(0, limit);
205
407
  return {
206
408
  status: 'available',
207
409
  summary: {
@@ -215,6 +417,8 @@ export async function mediaPostureSummary(context: CommandContext, args: AgentHa
215
417
  ttsResponseRouteConfigured: readiness.ttsResponseRouteConfigured,
216
418
  voiceSurfaceEnabled: readConfigBoolean(context, 'ui.voiceEnabled', false),
217
419
  browserToolState: readiness.browserToolState,
420
+ voiceWorkflows: voiceWorkflowSummary(voiceWorkflows),
421
+ returnedVoiceWorkflows: filteredVoiceWorkflows.length,
218
422
  artifactStoreAvailable: Boolean(context.platform.artifactStore),
219
423
  ttsProviderSetting: readConfigString(context, 'tts.provider') || null,
220
424
  ttsVoiceSettingConfigured: readConfigString(context, 'tts.voice').length > 0,
@@ -223,6 +427,7 @@ export async function mediaPostureSummary(context: CommandContext, args: AgentHa
223
427
  providers: filtered.map(({ provider, runtimeStatus }) => describeProvider(provider, runtimeStatus, {
224
428
  includeParameters: args.includeParameters === true,
225
429
  })),
430
+ voiceWorkflows: filteredVoiceWorkflows.map((workflow) => describeVoiceWorkflow(workflow, args.includeParameters === true)),
226
431
  returned: filtered.length,
227
432
  total: providers.length,
228
433
  policy: 'Read-only voice/media posture. Media generation, voice enable/disable, TTS setting changes, and bundle export stay confirmation-gated through first-class tools, settings modes, workspace actions, or slash-command mirrors.',
@@ -232,6 +437,7 @@ export async function mediaPostureSummary(context: CommandContext, args: AgentHa
232
437
  singleProviderMode: 'media_provider',
233
438
  ttsProviderPicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-provider-picker" confirm:true explicitUserRequest:"..."',
234
439
  ttsVoicePicker: 'agent_harness mode:"open_ui_surface" surfaceId:"tts-voice-picker" confirm:true explicitUserRequest:"..."',
440
+ voiceWorkflowPosture: 'agent_harness mode:"media_posture" query:"push to talk" includeParameters:true',
235
441
  commands: ['/media providers', '/voice review', '/tts <prompt>', '/image <path>'],
236
442
  } } : {}),
237
443
  };