@theoremjs/react 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +728 -202
- package/client/composer-hints.js +1 -1
- package/client/decision-images.d.ts +76 -0
- package/client/decision-images.js +139 -0
- package/client/decision-transport.d.ts +26 -4
- package/client/decision-transport.js +79 -6
- package/client/embedding-input.d.ts +84 -0
- package/client/embedding-input.js +194 -0
- package/client/embedding-space.d.ts +82 -0
- package/client/embedding-space.js +389 -0
- package/client/embedding-transport.d.ts +40 -0
- package/client/embedding-transport.js +71 -0
- package/client/failure.d.ts +7 -10
- package/client/failure.js +9 -9
- package/client/host-call.d.ts +1 -1
- package/client/host-call.js +7 -2
- package/client/host-transport.d.ts +2 -0
- package/client/host-transport.js +3 -2
- package/client/index.d.ts +19 -11
- package/client/index.js +14 -10
- package/client/ink-waveform.d.ts +1 -1
- package/client/ink-waveform.js +1 -2
- package/client/live/apply-live-turn-tool-event.js +1 -1
- package/client/live/live-captions.d.ts +30 -0
- package/client/live/live-captions.js +105 -1
- package/client/live/live-mic-forward.d.ts +1 -0
- package/client/live/live-mic-forward.js +11 -2
- package/client/live/live-page-tool.d.ts +34 -0
- package/client/live/live-page-tool.js +11 -0
- package/client/live/live-state.d.ts +4 -2
- package/client/live/live-state.js +2 -0
- package/client/live/live-video.js +1 -1
- package/client/live/run-live-tool-call.d.ts +7 -2
- package/client/live/run-live-tool-call.js +48 -10
- package/client/live/use-live-caption-log.d.ts +17 -0
- package/client/live/use-live-caption-log.js +51 -0
- package/client/live-client.d.ts +52 -4
- package/client/live-client.js +250 -59
- package/client/live-messages.d.ts +51 -13
- package/client/live-messages.js +42 -9
- package/client/page-dispatch.d.ts +15 -0
- package/client/page-dispatch.js +63 -0
- package/client/run-commit.d.ts +16 -43
- package/client/run-commit.js +26 -101
- package/client/run-session.d.ts +40 -41
- package/client/run-session.js +104 -112
- package/client/schema-fields.js +27 -6
- package/client/shaped-data.js +37 -8
- package/client/source-citations.js +1 -1
- package/client/space-geometry.d.ts +39 -0
- package/client/space-geometry.js +183 -0
- package/client/state-fields.js +1 -1
- package/client/tool-result.js +30 -12
- package/client/tool-resume.d.ts +18 -1
- package/client/tool-resume.js +4 -1
- package/client/trace-feed.d.ts +1 -1
- package/client/trace-story.d.ts +2 -2
- package/client/trace-story.js +43 -19
- package/client/trace-view.d.ts +2 -2
- package/client/trace-view.js +56 -16
- package/client/transcript-groups.d.ts +28 -2
- package/client/transcript-groups.js +63 -13
- package/client/transcript-schema.d.ts +10 -0
- package/client/transcript-schema.js +120 -0
- package/client/transport.d.ts +114 -26
- package/client/transport.js +106 -32
- package/client/turn-client.d.ts +17 -8
- package/client/turn-client.js +26 -31
- package/client/voice-recorder.d.ts +1 -1
- package/client/voice-recorder.js +2 -5
- package/client/wire-line.js +5 -5
- package/client/worklets/mic-capture.js +9 -9
- package/components/InkWaveform.d.ts +12 -1
- package/components/InkWaveform.js +65 -42
- package/components/live/use-live-runner-controls.d.ts +3 -4
- package/components/live/use-live-runner-controls.js +6 -10
- package/components/live/use-live-runner-model.d.ts +10 -6
- package/components/live/use-live-runner-model.js +29 -14
- package/components/live/use-live-runner-ui.d.ts +10 -8
- package/components/live/use-live-runner-ui.js +19 -11
- package/components/live/use-live-session-client.d.ts +4 -4
- package/components/live/use-live-session-client.js +11 -8
- package/components/use-composer-voice.d.ts +4 -4
- package/components/use-composer-voice.js +8 -8
- package/components/use-editor-selection.js +4 -1
- package/components/use-voice-playback.d.ts +2 -1
- package/components/use-voice-playback.js +4 -4
- package/hooks/use-described.d.ts +5 -1
- package/hooks/use-described.js +11 -9
- package/hooks/use-embedding-index.d.ts +27 -0
- package/hooks/use-embedding-index.js +43 -0
- package/hooks/use-one-call.d.ts +31 -0
- package/hooks/use-one-call.js +76 -0
- package/hooks/use-page-tool-warnings.d.ts +6 -0
- package/hooks/use-page-tool-warnings.js +25 -0
- package/hooks/use-second-ticker.d.ts +2 -0
- package/hooks/use-second-ticker.js +13 -0
- package/hooks/use-theorem-chat-actions.d.ts +25 -21
- package/hooks/use-theorem-chat-actions.js +67 -45
- package/hooks/use-theorem-chat-state.d.ts +6 -6
- package/hooks/use-theorem-chat-state.js +13 -9
- package/hooks/use-theorem-chat.d.ts +48 -14
- package/hooks/use-theorem-chat.js +329 -141
- package/hooks/use-theorem-decision.d.ts +5 -10
- package/hooks/use-theorem-decision.js +4 -67
- package/hooks/use-theorem-embedding.d.ts +18 -0
- package/hooks/use-theorem-embedding.js +12 -0
- package/hooks/use-theorem-host.d.ts +5 -4
- package/hooks/use-theorem-host.js +26 -8
- package/hooks/use-theorem-interface.d.ts +6 -3
- package/hooks/use-theorem-interface.js +12 -22
- package/index.d.ts +6 -3
- package/index.js +5 -2
- package/live.d.ts +1 -0
- package/live.js +1 -1
- package/package.json +6 -5
- package/server/checkpoint-ownership.d.ts +6 -0
- package/server/checkpoint-ownership.js +42 -0
- package/server/conversation-store.d.ts +92 -0
- package/server/conversation-store.js +131 -0
- package/server/conversation.d.ts +193 -0
- package/server/conversation.js +552 -0
- package/server/decision-handler.d.ts +12 -4
- package/server/decision-handler.js +29 -38
- package/server/embedding-handler.d.ts +33 -0
- package/server/embedding-handler.js +45 -0
- package/server/handler.d.ts +58 -20
- package/server/handler.js +441 -238
- package/server/mod.d.ts +15 -6
- package/server/mod.js +13 -5
- package/server/page-dispatch.d.ts +22 -0
- package/server/page-dispatch.js +127 -0
- package/server/request-body.d.ts +2 -0
- package/server/request-body.js +42 -0
- package/server/request-check.d.ts +6 -1
- package/server/request-check.js +27 -12
- package/server/session-authority.d.ts +8 -0
- package/server/session-authority.js +78 -0
- package/server/session-boundary.d.ts +26 -0
- package/server/session-boundary.js +64 -0
- package/server/session-identity.d.ts +16 -0
- package/server/session-identity.js +41 -0
- package/server/session-limits.d.ts +12 -0
- package/server/session-limits.js +59 -0
- package/server/session-store.d.ts +69 -20
- package/server/session-store.js +220 -5
- package/server/single-action.d.ts +21 -0
- package/server/single-action.js +30 -0
- package/server/steer-inbox.js +1 -1
- package/server/tool-operations.d.ts +6 -0
- package/server/tool-operations.js +132 -0
- package/server/turn-input.d.ts +10 -0
- package/server/turn-input.js +29 -0
- package/styles/ink-controls.css +78 -78
- package/ui/CardWall.d.ts +10 -0
- package/ui/CardWall.js +61 -0
- package/ui/ChatComposerBar.d.ts +28 -5
- package/ui/ChatComposerBar.js +85 -30
- package/ui/ChatTranscript.d.ts +14 -1
- package/ui/ChatTranscript.js +110 -57
- package/ui/ConsoleFrame.d.ts +61 -4
- package/ui/ConsoleFrame.js +109 -9
- package/ui/DecisionAnswers.d.ts +40 -2
- package/ui/DecisionAnswers.js +166 -35
- package/ui/DecisionImages.d.ts +16 -0
- package/ui/DecisionImages.js +46 -0
- package/ui/EmbeddingDocuments.d.ts +78 -0
- package/ui/EmbeddingDocuments.js +278 -0
- package/ui/EmbeddingQuery.d.ts +27 -0
- package/ui/EmbeddingQuery.js +95 -0
- package/ui/EmbeddingResults.d.ts +41 -0
- package/ui/EmbeddingResults.js +165 -0
- package/ui/EmbeddingSpace.d.ts +26 -0
- package/ui/EmbeddingSpace.js +106 -0
- package/ui/LiveCaptionsPanel.d.ts +22 -0
- package/ui/LiveCaptionsPanel.js +27 -0
- package/ui/LiveRunner.d.ts +6 -4
- package/ui/LiveRunner.js +42 -55
- package/ui/PaneState.d.ts +33 -0
- package/ui/PaneState.js +50 -0
- package/ui/SchemaFields.d.ts +1 -1
- package/ui/SchemaFields.js +54 -26
- package/ui/ShapedData.js +73 -28
- package/ui/SidePanel.d.ts +74 -5
- package/ui/SidePanel.js +82 -9
- package/ui/StateFields.d.ts +10 -2
- package/ui/StateFields.js +56 -13
- package/ui/TheoremChat.d.ts +65 -14
- package/ui/TheoremChat.js +66 -78
- package/ui/TheoremDecision.d.ts +12 -20
- package/ui/TheoremDecision.js +78 -35
- package/ui/TheoremEmbedding.d.ts +27 -0
- package/ui/TheoremEmbedding.js +122 -0
- package/ui/TheoremHost.d.ts +22 -5
- package/ui/TheoremHost.js +127 -37
- package/ui/ToolGateCard.d.ts +5 -1
- package/ui/ToolGateCard.js +30 -23
- package/ui/ToolResult.js +12 -10
- package/ui/ToolResultCharts.js +29 -12
- package/ui/TraceCharts.d.ts +2 -2
- package/ui/TraceCharts.js +48 -17
- package/ui/TraceGuardrails.d.ts +3 -2
- package/ui/TraceGuardrails.js +24 -6
- package/ui/TraceInspector.d.ts +11 -1
- package/ui/TraceInspector.js +45 -28
- package/ui/TraceInspectorPanel.d.ts +31 -9
- package/ui/TraceInspectorPanel.js +77 -39
- package/ui/TraceOverview.d.ts +7 -3
- package/ui/TraceOverview.js +44 -14
- package/ui/TraceSpanDetail.js +24 -22
- package/ui/TraceStory.js +9 -8
- package/ui/TraceValues.js +19 -9
- package/ui/TraceWaterfall.js +12 -9
- package/ui/VoiceNote.js +4 -4
- package/ui/approval-heading.d.ts +4 -0
- package/ui/approval-heading.js +9 -0
- package/ui/arrive.d.ts +18 -0
- package/ui/arrive.js +46 -0
- package/ui/built/theme.css +86 -68
- package/ui/built/theme.css.d.ts +9 -0
- package/ui/built/theorem.d.ts +3 -3
- package/ui/built/theorem.js +34 -5
- package/ui/built/theorem.variants.d.ts +8 -2
- package/ui/code-language.d.ts +12 -0
- package/ui/code-language.js +50 -0
- package/ui/disclosure-motion.js +53 -9
- package/ui/embedding-space-gl.d.ts +37 -0
- package/ui/embedding-space-gl.js +663 -0
- package/ui/embedding-space-view.d.ts +8 -0
- package/ui/embedding-space-view.js +8 -0
- package/ui/glide.d.ts +7 -0
- package/ui/glide.js +44 -0
- package/ui/icons.js +2 -1
- package/ui/index.d.ts +20 -9
- package/ui/index.js +20 -10
- package/ui/labels-provider.js +5 -2
- package/ui/labels.d.ts +374 -85
- package/ui/labels.js +1028 -188
- package/ui/markdown-plugins.d.ts +9 -0
- package/ui/markdown-plugins.js +13 -0
- package/ui/mcp-icon.d.ts +6 -0
- package/ui/mcp-icon.js +8 -0
- package/ui/row-keys.d.ts +19 -0
- package/ui/row-keys.js +33 -0
- package/ui/theme.d.ts +1 -1
- package/ui/theme.js +2 -2
- package/ui/theorem-theme.js +32 -10
- package/ui/trace-palette.d.ts +2 -16
- package/ui/trace-palette.js +2 -16
- package/ui/trace-patterns.d.ts +11 -3
- package/ui/trace-patterns.js +16 -3
- package/ui/transcript-copy-text.js +1 -0
- package/ui/wall-columns.d.ts +8 -0
- package/ui/wall-columns.js +19 -0
- package/client/walk-away.d.ts +0 -34
- package/client/walk-away.js +0 -48
- package/server/walk-away.d.ts +0 -22
- package/server/walk-away.js +0 -41
package/ui/labels.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* the same mechanism that words Astryx's own components (`@astryx.*`), so one
|
|
4
4
|
* override table replaces any line on screen, per locale. Messages are ICU
|
|
5
5
|
* (`{handle}`, `{n, plural, …}`); `params` names the values each one is given.
|
|
6
|
-
* Failures are worded by the profile
|
|
6
|
+
* Failures are worded by the profile labels, not here.
|
|
7
7
|
*
|
|
8
8
|
* @module
|
|
9
9
|
*/
|
|
@@ -14,8 +14,14 @@ export const THEOREM_UI_CATALOG = {
|
|
|
14
14
|
description: "The agent's name above its messages, on the landing and in captions.",
|
|
15
15
|
params: ['handle'],
|
|
16
16
|
},
|
|
17
|
-
'@theorem.chat.greeting': {
|
|
18
|
-
|
|
17
|
+
'@theorem.chat.greeting': {
|
|
18
|
+
defaultMessage: 'What are we working on?',
|
|
19
|
+
description: 'Chat landing heading, before the first message.',
|
|
20
|
+
},
|
|
21
|
+
'@theorem.chat.loading': {
|
|
22
|
+
defaultMessage: 'Loading…',
|
|
23
|
+
description: 'Spinner label while the profile loads.',
|
|
24
|
+
},
|
|
19
25
|
'@theorem.chat.live_unsupported.title': {
|
|
20
26
|
defaultMessage: "Live profiles aren't supported here",
|
|
21
27
|
description: 'Shown when TheoremChat is pointed at a live profile.',
|
|
@@ -29,19 +35,32 @@ export const THEOREM_UI_CATALOG = {
|
|
|
29
35
|
description: 'Empty composer placeholder.',
|
|
30
36
|
params: ['handle'],
|
|
31
37
|
},
|
|
32
|
-
'@theorem.composer.listening': {
|
|
38
|
+
'@theorem.composer.listening': {
|
|
39
|
+
defaultMessage: 'Listening…',
|
|
40
|
+
description: 'Composer placeholder while a voice note records.',
|
|
41
|
+
},
|
|
33
42
|
'@theorem.composer.attach': { defaultMessage: 'Attach files', description: 'Paperclip button.' },
|
|
34
|
-
'@theorem.composer.record': {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
'@theorem.composer.
|
|
43
|
+
'@theorem.composer.record': {
|
|
44
|
+
defaultMessage: 'Record voice',
|
|
45
|
+
description: 'Microphone button, idle.',
|
|
46
|
+
},
|
|
47
|
+
'@theorem.composer.stop_recording': {
|
|
48
|
+
defaultMessage: 'Stop recording',
|
|
49
|
+
description: 'Microphone button, recording.',
|
|
50
|
+
},
|
|
51
|
+
'@theorem.composer.send_options': {
|
|
52
|
+
defaultMessage: 'More send options',
|
|
53
|
+
description: 'Menu button beside send.',
|
|
54
|
+
},
|
|
39
55
|
'@theorem.composer.menu.queue': { defaultMessage: 'Queue', description: 'Send menu item.' },
|
|
40
56
|
'@theorem.composer.menu.queue.description': {
|
|
41
57
|
defaultMessage: 'Send it once this reply finishes.',
|
|
42
58
|
description: 'Send menu item detail: the message waits its turn.',
|
|
43
59
|
},
|
|
44
|
-
'@theorem.composer.menu.steer': {
|
|
60
|
+
'@theorem.composer.menu.steer': {
|
|
61
|
+
defaultMessage: 'Steer this reply',
|
|
62
|
+
description: 'Send menu item.',
|
|
63
|
+
},
|
|
45
64
|
'@theorem.composer.menu.steer.description': {
|
|
46
65
|
defaultMessage: 'Add it to the reply in progress. The agent reads it at its next step.',
|
|
47
66
|
description: 'Send menu item detail: the message joins the running reply instead of waiting.',
|
|
@@ -60,53 +79,158 @@ export const THEOREM_UI_CATALOG = {
|
|
|
60
79
|
defaultMessage: 'Replacing this?',
|
|
61
80
|
description: 'Hint when the whole draft is selected and could be stashed.',
|
|
62
81
|
},
|
|
63
|
-
'@theorem.composer.hint.stash-selected-draft.action': {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
'@theorem.composer.drawer.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
82
|
+
'@theorem.composer.hint.stash-selected-draft.action': {
|
|
83
|
+
defaultMessage: 'Stash it',
|
|
84
|
+
description: "The hint's button.",
|
|
85
|
+
},
|
|
86
|
+
'@theorem.composer.drawer.steer': {
|
|
87
|
+
defaultMessage: 'steering',
|
|
88
|
+
description: 'Drawer header when only steering messages wait.',
|
|
89
|
+
},
|
|
90
|
+
'@theorem.composer.drawer.queue': {
|
|
91
|
+
defaultMessage: 'queued',
|
|
92
|
+
description: 'Drawer header when only queued messages wait.',
|
|
93
|
+
},
|
|
94
|
+
'@theorem.composer.drawer.stash': {
|
|
95
|
+
defaultMessage: 'stashed',
|
|
96
|
+
description: 'Drawer header when only stashed messages wait.',
|
|
97
|
+
},
|
|
98
|
+
'@theorem.composer.drawer.attached': {
|
|
99
|
+
defaultMessage: 'attached',
|
|
100
|
+
description: 'Drawer header when only files wait.',
|
|
101
|
+
},
|
|
102
|
+
'@theorem.composer.drawer.steer.count': {
|
|
103
|
+
defaultMessage: '{n} steering',
|
|
104
|
+
description: 'One part of a mixed drawer header.',
|
|
105
|
+
params: ['n'],
|
|
106
|
+
},
|
|
107
|
+
'@theorem.composer.drawer.queue.count': {
|
|
108
|
+
defaultMessage: '{n} queued',
|
|
109
|
+
description: 'One part of a mixed drawer header.',
|
|
110
|
+
params: ['n'],
|
|
111
|
+
},
|
|
112
|
+
'@theorem.composer.drawer.stash.count': {
|
|
113
|
+
defaultMessage: '{n} stashed',
|
|
114
|
+
description: 'One part of a mixed drawer header.',
|
|
115
|
+
params: ['n'],
|
|
116
|
+
},
|
|
71
117
|
'@theorem.composer.drawer.attached.count': {
|
|
72
118
|
defaultMessage: '{n} attached',
|
|
73
119
|
description: 'One part of a mixed drawer header.',
|
|
74
120
|
params: ['n'],
|
|
75
121
|
},
|
|
76
|
-
'@theorem.composer.drawer.separator': {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
'@theorem.composer.pending.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
'@theorem.composer.pending.
|
|
85
|
-
|
|
122
|
+
'@theorem.composer.drawer.separator': {
|
|
123
|
+
defaultMessage: ' · ',
|
|
124
|
+
description: 'Between the parts of a mixed drawer header.',
|
|
125
|
+
},
|
|
126
|
+
'@theorem.composer.pending.steer': {
|
|
127
|
+
defaultMessage: 'Steering',
|
|
128
|
+
description: 'Badge on a waiting steering message.',
|
|
129
|
+
},
|
|
130
|
+
'@theorem.composer.pending.queue': {
|
|
131
|
+
defaultMessage: 'Queued',
|
|
132
|
+
description: 'Badge on a waiting queued message.',
|
|
133
|
+
},
|
|
134
|
+
'@theorem.composer.pending.stash': {
|
|
135
|
+
defaultMessage: 'Stashed',
|
|
136
|
+
description: 'Badge on a waiting stashed message.',
|
|
137
|
+
},
|
|
138
|
+
'@theorem.composer.pending.edit': {
|
|
139
|
+
defaultMessage: 'Edit',
|
|
140
|
+
description: 'Waiting message: back into the composer.',
|
|
141
|
+
},
|
|
142
|
+
'@theorem.composer.pending.queue_action': {
|
|
143
|
+
defaultMessage: 'Queue',
|
|
144
|
+
description: 'Stashed message: queue it.',
|
|
145
|
+
},
|
|
146
|
+
'@theorem.composer.pending.send_now': {
|
|
147
|
+
defaultMessage: 'Send now',
|
|
148
|
+
description: 'Waiting message: send it now.',
|
|
149
|
+
},
|
|
150
|
+
'@theorem.composer.pending.move_up': {
|
|
151
|
+
defaultMessage: 'Move up',
|
|
152
|
+
description: 'Waiting message: earlier.',
|
|
153
|
+
},
|
|
154
|
+
'@theorem.composer.pending.move_down': {
|
|
155
|
+
defaultMessage: 'Move down',
|
|
156
|
+
description: 'Waiting message: later.',
|
|
157
|
+
},
|
|
158
|
+
'@theorem.composer.pending.remove': {
|
|
159
|
+
defaultMessage: 'Remove',
|
|
160
|
+
description: 'Waiting message: discard.',
|
|
161
|
+
},
|
|
86
162
|
'@theorem.transcript.copy': { defaultMessage: 'Copy', description: 'Copy a message.' },
|
|
87
|
-
'@theorem.transcript.copied': {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
'@theorem.transcript.
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
163
|
+
'@theorem.transcript.copied': {
|
|
164
|
+
defaultMessage: 'Copied',
|
|
165
|
+
description: 'Right after copying a message.',
|
|
166
|
+
},
|
|
167
|
+
'@theorem.transcript.now': {
|
|
168
|
+
defaultMessage: 'now',
|
|
169
|
+
description: 'Message time during its first minute.',
|
|
170
|
+
},
|
|
171
|
+
'@theorem.transcript.failed': {
|
|
172
|
+
defaultMessage: 'failed',
|
|
173
|
+
description: 'Message status: the turn failed. The reason shows on hover.',
|
|
174
|
+
},
|
|
175
|
+
'@theorem.transcript.generated_image': {
|
|
176
|
+
defaultMessage: 'Generated image',
|
|
177
|
+
description: 'Alt text for a generated image.',
|
|
178
|
+
},
|
|
179
|
+
'@theorem.transcript.generated_video': {
|
|
180
|
+
defaultMessage: 'Generated video',
|
|
181
|
+
description: 'Alt text for a generated video.',
|
|
182
|
+
},
|
|
183
|
+
'@theorem.transcript.open_generated_image': {
|
|
184
|
+
defaultMessage: 'Open generated image',
|
|
185
|
+
description: 'Opens the image full size.',
|
|
186
|
+
},
|
|
187
|
+
'@theorem.transcript.generating_image': {
|
|
188
|
+
defaultMessage: 'Generating image',
|
|
189
|
+
description: 'Placeholder while an image generates.',
|
|
190
|
+
},
|
|
191
|
+
'@theorem.transcript.sources': {
|
|
192
|
+
defaultMessage: 'Sources',
|
|
193
|
+
description: 'The row of source chips (screen readers).',
|
|
194
|
+
},
|
|
195
|
+
'@theorem.transcript.tool_input': {
|
|
196
|
+
defaultMessage: 'Input',
|
|
197
|
+
description: "A tool call's arguments, in its detail.",
|
|
198
|
+
},
|
|
95
199
|
'@theorem.transcript.tool_input_edited': {
|
|
96
200
|
defaultMessage: 'Input (edited)',
|
|
97
201
|
description: "A tool call's arguments after the user edited them on approval.",
|
|
98
202
|
},
|
|
99
|
-
'@theorem.transcript.tool_output': {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
203
|
+
'@theorem.transcript.tool_output': {
|
|
204
|
+
defaultMessage: 'Output',
|
|
205
|
+
description: "A tool call's result, in its detail.",
|
|
206
|
+
},
|
|
207
|
+
'@theorem.transcript.tool_error': {
|
|
208
|
+
defaultMessage: 'Error',
|
|
209
|
+
description: "A failed tool call's failure, in its detail.",
|
|
210
|
+
},
|
|
211
|
+
'@theorem.transcript.tokens': {
|
|
212
|
+
defaultMessage: '{count, plural, one {# token} other {# tokens}}',
|
|
213
|
+
description: "Tokens a reply used, under it, or an agent tool's called agent used, on its call row.",
|
|
214
|
+
params: ['count'],
|
|
215
|
+
},
|
|
216
|
+
'@theorem.data.view': {
|
|
217
|
+
defaultMessage: 'View as',
|
|
218
|
+
description: 'Switch between tool data drawn by its shape and its JSON.',
|
|
219
|
+
},
|
|
220
|
+
'@theorem.data.shaped': {
|
|
221
|
+
defaultMessage: 'Data',
|
|
222
|
+
description: 'Tool data drawn as fields, sections, and tables.',
|
|
223
|
+
},
|
|
103
224
|
'@theorem.data.json': { defaultMessage: 'JSON', description: 'Tool data as its raw JSON.' },
|
|
104
225
|
'@theorem.data.item': {
|
|
105
226
|
defaultMessage: 'Item {index}',
|
|
106
227
|
description: 'A list row with no name of its own.',
|
|
107
228
|
params: ['index'],
|
|
108
229
|
},
|
|
109
|
-
'@theorem.data.none': {
|
|
230
|
+
'@theorem.data.none': {
|
|
231
|
+
defaultMessage: 'Empty',
|
|
232
|
+
description: 'An empty list or object in tool data.',
|
|
233
|
+
},
|
|
110
234
|
'@theorem.data.yes': { defaultMessage: 'Yes', description: 'A true value in tool data.' },
|
|
111
235
|
'@theorem.data.no': { defaultMessage: 'No', description: 'A false value in tool data.' },
|
|
112
236
|
'@theorem.data.more': {
|
|
@@ -129,62 +253,106 @@ export const THEOREM_UI_CATALOG = {
|
|
|
129
253
|
description: 'Media without a link, in copied message text.',
|
|
130
254
|
params: ['mimeType'],
|
|
131
255
|
},
|
|
132
|
-
'@theorem.transcript.working': {
|
|
256
|
+
'@theorem.transcript.working': {
|
|
257
|
+
defaultMessage: 'Working…',
|
|
258
|
+
description: 'Turn status while running, start unknown.',
|
|
259
|
+
},
|
|
133
260
|
'@theorem.transcript.working_for': {
|
|
134
261
|
defaultMessage: 'Working for {duration}',
|
|
135
262
|
description: 'Turn status while running.',
|
|
136
263
|
params: ['duration'],
|
|
137
264
|
},
|
|
138
|
-
'@theorem.transcript.worked': {
|
|
265
|
+
'@theorem.transcript.worked': {
|
|
266
|
+
defaultMessage: 'Worked',
|
|
267
|
+
description: 'Turn status once done, duration unknown.',
|
|
268
|
+
},
|
|
139
269
|
'@theorem.transcript.worked_for': {
|
|
140
270
|
defaultMessage: 'Worked for {duration}',
|
|
141
271
|
description: 'Turn status once done.',
|
|
142
272
|
params: ['duration'],
|
|
143
273
|
},
|
|
144
|
-
'@theorem.duration.milliseconds': {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
274
|
+
'@theorem.duration.milliseconds': {
|
|
275
|
+
defaultMessage: '{ms}ms',
|
|
276
|
+
description: 'Under a second.',
|
|
277
|
+
params: ['ms'],
|
|
278
|
+
},
|
|
279
|
+
'@theorem.duration.belowTenth': {
|
|
280
|
+
defaultMessage: '<0.1ms',
|
|
281
|
+
description: 'Above zero but under a tenth of a millisecond, such as a quick guardrail check.',
|
|
282
|
+
},
|
|
283
|
+
'@theorem.duration.seconds': {
|
|
284
|
+
defaultMessage: '{seconds}s',
|
|
285
|
+
description: 'Under a minute.',
|
|
286
|
+
params: ['seconds'],
|
|
287
|
+
},
|
|
288
|
+
'@theorem.duration.minutes': {
|
|
289
|
+
defaultMessage: '{minutes}m',
|
|
290
|
+
description: 'Whole minutes.',
|
|
291
|
+
params: ['minutes'],
|
|
292
|
+
},
|
|
148
293
|
'@theorem.duration.minutes_seconds': {
|
|
149
294
|
defaultMessage: '{minutes}m {seconds}s',
|
|
150
295
|
description: 'Minutes and seconds.',
|
|
151
296
|
params: ['minutes', 'seconds'],
|
|
152
297
|
},
|
|
153
|
-
'@theorem.gate.approval.
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
'@theorem.gate.approval.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
},
|
|
163
|
-
'@theorem.gate.approval.
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
'@theorem.gate.
|
|
169
|
-
|
|
298
|
+
'@theorem.gate.approval.title': {
|
|
299
|
+
defaultMessage: '{agent} wants to {request}',
|
|
300
|
+
description: "Approval card heading. {agent} is the agent's handle; {request} is what the call would do, e.g. 'check the weather'.",
|
|
301
|
+
params: ['agent', 'request'],
|
|
302
|
+
},
|
|
303
|
+
'@theorem.gate.approval.title_no_agent': {
|
|
304
|
+
defaultMessage: 'The agent wants to {request}',
|
|
305
|
+
description: 'Approval card heading when the host names no agent.',
|
|
306
|
+
params: ['request'],
|
|
307
|
+
},
|
|
308
|
+
'@theorem.gate.approval.use_tool': {
|
|
309
|
+
defaultMessage: 'use {tool}',
|
|
310
|
+
description: "The {request} in the heading when the tool sets no labels.request. {tool} is the tool's name in words.",
|
|
311
|
+
params: ['tool'],
|
|
312
|
+
},
|
|
313
|
+
'@theorem.gate.approval.input': {
|
|
314
|
+
defaultMessage: 'Details',
|
|
315
|
+
description: 'Expands the arguments the tool would run with.',
|
|
316
|
+
},
|
|
317
|
+
'@theorem.gate.approval.deny': { defaultMessage: 'Reject', description: 'Approval card button.' },
|
|
318
|
+
'@theorem.gate.approval.approve': {
|
|
319
|
+
defaultMessage: 'Approve',
|
|
320
|
+
description: 'Approval card button.',
|
|
321
|
+
},
|
|
170
322
|
'@theorem.gate.tag.bearer': { defaultMessage: 'bearer', description: 'Credential type tag.' },
|
|
171
323
|
'@theorem.gate.tag.api_key': { defaultMessage: 'api_key', description: 'Credential type tag.' },
|
|
172
324
|
'@theorem.gate.tag.oauth2': { defaultMessage: 'oauth2', description: 'Credential type tag.' },
|
|
173
|
-
'@theorem.gate.auth.
|
|
174
|
-
|
|
175
|
-
|
|
325
|
+
'@theorem.gate.auth.title': {
|
|
326
|
+
defaultMessage: 'Sign in to use {tool}',
|
|
327
|
+
description: "Credential card heading. {tool} is the tool's name in words.",
|
|
328
|
+
params: ['tool'],
|
|
329
|
+
},
|
|
330
|
+
'@theorem.gate.auth.resource': {
|
|
331
|
+
defaultMessage: 'Resource: {resource}',
|
|
332
|
+
description: 'What the credential is for.',
|
|
333
|
+
params: ['resource'],
|
|
334
|
+
},
|
|
176
335
|
'@theorem.gate.auth.no_oauth': {
|
|
177
336
|
defaultMessage: 'No OAuth authorization endpoint is configured.',
|
|
178
337
|
description: 'OAuth tool without an authorization URL.',
|
|
179
338
|
},
|
|
180
|
-
'@theorem.gate.auth.authorize': {
|
|
339
|
+
'@theorem.gate.auth.authorize': {
|
|
340
|
+
defaultMessage: 'Authorize with provider',
|
|
341
|
+
description: 'Opens the OAuth sign-in.',
|
|
342
|
+
},
|
|
181
343
|
'@theorem.gate.auth.provided': {
|
|
182
344
|
defaultMessage: 'Credential provided for {slot}',
|
|
183
345
|
description: 'After submitting a credential or finishing an OAuth sign-in.',
|
|
184
346
|
params: ['slot'],
|
|
185
347
|
},
|
|
186
|
-
'@theorem.gate.auth.api_key': {
|
|
187
|
-
|
|
348
|
+
'@theorem.gate.auth.api_key': {
|
|
349
|
+
defaultMessage: 'API key',
|
|
350
|
+
description: 'Secret field label, API-key tools.',
|
|
351
|
+
},
|
|
352
|
+
'@theorem.gate.auth.bearer': {
|
|
353
|
+
defaultMessage: 'Bearer token',
|
|
354
|
+
description: 'Secret field label, bearer tools.',
|
|
355
|
+
},
|
|
188
356
|
'@theorem.gate.auth.secret_placeholder': {
|
|
189
357
|
defaultMessage: "Secret for slot ''{slot}''",
|
|
190
358
|
description: 'Secret field placeholder.',
|
|
@@ -192,39 +360,96 @@ export const THEOREM_UI_CATALOG = {
|
|
|
192
360
|
},
|
|
193
361
|
'@theorem.gate.auth.secret_note': {
|
|
194
362
|
defaultMessage: ' ',
|
|
195
|
-
description: 'Under the secret field: how the host handles the credential. Blank by default, since only the host knows; the
|
|
363
|
+
description: 'Under the secret field: how the host handles the credential. Blank by default, since only the host knows; the studio says it is used for one call.',
|
|
364
|
+
},
|
|
365
|
+
'@theorem.gate.auth.submit': {
|
|
366
|
+
defaultMessage: 'Submit & continue',
|
|
367
|
+
description: 'Sends the credential.',
|
|
196
368
|
},
|
|
197
|
-
'@theorem.gate.auth.submit': { defaultMessage: 'Submit & continue', description: 'Sends the credential.' },
|
|
198
369
|
'@theorem.voice_note.name': {
|
|
199
370
|
defaultMessage: 'voice.{format}',
|
|
200
371
|
description: "A voice note's name, by audio format (webm, wav, mp3, m4a, ogg).",
|
|
201
372
|
params: ['format'],
|
|
202
373
|
},
|
|
203
|
-
'@theorem.voice_note.unnamed': {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
'@theorem.
|
|
374
|
+
'@theorem.voice_note.unnamed': {
|
|
375
|
+
defaultMessage: 'voice note',
|
|
376
|
+
description: "A voice note's name when its format is unknown.",
|
|
377
|
+
},
|
|
378
|
+
'@theorem.voice_note.play': {
|
|
379
|
+
defaultMessage: 'Play {name}',
|
|
380
|
+
description: 'Voice note, paused.',
|
|
381
|
+
params: ['name'],
|
|
382
|
+
},
|
|
383
|
+
'@theorem.voice_note.pause': {
|
|
384
|
+
defaultMessage: 'Pause {name}',
|
|
385
|
+
description: 'Voice note, playing.',
|
|
386
|
+
params: ['name'],
|
|
387
|
+
},
|
|
388
|
+
'@theorem.voice_note.remove': {
|
|
389
|
+
defaultMessage: 'Remove {name}',
|
|
390
|
+
description: 'Unstages a voice note.',
|
|
391
|
+
params: ['name'],
|
|
392
|
+
},
|
|
393
|
+
'@theorem.decision.state': {
|
|
394
|
+
defaultMessage: 'State',
|
|
395
|
+
description: 'The JSON a decision is asked about (field label).',
|
|
396
|
+
},
|
|
208
397
|
'@theorem.decision.state_size': {
|
|
209
398
|
defaultMessage: '{size} of {limit}',
|
|
210
399
|
description: "The state's size against the profile's limit, under the field.",
|
|
211
400
|
params: ['size', 'limit'],
|
|
212
401
|
},
|
|
213
|
-
'@theorem.decision.view': {
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
'@theorem.decision.
|
|
218
|
-
|
|
219
|
-
|
|
402
|
+
'@theorem.decision.view': {
|
|
403
|
+
defaultMessage: 'Edit as',
|
|
404
|
+
description: 'Switch between the state as fields and as JSON.',
|
|
405
|
+
},
|
|
406
|
+
'@theorem.decision.fields': {
|
|
407
|
+
defaultMessage: 'Fields',
|
|
408
|
+
description: 'The state edited field by field.',
|
|
409
|
+
},
|
|
410
|
+
'@theorem.decision.add_item': {
|
|
411
|
+
defaultMessage: 'Add to {field}',
|
|
412
|
+
description: 'Adds a row to a list in the state.',
|
|
413
|
+
params: ['field'],
|
|
414
|
+
},
|
|
415
|
+
'@theorem.decision.remove_item': {
|
|
416
|
+
defaultMessage: 'Remove {item}',
|
|
417
|
+
description: 'Removes a row from a list in the state.',
|
|
418
|
+
params: ['item'],
|
|
419
|
+
},
|
|
420
|
+
'@theorem.decision.add_value': {
|
|
421
|
+
defaultMessage: 'Add a value',
|
|
422
|
+
description: 'A list of words in the state, while it is empty.',
|
|
423
|
+
},
|
|
424
|
+
'@theorem.decision.invalid_json': {
|
|
425
|
+
defaultMessage: 'Not valid JSON yet',
|
|
426
|
+
description: "The state doesn't parse.",
|
|
427
|
+
},
|
|
428
|
+
'@theorem.decision.null_state': {
|
|
429
|
+
defaultMessage: 'State can’t be null',
|
|
430
|
+
description: 'The state is the JSON null.',
|
|
431
|
+
},
|
|
220
432
|
'@theorem.decision.too_large': {
|
|
221
433
|
defaultMessage: 'Over the {limit} limit',
|
|
222
434
|
description: "The state is larger than the profile's limit.",
|
|
223
435
|
params: ['limit'],
|
|
224
436
|
},
|
|
225
|
-
'@theorem.decision.
|
|
226
|
-
|
|
227
|
-
|
|
437
|
+
'@theorem.decision.answers': {
|
|
438
|
+
defaultMessage: 'Answers',
|
|
439
|
+
description: 'The decision response column.',
|
|
440
|
+
},
|
|
441
|
+
'@theorem.decision.decide': {
|
|
442
|
+
defaultMessage: 'Decide',
|
|
443
|
+
description: 'Asks the questions about the state.',
|
|
444
|
+
},
|
|
445
|
+
'@theorem.decision.deciding': {
|
|
446
|
+
defaultMessage: 'Deciding…',
|
|
447
|
+
description: 'The decide button while it runs.',
|
|
448
|
+
},
|
|
449
|
+
'@theorem.decision.stop': {
|
|
450
|
+
defaultMessage: 'Stop',
|
|
451
|
+
description: 'Cancels the running decision.',
|
|
452
|
+
},
|
|
228
453
|
'@theorem.decision.confidence': {
|
|
229
454
|
defaultMessage: '{percent} sure',
|
|
230
455
|
description: "How sure the model is of a choice or score; percent is formatted, e.g. '92%'.",
|
|
@@ -232,7 +457,7 @@ export const THEOREM_UI_CATALOG = {
|
|
|
232
457
|
},
|
|
233
458
|
'@theorem.decision.option': {
|
|
234
459
|
defaultMessage: '{label}, {percent}',
|
|
235
|
-
description:
|
|
460
|
+
description: 'One option and its probability (screen readers); percent is formatted.',
|
|
236
461
|
params: ['label', 'percent'],
|
|
237
462
|
},
|
|
238
463
|
'@theorem.decision.score_of': {
|
|
@@ -240,45 +465,416 @@ export const THEOREM_UI_CATALOG = {
|
|
|
240
465
|
description: 'A score on its scale from 0, e.g. 1.4 of 3.',
|
|
241
466
|
params: ['score', 'max'],
|
|
242
467
|
},
|
|
243
|
-
'@theorem.decision.type.choice': {
|
|
244
|
-
|
|
245
|
-
|
|
468
|
+
'@theorem.decision.type.choice': {
|
|
469
|
+
defaultMessage: 'Choice',
|
|
470
|
+
description: 'A question that picks one label.',
|
|
471
|
+
},
|
|
472
|
+
'@theorem.decision.type.score': {
|
|
473
|
+
defaultMessage: 'Score',
|
|
474
|
+
description: 'A question that places the state on a scale.',
|
|
475
|
+
},
|
|
476
|
+
'@theorem.decision.type.noul': {
|
|
477
|
+
defaultMessage: 'Noul',
|
|
478
|
+
description: 'A question answered with one number.',
|
|
479
|
+
},
|
|
480
|
+
'@theorem.decision.type.box': {
|
|
481
|
+
defaultMessage: 'Box',
|
|
482
|
+
description: 'A question answered with one box in an image.',
|
|
483
|
+
},
|
|
484
|
+
'@theorem.decision.box_edges': {
|
|
485
|
+
defaultMessage: 'Left {left}, top {top}, right {right}, bottom {bottom}',
|
|
486
|
+
description: 'Where a box sits in its image, each edge as a share of the image from its top-left corner.',
|
|
487
|
+
params: ['left', 'top', 'right', 'bottom'],
|
|
488
|
+
},
|
|
489
|
+
'@theorem.decision.add_image': {
|
|
490
|
+
defaultMessage: 'Add an image',
|
|
491
|
+
description: 'The drop area under the state: each image dropped or chosen becomes a state field.',
|
|
492
|
+
},
|
|
493
|
+
'@theorem.decision.add_image_hint': {
|
|
494
|
+
defaultMessage: 'Drop a PNG or JPEG, or choose one. It becomes a field the questions can name.',
|
|
495
|
+
description: 'What the drop area under the state says it does.',
|
|
496
|
+
},
|
|
497
|
+
'@theorem.decision.replace_image': {
|
|
498
|
+
defaultMessage: 'Replace',
|
|
499
|
+
description: "An image field's file input, which swaps in another PNG or JPEG.",
|
|
500
|
+
},
|
|
501
|
+
'@theorem.decision.image_bad': {
|
|
502
|
+
defaultMessage: '{file} is not a PNG or JPEG.',
|
|
503
|
+
description: 'A file attached as an image that is neither.',
|
|
504
|
+
params: ['file'],
|
|
505
|
+
},
|
|
506
|
+
'@theorem.decision.edit_question': {
|
|
507
|
+
defaultMessage: 'Edit {question}',
|
|
508
|
+
description: 'The button on an answer that opens its question where it is set up. The page shows it only when it can.',
|
|
509
|
+
params: ['question'],
|
|
510
|
+
},
|
|
511
|
+
'@theorem.decision.box_in': {
|
|
512
|
+
defaultMessage: 'The box, cut from the image',
|
|
513
|
+
description: 'The alt text of the part of the image a box answer covers.',
|
|
514
|
+
},
|
|
515
|
+
'@theorem.decision.open_box': {
|
|
516
|
+
defaultMessage: 'See the box in the whole image',
|
|
517
|
+
description: 'The cut-out box on an answer, which opens the whole image with the box outlined.',
|
|
518
|
+
},
|
|
519
|
+
'@theorem.decision.box_marked': {
|
|
520
|
+
defaultMessage: 'The whole image, the box outlined and the rest shaded',
|
|
521
|
+
description: 'The alt text of the whole image a box answer opens.',
|
|
522
|
+
},
|
|
246
523
|
'@theorem.decision.tokens': {
|
|
247
524
|
defaultMessage: '{count, plural, one {# token} other {# tokens}}',
|
|
248
525
|
description: 'Input tokens the decision used, in the line under the answers.',
|
|
249
526
|
params: ['count'],
|
|
250
527
|
},
|
|
251
|
-
'@theorem.
|
|
252
|
-
|
|
253
|
-
|
|
528
|
+
'@theorem.embedding.documents': {
|
|
529
|
+
defaultMessage: 'Documents',
|
|
530
|
+
description: 'What a search looks through: the texts and files to embed (card title).',
|
|
531
|
+
},
|
|
532
|
+
'@theorem.embedding.document': {
|
|
533
|
+
defaultMessage: 'Document {number}',
|
|
534
|
+
description: 'One document, by its place in the list.',
|
|
535
|
+
params: ['number'],
|
|
536
|
+
},
|
|
537
|
+
'@theorem.embedding.text': {
|
|
538
|
+
defaultMessage: 'Text',
|
|
539
|
+
description: 'Text to split into documents (field label).',
|
|
540
|
+
},
|
|
541
|
+
'@theorem.embedding.text_placeholder': {
|
|
542
|
+
defaultMessage: 'Paste text to search through',
|
|
543
|
+
description: 'The empty text field on the documents card.',
|
|
544
|
+
},
|
|
545
|
+
'@theorem.embedding.split': {
|
|
546
|
+
defaultMessage: 'Split by',
|
|
547
|
+
description: 'Where the text is cut into documents (field label).',
|
|
548
|
+
},
|
|
549
|
+
'@theorem.embedding.split_whole': {
|
|
550
|
+
defaultMessage: 'Nothing: one document',
|
|
551
|
+
description: 'The text is one document.',
|
|
552
|
+
},
|
|
553
|
+
'@theorem.embedding.split_lines': {
|
|
554
|
+
defaultMessage: 'Lines',
|
|
555
|
+
description: 'Each line of the text is a document.',
|
|
556
|
+
},
|
|
557
|
+
'@theorem.embedding.split_paragraphs': {
|
|
558
|
+
defaultMessage: 'Paragraphs',
|
|
559
|
+
description: 'Each run of text between blank lines is a document.',
|
|
560
|
+
},
|
|
561
|
+
'@theorem.embedding.split_commas': {
|
|
562
|
+
defaultMessage: 'Commas',
|
|
563
|
+
description: 'Each piece of the text between commas is a document.',
|
|
564
|
+
},
|
|
565
|
+
'@theorem.embedding.split_custom': {
|
|
566
|
+
defaultMessage: 'A separator you type',
|
|
567
|
+
description: 'The text is cut wherever a separator of the user’s own appears.',
|
|
568
|
+
},
|
|
569
|
+
'@theorem.embedding.separator': {
|
|
570
|
+
defaultMessage: 'Separator',
|
|
571
|
+
description: 'The text the documents are cut at (field label).',
|
|
572
|
+
},
|
|
573
|
+
'@theorem.embedding.files': {
|
|
574
|
+
defaultMessage: 'Files',
|
|
575
|
+
description: 'Adds files as documents (field label).',
|
|
576
|
+
},
|
|
577
|
+
'@theorem.embedding.drop_files': {
|
|
578
|
+
defaultMessage: 'Drop files here, or click to upload',
|
|
579
|
+
description: "The file field's prompt.",
|
|
580
|
+
},
|
|
581
|
+
'@theorem.embedding.unreadable': {
|
|
582
|
+
defaultMessage: "{name} couldn't be read.",
|
|
583
|
+
description: 'A chosen file the browser could not read.',
|
|
584
|
+
params: ['name'],
|
|
585
|
+
},
|
|
586
|
+
'@theorem.embedding.remove': {
|
|
587
|
+
defaultMessage: 'Remove {name}',
|
|
588
|
+
description: 'Takes a document off the list.',
|
|
589
|
+
params: ['name'],
|
|
590
|
+
},
|
|
591
|
+
'@theorem.embedding.from_file': {
|
|
592
|
+
defaultMessage: 'From {name}',
|
|
593
|
+
description: 'A document that is a piece of a text file, under its text.',
|
|
594
|
+
params: ['name'],
|
|
595
|
+
},
|
|
596
|
+
'@theorem.embedding.from_json': {
|
|
597
|
+
defaultMessage: 'From the JSON',
|
|
598
|
+
description: 'The documents of a pasted list, as a group.',
|
|
599
|
+
},
|
|
600
|
+
'@theorem.embedding.group': {
|
|
601
|
+
defaultMessage: '{source} · {count, plural, one {# document} other {# documents}}',
|
|
602
|
+
description: 'A group of documents from one source, above its first few.',
|
|
603
|
+
params: ['source', 'count'],
|
|
604
|
+
},
|
|
605
|
+
'@theorem.embedding.held_file': {
|
|
606
|
+
defaultMessage: 'Held by the provider',
|
|
607
|
+
description: 'A file the provider already holds, referred to by address, beside its type.',
|
|
608
|
+
},
|
|
609
|
+
'@theorem.embedding.more': {
|
|
610
|
+
defaultMessage: '{count, plural, one {# more document} other {# more documents}}',
|
|
611
|
+
description: 'Documents past the ones the list shows.',
|
|
612
|
+
params: ['count'],
|
|
613
|
+
},
|
|
614
|
+
'@theorem.embedding.invalid_json': {
|
|
615
|
+
defaultMessage: 'Not a list of documents: each is text, or an object with parts.',
|
|
616
|
+
description: "The documents' JSON doesn't read as the inputs an embedding takes.",
|
|
617
|
+
},
|
|
618
|
+
'@theorem.embedding.no_documents': {
|
|
619
|
+
defaultMessage: 'Add text or files to search through.',
|
|
620
|
+
description: 'There are no documents yet.',
|
|
621
|
+
},
|
|
622
|
+
'@theorem.embedding.empty': {
|
|
623
|
+
defaultMessage: '{name} is empty.',
|
|
624
|
+
description: 'A document or the query has no text and no file.',
|
|
625
|
+
params: ['name'],
|
|
626
|
+
},
|
|
627
|
+
'@theorem.embedding.text_off': {
|
|
628
|
+
defaultMessage: '{name} has text, and this profile embeds files only.',
|
|
629
|
+
description: 'A document or the query has text the profile does not take.',
|
|
630
|
+
params: ['name'],
|
|
631
|
+
},
|
|
632
|
+
'@theorem.embedding.too_many': {
|
|
633
|
+
defaultMessage: 'One request takes at most {max} documents.',
|
|
634
|
+
description: "A request holds more inputs than the profile's model takes in one call.",
|
|
635
|
+
params: ['max'],
|
|
636
|
+
},
|
|
637
|
+
'@theorem.embedding.ready': {
|
|
638
|
+
defaultMessage: '{count, plural, one {# document} other {# documents}} in {requests, plural, one {# request} other {# requests}}',
|
|
639
|
+
description: 'The documents are ready: how many, and how many requests the profile’s limits make them.',
|
|
640
|
+
params: ['count', 'requests'],
|
|
641
|
+
},
|
|
642
|
+
'@theorem.embedding.index': {
|
|
643
|
+
defaultMessage: 'Index',
|
|
644
|
+
description: 'Embeds the documents so they can be searched.',
|
|
645
|
+
},
|
|
646
|
+
'@theorem.embedding.indexing': {
|
|
647
|
+
defaultMessage: 'Indexing…',
|
|
648
|
+
description: 'The index button while the documents are embedded.',
|
|
649
|
+
},
|
|
650
|
+
'@theorem.embedding.indexing_progress': {
|
|
651
|
+
defaultMessage: 'Indexing {done}/{total}…',
|
|
652
|
+
description: 'The pane while the documents are embedded: the request in flight, of all of them.',
|
|
653
|
+
params: ['done', 'total'],
|
|
654
|
+
},
|
|
655
|
+
'@theorem.embedding.stop': {
|
|
656
|
+
defaultMessage: 'Stop',
|
|
657
|
+
description: 'Cancels the running index or search.',
|
|
658
|
+
},
|
|
659
|
+
'@theorem.embedding.query': {
|
|
660
|
+
defaultMessage: 'Query',
|
|
661
|
+
description: 'What to search the documents for (card title).',
|
|
662
|
+
},
|
|
663
|
+
'@theorem.embedding.query_placeholder': {
|
|
664
|
+
defaultMessage: 'What to search for',
|
|
665
|
+
description: 'The empty query field.',
|
|
666
|
+
},
|
|
667
|
+
'@theorem.embedding.query_file': {
|
|
668
|
+
defaultMessage: 'Search with a file',
|
|
669
|
+
description: 'Adds a file to the query, such as an image to find documents like it.',
|
|
670
|
+
},
|
|
671
|
+
'@theorem.embedding.query_invalid_json': {
|
|
672
|
+
defaultMessage: 'Not a query: text, or an object with parts.',
|
|
673
|
+
description: "The query's JSON doesn't read as one embedding input.",
|
|
674
|
+
},
|
|
675
|
+
'@theorem.embedding.stale': {
|
|
676
|
+
defaultMessage: 'The documents changed. Index them again.',
|
|
677
|
+
description: 'The documents differ from the ones last embedded.',
|
|
678
|
+
},
|
|
679
|
+
'@theorem.embedding.remodelled': {
|
|
680
|
+
defaultMessage: 'The model changed. Index the documents again.',
|
|
681
|
+
description: 'The last query came from another model than the one the documents were embedded with.',
|
|
682
|
+
},
|
|
683
|
+
'@theorem.embedding.search': {
|
|
684
|
+
defaultMessage: 'Search',
|
|
685
|
+
description: 'Embeds the query and ranks the documents by it.',
|
|
686
|
+
},
|
|
687
|
+
'@theorem.embedding.searching': {
|
|
688
|
+
defaultMessage: 'Searching…',
|
|
689
|
+
description: 'The search button while the query is embedded.',
|
|
690
|
+
},
|
|
691
|
+
'@theorem.embedding.results': {
|
|
692
|
+
defaultMessage: 'Results',
|
|
693
|
+
description: 'The index and the matches (heading).',
|
|
694
|
+
},
|
|
695
|
+
'@theorem.embedding.indexed': {
|
|
696
|
+
defaultMessage: '{count, plural, one {# document} other {# documents}}',
|
|
697
|
+
description: 'How many documents the index holds, its card’s figure.',
|
|
698
|
+
params: ['count'],
|
|
699
|
+
},
|
|
700
|
+
'@theorem.embedding.view': {
|
|
701
|
+
defaultMessage: 'View',
|
|
702
|
+
description: 'Switches the index card between the space and the list of vectors.',
|
|
703
|
+
},
|
|
704
|
+
'@theorem.embedding.space': {
|
|
705
|
+
defaultMessage: 'Space',
|
|
706
|
+
description: 'The index drawn in three dimensions, alike documents together.',
|
|
707
|
+
},
|
|
708
|
+
'@theorem.embedding.list': {
|
|
709
|
+
defaultMessage: 'List',
|
|
710
|
+
description: 'The index as a list of documents and their vectors.',
|
|
711
|
+
},
|
|
712
|
+
'@theorem.embedding.space_label': {
|
|
713
|
+
defaultMessage: '{count, plural, one {# document} other {# documents}} drawn in three dimensions by where their vectors differ most: each document is joined to the one most like it when that pair is far more alike than the typical pair in this index, heavier the more alike, documents the lines connect share a colour, and three circles mark the planes of the axes.',
|
|
714
|
+
description: 'What the space shows, for screen readers.',
|
|
715
|
+
params: ['count'],
|
|
716
|
+
},
|
|
717
|
+
'@theorem.embedding.space_query': {
|
|
718
|
+
defaultMessage: 'The query lands among its matches, with a line to each match far more alike than its typical document.',
|
|
719
|
+
description: 'What the space shows after a search, for screen readers.',
|
|
720
|
+
},
|
|
721
|
+
'@theorem.embedding.space_off': {
|
|
722
|
+
defaultMessage: 'This browser can’t draw the space, so the vectors are listed.',
|
|
723
|
+
description: 'WebGL2 is unavailable, so the index card shows the list.',
|
|
724
|
+
},
|
|
725
|
+
'@theorem.embedding.copy_vector': {
|
|
726
|
+
defaultMessage: 'Copy vector',
|
|
727
|
+
description: "Copies one document's vector as JSON.",
|
|
728
|
+
},
|
|
729
|
+
'@theorem.embedding.copy_vectors': {
|
|
730
|
+
defaultMessage: 'Copy all',
|
|
731
|
+
description: 'Copies every vector in the index as JSON, in document order.',
|
|
732
|
+
},
|
|
733
|
+
'@theorem.embedding.copied': {
|
|
734
|
+
defaultMessage: 'Copied',
|
|
735
|
+
description: 'Right after copying a vector.',
|
|
736
|
+
},
|
|
737
|
+
'@theorem.embedding.width': {
|
|
738
|
+
defaultMessage: '{dimensions, plural, one {# dimension} other {# dimensions}}',
|
|
739
|
+
description: 'How wide a vector is, after its first values in the list.',
|
|
740
|
+
params: ['dimensions'],
|
|
741
|
+
},
|
|
742
|
+
'@theorem.embedding.matches': {
|
|
743
|
+
defaultMessage: 'Matches',
|
|
744
|
+
description: 'The documents most like the query, best first (card title).',
|
|
745
|
+
},
|
|
746
|
+
'@theorem.embedding.matches_shown': {
|
|
747
|
+
defaultMessage: 'Top {shown} of {count}',
|
|
748
|
+
description: 'The matches card lists the best documents only.',
|
|
749
|
+
params: ['shown', 'count'],
|
|
750
|
+
},
|
|
751
|
+
'@theorem.embedding.best': {
|
|
752
|
+
defaultMessage: 'Best: {name}',
|
|
753
|
+
description: 'The document most like the query, under the matches figure.',
|
|
754
|
+
params: ['name'],
|
|
755
|
+
},
|
|
756
|
+
'@theorem.embedding.no_matches': {
|
|
757
|
+
defaultMessage: 'No document has a vector as wide as the query’s.',
|
|
758
|
+
description: 'The query and the documents were embedded by models of different widths.',
|
|
759
|
+
},
|
|
760
|
+
'@theorem.embedding.tokens': {
|
|
761
|
+
defaultMessage: '{count, plural, one {# token} other {# tokens}}',
|
|
762
|
+
description: 'Input tokens a call used, in the line under the results.',
|
|
763
|
+
params: ['count'],
|
|
764
|
+
},
|
|
765
|
+
'@theorem.host.tool': {
|
|
766
|
+
defaultMessage: 'Tool',
|
|
767
|
+
description: 'Picks which of the host’s tools to call (field label).',
|
|
768
|
+
},
|
|
769
|
+
'@theorem.host.request': {
|
|
770
|
+
defaultMessage: 'Request',
|
|
771
|
+
description: 'The input a tool call sends (card heading).',
|
|
772
|
+
},
|
|
773
|
+
'@theorem.host.response': {
|
|
774
|
+
defaultMessage: 'Response',
|
|
775
|
+
description: 'What a tool call returned (section heading).',
|
|
776
|
+
},
|
|
254
777
|
'@theorem.host.run': { defaultMessage: 'Run', description: 'Calls the tool with the request.' },
|
|
255
|
-
'@theorem.host.image': {
|
|
256
|
-
|
|
778
|
+
'@theorem.host.image': {
|
|
779
|
+
defaultMessage: 'Image the tool returned',
|
|
780
|
+
description: 'Alt text for an image a tool returned beside its output.',
|
|
781
|
+
},
|
|
782
|
+
'@theorem.host.running': {
|
|
783
|
+
defaultMessage: 'Running…',
|
|
784
|
+
description: 'The run button while the call runs.',
|
|
785
|
+
},
|
|
257
786
|
'@theorem.host.stop': { defaultMessage: 'Stop', description: 'Cancels the running call.' },
|
|
258
787
|
'@theorem.host.missing': {
|
|
259
788
|
defaultMessage: 'Needs {fields}',
|
|
260
789
|
description: 'Required fields the request is still missing, under the form.',
|
|
261
790
|
params: ['fields'],
|
|
262
791
|
},
|
|
263
|
-
'@theorem.host.shortcut': {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
'@theorem.host.
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
'@theorem.host.
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
'@theorem.host.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
'@theorem.
|
|
280
|
-
|
|
281
|
-
|
|
792
|
+
'@theorem.host.shortcut': {
|
|
793
|
+
defaultMessage: '⌘↵ to run',
|
|
794
|
+
description: 'The keyboard shortcut that runs the call, under the form.',
|
|
795
|
+
},
|
|
796
|
+
'@theorem.host.no_tools': {
|
|
797
|
+
defaultMessage: 'This host has no tools yet',
|
|
798
|
+
description: 'A host profile that allows no tools.',
|
|
799
|
+
},
|
|
800
|
+
'@theorem.host.earlier': {
|
|
801
|
+
defaultMessage: 'Earlier calls',
|
|
802
|
+
description: 'Heading over this page’s previous tool calls.',
|
|
803
|
+
},
|
|
804
|
+
'@theorem.host.kind.function': {
|
|
805
|
+
defaultMessage: 'Function',
|
|
806
|
+
description: 'A tool that runs a function on the host.',
|
|
807
|
+
},
|
|
808
|
+
'@theorem.host.kind.http': {
|
|
809
|
+
defaultMessage: 'HTTP',
|
|
810
|
+
description: 'A tool that calls an HTTP endpoint.',
|
|
811
|
+
},
|
|
812
|
+
'@theorem.host.kind.mcp': {
|
|
813
|
+
defaultMessage: 'MCP',
|
|
814
|
+
description: 'A tool served by an MCP server.',
|
|
815
|
+
},
|
|
816
|
+
'@theorem.tool.access.read-only': {
|
|
817
|
+
defaultMessage: 'Read only',
|
|
818
|
+
description: 'A tool that only reads.',
|
|
819
|
+
},
|
|
820
|
+
'@theorem.tool.access.read-write': {
|
|
821
|
+
defaultMessage: 'Read and write',
|
|
822
|
+
description: 'A tool that can change things.',
|
|
823
|
+
},
|
|
824
|
+
'@theorem.tool.access.destructive': {
|
|
825
|
+
defaultMessage: 'Destructive',
|
|
826
|
+
description: 'A tool that can delete or overwrite.',
|
|
827
|
+
},
|
|
828
|
+
'@theorem.host.status.running': {
|
|
829
|
+
defaultMessage: 'running',
|
|
830
|
+
description: 'A tool call in progress.',
|
|
831
|
+
},
|
|
832
|
+
'@theorem.host.status.gate': {
|
|
833
|
+
defaultMessage: 'waiting',
|
|
834
|
+
description: 'A tool call paused on approval or sign-in.',
|
|
835
|
+
},
|
|
836
|
+
'@theorem.host.status.complete': {
|
|
837
|
+
defaultMessage: 'done',
|
|
838
|
+
description: 'A tool call that returned.',
|
|
839
|
+
},
|
|
840
|
+
'@theorem.host.status.error': {
|
|
841
|
+
defaultMessage: 'failed',
|
|
842
|
+
description: 'A tool call that failed.',
|
|
843
|
+
},
|
|
844
|
+
'@theorem.host.status.cancel': {
|
|
845
|
+
defaultMessage: 'stopped',
|
|
846
|
+
description: 'A tool call that was cancelled.',
|
|
847
|
+
},
|
|
848
|
+
'@theorem.host.finished': {
|
|
849
|
+
defaultMessage: '{activity} in {duration}',
|
|
850
|
+
description: 'A finished tool call: what it did, and how long it took.',
|
|
851
|
+
params: ['activity', 'duration'],
|
|
852
|
+
},
|
|
853
|
+
'@theorem.panel.trace.name': {
|
|
854
|
+
defaultMessage: 'Trace',
|
|
855
|
+
description: 'Trace side panel (screen readers).',
|
|
856
|
+
},
|
|
857
|
+
'@theorem.panel.trace.show': {
|
|
858
|
+
defaultMessage: 'Show trace',
|
|
859
|
+
description: 'Trace panel toggle, closed.',
|
|
860
|
+
},
|
|
861
|
+
'@theorem.panel.trace.hide': {
|
|
862
|
+
defaultMessage: 'Hide trace',
|
|
863
|
+
description: 'Trace panel toggle, open.',
|
|
864
|
+
},
|
|
865
|
+
'@theorem.panel.trace.resize': {
|
|
866
|
+
defaultMessage: 'Resize trace',
|
|
867
|
+
description: 'Trace panel drag handle.',
|
|
868
|
+
},
|
|
869
|
+
'@theorem.panel.resize': {
|
|
870
|
+
defaultMessage: 'Resize {name}',
|
|
871
|
+
description: 'Drag handle for a named console panel.',
|
|
872
|
+
params: ['name'],
|
|
873
|
+
},
|
|
874
|
+
'@theorem.panel.trace.empty.title': {
|
|
875
|
+
defaultMessage: 'No trace yet',
|
|
876
|
+
description: 'Empty trace panel.',
|
|
877
|
+
},
|
|
282
878
|
'@theorem.panel.trace.empty.description': {
|
|
283
879
|
defaultMessage: 'Spans for each run will show here.',
|
|
284
880
|
description: 'Empty trace panel.',
|
|
@@ -288,26 +884,53 @@ export const THEOREM_UI_CATALOG = {
|
|
|
288
884
|
description: 'Trace panel line under the search: how many traces and spans it holds.',
|
|
289
885
|
params: ['traces', 'spans'],
|
|
290
886
|
},
|
|
291
|
-
'@theorem.panel.trace.separator': {
|
|
292
|
-
|
|
887
|
+
'@theorem.panel.trace.separator': {
|
|
888
|
+
defaultMessage: ' · ',
|
|
889
|
+
description: 'Between facts on one trace panel line.',
|
|
890
|
+
},
|
|
891
|
+
'@theorem.panel.trace.search': {
|
|
892
|
+
defaultMessage: 'Search spans',
|
|
893
|
+
description: 'Trace panel search (screen readers).',
|
|
894
|
+
},
|
|
293
895
|
'@theorem.panel.trace.search.placeholder': {
|
|
294
896
|
defaultMessage: 'Filter by type, status, model, text…',
|
|
295
897
|
description: 'Trace panel search, empty.',
|
|
296
898
|
},
|
|
297
|
-
'@theorem.panel.trace.search.text': {
|
|
899
|
+
'@theorem.panel.trace.search.text': {
|
|
900
|
+
defaultMessage: 'Any text',
|
|
901
|
+
description: 'Search field matching any text a span holds.',
|
|
902
|
+
},
|
|
298
903
|
'@theorem.panel.trace.search.text.description': {
|
|
299
|
-
defaultMessage: 'Names, values and stored text.',
|
|
904
|
+
defaultMessage: 'Names, values, and stored text.',
|
|
300
905
|
description: 'What the any-text search field matches.',
|
|
301
906
|
},
|
|
302
|
-
'@theorem.panel.trace.no_match': {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
'@theorem.panel.trace.
|
|
907
|
+
'@theorem.panel.trace.no_match': {
|
|
908
|
+
defaultMessage: 'No spans match',
|
|
909
|
+
description: 'Trace panel, when the search matches nothing.',
|
|
910
|
+
},
|
|
911
|
+
'@theorem.panel.trace.back': {
|
|
912
|
+
defaultMessage: 'Back',
|
|
913
|
+
description: 'Leaves an open span for its turn.',
|
|
914
|
+
},
|
|
915
|
+
'@theorem.panel.trace.show_text': {
|
|
916
|
+
defaultMessage: 'Show text',
|
|
917
|
+
description: 'Reveals stored text, JSON, or messages.',
|
|
918
|
+
},
|
|
919
|
+
'@theorem.panel.trace.hide_text': {
|
|
920
|
+
defaultMessage: 'Hide text',
|
|
921
|
+
description: 'Hides revealed stored text.',
|
|
922
|
+
},
|
|
923
|
+
'@theorem.panel.trace.other': {
|
|
924
|
+
defaultMessage: 'Other',
|
|
925
|
+
description: 'Group for attributes the trace catalog does not name.',
|
|
926
|
+
},
|
|
307
927
|
'@theorem.panel.trace.yes': { defaultMessage: 'Yes', description: 'A true trace value.' },
|
|
308
928
|
'@theorem.panel.trace.no': { defaultMessage: 'No', description: 'A false trace value.' },
|
|
309
929
|
'@theorem.panel.trace.tokens': { defaultMessage: 'Tokens', description: 'Card of token counts.' },
|
|
310
|
-
'@theorem.panel.trace.errors': {
|
|
930
|
+
'@theorem.panel.trace.errors': {
|
|
931
|
+
defaultMessage: 'Errors',
|
|
932
|
+
description: 'Card counting failed spans.',
|
|
933
|
+
},
|
|
311
934
|
'@theorem.panel.trace.at_least': {
|
|
312
935
|
defaultMessage: 'At least {value}',
|
|
313
936
|
description: 'A total some calls did not report.',
|
|
@@ -323,33 +946,69 @@ export const THEOREM_UI_CATALOG = {
|
|
|
323
946
|
description: 'When an event happened, after its span started.',
|
|
324
947
|
params: ['duration'],
|
|
325
948
|
},
|
|
326
|
-
'@theorem.panel.trace.unit.milliseconds': {
|
|
327
|
-
|
|
328
|
-
|
|
949
|
+
'@theorem.panel.trace.unit.milliseconds': {
|
|
950
|
+
defaultMessage: 'ms',
|
|
951
|
+
description: 'Unit of a search field in milliseconds.',
|
|
952
|
+
},
|
|
953
|
+
'@theorem.panel.trace.unit.seconds': {
|
|
954
|
+
defaultMessage: 's',
|
|
955
|
+
description: 'Unit of a search field in seconds.',
|
|
956
|
+
},
|
|
957
|
+
'@theorem.panel.trace.unit.usd': {
|
|
958
|
+
defaultMessage: 'USD',
|
|
959
|
+
description: 'Unit of a search field in US dollars.',
|
|
960
|
+
},
|
|
329
961
|
'@theorem.panel.trace.turn': {
|
|
330
962
|
defaultMessage: '{label} {index} of {count}',
|
|
331
963
|
description: 'Which root of the trace is shown: "Turn 2 of 3".',
|
|
332
964
|
params: ['label', 'index', 'count'],
|
|
333
965
|
},
|
|
334
|
-
'@theorem.panel.trace.turns': {
|
|
966
|
+
'@theorem.panel.trace.turns': {
|
|
967
|
+
defaultMessage: 'Turns',
|
|
968
|
+
description: 'List of every turn of the conversation; a row opens its turn.',
|
|
969
|
+
},
|
|
335
970
|
'@theorem.panel.trace.conversation': {
|
|
336
971
|
defaultMessage: '{count, plural, one {# turn} other {# turns}}',
|
|
337
972
|
description: 'Heading of the whole-conversation view: how many turns it holds.',
|
|
338
973
|
params: ['count'],
|
|
339
974
|
},
|
|
340
|
-
'@theorem.panel.trace.conversation.back': {
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
975
|
+
'@theorem.panel.trace.conversation.back': {
|
|
976
|
+
defaultMessage: 'All turns',
|
|
977
|
+
description: 'Leaves a turn for the whole-conversation view.',
|
|
978
|
+
},
|
|
979
|
+
'@theorem.panel.trace.previous': {
|
|
980
|
+
defaultMessage: 'Previous turn',
|
|
981
|
+
description: 'Opens the turn before this one.',
|
|
982
|
+
},
|
|
983
|
+
'@theorem.panel.trace.next': {
|
|
984
|
+
defaultMessage: 'Next turn',
|
|
985
|
+
description: 'Opens the turn after this one.',
|
|
986
|
+
},
|
|
987
|
+
'@theorem.panel.trace.calls': {
|
|
988
|
+
defaultMessage: 'Tool calls',
|
|
989
|
+
description: "List of every call of a host's trace; a row opens its call.",
|
|
990
|
+
},
|
|
344
991
|
'@theorem.panel.trace.calls.count': {
|
|
345
992
|
defaultMessage: '{count, plural, one {# tool call} other {# tool calls}}',
|
|
346
993
|
description: "Heading of a host's whole-trace view: how many tool calls it holds.",
|
|
347
994
|
params: ['count'],
|
|
348
995
|
},
|
|
349
|
-
'@theorem.panel.trace.calls.back': {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
996
|
+
'@theorem.panel.trace.calls.back': {
|
|
997
|
+
defaultMessage: 'All tool calls',
|
|
998
|
+
description: "Leaves a call for the host's whole-trace view.",
|
|
999
|
+
},
|
|
1000
|
+
'@theorem.panel.trace.calls.previous': {
|
|
1001
|
+
defaultMessage: 'Previous call',
|
|
1002
|
+
description: 'Opens the tool call before this one.',
|
|
1003
|
+
},
|
|
1004
|
+
'@theorem.panel.trace.calls.next': {
|
|
1005
|
+
defaultMessage: 'Next call',
|
|
1006
|
+
description: 'Opens the tool call after this one.',
|
|
1007
|
+
},
|
|
1008
|
+
'@theorem.panel.trace.steps': {
|
|
1009
|
+
defaultMessage: 'Steps',
|
|
1010
|
+
description: 'Card counting the model and tool calls of a turn.',
|
|
1011
|
+
},
|
|
353
1012
|
'@theorem.panel.trace.steps.detail': {
|
|
354
1013
|
defaultMessage: '{calls, plural, one {# model call} other {# model calls}} · {tools, plural, one {# tool} other {# tools}}',
|
|
355
1014
|
description: 'Under the steps count: how many were model calls and tool calls.',
|
|
@@ -360,7 +1019,10 @@ export const THEOREM_UI_CATALOG = {
|
|
|
360
1019
|
description: 'Under the steps count, when some failed.',
|
|
361
1020
|
params: ['count'],
|
|
362
1021
|
},
|
|
363
|
-
'@theorem.panel.trace.firstText': {
|
|
1022
|
+
'@theorem.panel.trace.firstText': {
|
|
1023
|
+
defaultMessage: 'First text',
|
|
1024
|
+
description: 'Card: how long the person waited before any of the answer appeared.',
|
|
1025
|
+
},
|
|
364
1026
|
'@theorem.panel.trace.rate': {
|
|
365
1027
|
defaultMessage: '{rate} tokens/s',
|
|
366
1028
|
description: 'Under the first-text time: how fast the model wrote once it started.',
|
|
@@ -371,7 +1033,10 @@ export const THEOREM_UI_CATALOG = {
|
|
|
371
1033
|
description: 'Under the first-text time: how long guardrails held written text back before showing it.',
|
|
372
1034
|
params: ['duration'],
|
|
373
1035
|
},
|
|
374
|
-
'@theorem.panel.trace.guardrails': {
|
|
1036
|
+
'@theorem.panel.trace.guardrails': {
|
|
1037
|
+
defaultMessage: 'Guardrails',
|
|
1038
|
+
description: 'Card: the time guardrail checks took in a turn.',
|
|
1039
|
+
},
|
|
375
1040
|
'@theorem.panel.trace.guardrails.passed': {
|
|
376
1041
|
defaultMessage: 'Passed: {checks}',
|
|
377
1042
|
description: 'Under the guardrail checks that acted: the checks that let the text through, each with what it checked and its time.',
|
|
@@ -382,9 +1047,17 @@ export const THEOREM_UI_CATALOG = {
|
|
|
382
1047
|
description: 'A guardrail check: the tool the checked text came from.',
|
|
383
1048
|
params: ['tool'],
|
|
384
1049
|
},
|
|
1050
|
+
'@theorem.panel.trace.guardrails.tainted': {
|
|
1051
|
+
defaultMessage: 'Tainted',
|
|
1052
|
+
description: 'A guardrail check: a tool that writes or deletes was called after the turn read remote content.',
|
|
1053
|
+
},
|
|
1054
|
+
'@theorem.panel.trace.guardrails.steered': {
|
|
1055
|
+
defaultMessage: 'Steered',
|
|
1056
|
+
description: 'A guardrail check: a tool that writes or deletes was called after the turn read remote content that looked like instructions.',
|
|
1057
|
+
},
|
|
385
1058
|
'@theorem.panel.trace.guardrails.detail': {
|
|
386
1059
|
defaultMessage: '{checks, plural, one {# check} other {# checks}} · {flagged, plural, =0 {all passed} other {# acted}}',
|
|
387
|
-
description: 'Under the guardrail time: how many checks ran, and how many redacted, flagged or blocked.',
|
|
1060
|
+
description: 'Under the guardrail time: how many checks ran, and how many redacted, flagged, or blocked.',
|
|
388
1061
|
params: ['checks', 'flagged'],
|
|
389
1062
|
},
|
|
390
1063
|
'@theorem.panel.trace.tokens.detail': {
|
|
@@ -392,11 +1065,26 @@ export const THEOREM_UI_CATALOG = {
|
|
|
392
1065
|
description: 'Under the token total: tokens read and written.',
|
|
393
1066
|
params: ['input', 'output'],
|
|
394
1067
|
},
|
|
395
|
-
'@theorem.panel.trace.time': {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
'@theorem.panel.trace.time.
|
|
1068
|
+
'@theorem.panel.trace.time': {
|
|
1069
|
+
defaultMessage: 'Where the time went',
|
|
1070
|
+
description: 'Bar splitting a turn into model, tool, and other time.',
|
|
1071
|
+
},
|
|
1072
|
+
'@theorem.panel.trace.time.model': {
|
|
1073
|
+
defaultMessage: 'Model',
|
|
1074
|
+
description: 'Time spent waiting on the model.',
|
|
1075
|
+
},
|
|
1076
|
+
'@theorem.panel.trace.time.tools': {
|
|
1077
|
+
defaultMessage: 'Tools',
|
|
1078
|
+
description: 'Time spent running tools.',
|
|
1079
|
+
},
|
|
1080
|
+
'@theorem.panel.trace.time.guardrails': {
|
|
1081
|
+
defaultMessage: 'Guardrails',
|
|
1082
|
+
description: 'Time guardrail checks took: on the input, the stream, and the answer.',
|
|
1083
|
+
},
|
|
1084
|
+
'@theorem.panel.trace.time.hooks': {
|
|
1085
|
+
defaultMessage: 'Hooks',
|
|
1086
|
+
description: "Time the host's turn hooks took.",
|
|
1087
|
+
},
|
|
400
1088
|
'@theorem.panel.trace.time.other': {
|
|
401
1089
|
defaultMessage: 'Other',
|
|
402
1090
|
description: 'Time spent on none of these: waiting between steps, the host, the network.',
|
|
@@ -405,34 +1093,93 @@ export const THEOREM_UI_CATALOG = {
|
|
|
405
1093
|
defaultMessage: 'Tokens per model call',
|
|
406
1094
|
description: 'Chart of each model call: its tokens stacked as a bar.',
|
|
407
1095
|
},
|
|
408
|
-
'@theorem.panel.trace.charts.cached': {
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
'@theorem.panel.trace.charts.
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
'@theorem.panel.trace.charts.
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
1096
|
+
'@theorem.panel.trace.charts.cached': {
|
|
1097
|
+
defaultMessage: 'Cached',
|
|
1098
|
+
description: 'Legend: input tokens read from cache.',
|
|
1099
|
+
},
|
|
1100
|
+
'@theorem.panel.trace.charts.input': {
|
|
1101
|
+
defaultMessage: 'Input',
|
|
1102
|
+
description: 'Legend: input tokens read fresh.',
|
|
1103
|
+
},
|
|
1104
|
+
'@theorem.panel.trace.charts.output': {
|
|
1105
|
+
defaultMessage: 'Output',
|
|
1106
|
+
description: 'Legend: tokens the model wrote.',
|
|
1107
|
+
},
|
|
1108
|
+
'@theorem.panel.trace.charts.slowest': {
|
|
1109
|
+
defaultMessage: 'Slowest steps',
|
|
1110
|
+
description: 'Chart ranking the steps that took longest.',
|
|
1111
|
+
},
|
|
1112
|
+
'@theorem.panel.trace.charts.modelShare': {
|
|
1113
|
+
defaultMessage: '{share} on the model',
|
|
1114
|
+
description: "Beside a chart's total time: the model's share.",
|
|
1115
|
+
params: ['share'],
|
|
1116
|
+
},
|
|
1117
|
+
'@theorem.panel.trace.charts.cachedShare': {
|
|
1118
|
+
defaultMessage: '{share} of input cached',
|
|
1119
|
+
description: "Beside a chart's total tokens: the input read from cache.",
|
|
1120
|
+
params: ['share'],
|
|
1121
|
+
},
|
|
1122
|
+
'@theorem.panel.trace.charts.turnTime': {
|
|
1123
|
+
defaultMessage: 'Time per turn',
|
|
1124
|
+
description: 'Chart of each turn: its model, tool, and other time stacked.',
|
|
1125
|
+
},
|
|
1126
|
+
'@theorem.panel.trace.charts.callTime': {
|
|
1127
|
+
defaultMessage: 'Time per call',
|
|
1128
|
+
description: "Chart of each tool call of a host's trace: its tool, check, and hook time stacked.",
|
|
1129
|
+
},
|
|
1130
|
+
'@theorem.panel.trace.charts.turnTokens': {
|
|
1131
|
+
defaultMessage: 'Tokens per turn',
|
|
1132
|
+
description: 'Chart of each turn: its tokens stacked as a bar.',
|
|
1133
|
+
},
|
|
1134
|
+
'@theorem.panel.trace.charts.turn': {
|
|
1135
|
+
defaultMessage: 'Turn {index}',
|
|
1136
|
+
description: 'A turn, by its order in the conversation.',
|
|
1137
|
+
params: ['index'],
|
|
1138
|
+
},
|
|
1139
|
+
'@theorem.panel.trace.charts.hostCall': {
|
|
1140
|
+
defaultMessage: 'Call {index}',
|
|
1141
|
+
description: "A tool call, by its order in a host's trace.",
|
|
1142
|
+
params: ['index'],
|
|
1143
|
+
},
|
|
1144
|
+
'@theorem.panel.trace.charts.call': {
|
|
1145
|
+
defaultMessage: 'Model call {index}',
|
|
1146
|
+
description: 'A model call, by its order in the turn.',
|
|
1147
|
+
params: ['index'],
|
|
1148
|
+
},
|
|
420
1149
|
'@theorem.panel.trace.charts.tokens': {
|
|
421
1150
|
defaultMessage: '{cached} cached · {fresh} new in · {output} out',
|
|
422
1151
|
description: "A model call's tokens: read from cache, read fresh, and written.",
|
|
423
1152
|
params: ['cached', 'fresh', 'output'],
|
|
424
1153
|
},
|
|
425
|
-
'@theorem.panel.trace.story': {
|
|
426
|
-
|
|
1154
|
+
'@theorem.panel.trace.story': {
|
|
1155
|
+
defaultMessage: 'What happened',
|
|
1156
|
+
description: 'The turn told step by step.',
|
|
1157
|
+
},
|
|
1158
|
+
'@theorem.panel.trace.story.asked': {
|
|
1159
|
+
defaultMessage: 'User asked',
|
|
1160
|
+
description: 'The first step: what the user sent.',
|
|
1161
|
+
},
|
|
427
1162
|
'@theorem.panel.trace.story.requested': {
|
|
428
1163
|
defaultMessage: 'Asked for {count, plural, one {# tool} other {# tools}}',
|
|
429
1164
|
description: 'A model call that answered with tool calls.',
|
|
430
1165
|
params: ['count'],
|
|
431
1166
|
},
|
|
432
|
-
'@theorem.panel.trace.story.wrote': {
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
1167
|
+
'@theorem.panel.trace.story.wrote': {
|
|
1168
|
+
defaultMessage: 'Wrote a reply',
|
|
1169
|
+
description: 'A model call that answered with text.',
|
|
1170
|
+
},
|
|
1171
|
+
'@theorem.panel.trace.story.answered': {
|
|
1172
|
+
defaultMessage: 'Answered',
|
|
1173
|
+
description: 'The last step: the turn ended with this answer.',
|
|
1174
|
+
},
|
|
1175
|
+
'@theorem.panel.trace.story.failed': {
|
|
1176
|
+
defaultMessage: 'Ended with an error',
|
|
1177
|
+
description: 'The last step, when the turn failed.',
|
|
1178
|
+
},
|
|
1179
|
+
'@theorem.panel.trace.timeline': {
|
|
1180
|
+
defaultMessage: 'Timeline',
|
|
1181
|
+
description: 'Every span of the turn on one time axis.',
|
|
1182
|
+
},
|
|
436
1183
|
'@theorem.panel.trace.timeline.zoom': {
|
|
437
1184
|
defaultMessage: 'Drag across the strip to zoom',
|
|
438
1185
|
description: 'Hint beside the activity strip that zooms the timeline.',
|
|
@@ -442,37 +1189,102 @@ export const THEOREM_UI_CATALOG = {
|
|
|
442
1189
|
description: 'Zooms the timeline back out to the full turn.',
|
|
443
1190
|
},
|
|
444
1191
|
'@theorem.panel.trace.input': { defaultMessage: 'Input', description: 'What a span was given.' },
|
|
445
|
-
'@theorem.panel.trace.output': {
|
|
446
|
-
|
|
1192
|
+
'@theorem.panel.trace.output': {
|
|
1193
|
+
defaultMessage: 'Output',
|
|
1194
|
+
description: 'What a span gave back.',
|
|
1195
|
+
},
|
|
1196
|
+
'@theorem.panel.trace.details': {
|
|
1197
|
+
defaultMessage: 'All details',
|
|
1198
|
+
description: "A span's every attribute, event, and link.",
|
|
1199
|
+
},
|
|
447
1200
|
'@theorem.panel.trace.close': { defaultMessage: 'Close', description: 'Closes the open span.' },
|
|
448
|
-
'@theorem.panel.captions.name': {
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
'@theorem.panel.captions.
|
|
1201
|
+
'@theorem.panel.captions.name': {
|
|
1202
|
+
defaultMessage: 'Captions',
|
|
1203
|
+
description: 'Captions side panel (screen readers).',
|
|
1204
|
+
},
|
|
1205
|
+
'@theorem.panel.captions.show': {
|
|
1206
|
+
defaultMessage: 'Show captions',
|
|
1207
|
+
description: 'Captions panel toggle, closed.',
|
|
1208
|
+
},
|
|
1209
|
+
'@theorem.panel.captions.hide': {
|
|
1210
|
+
defaultMessage: 'Hide captions',
|
|
1211
|
+
description: 'Captions panel toggle, open.',
|
|
1212
|
+
},
|
|
1213
|
+
'@theorem.panel.captions.resize': {
|
|
1214
|
+
defaultMessage: 'Resize captions',
|
|
1215
|
+
description: 'Captions panel drag handle.',
|
|
1216
|
+
},
|
|
1217
|
+
'@theorem.panel.captions.empty.title': {
|
|
1218
|
+
defaultMessage: 'No captions yet',
|
|
1219
|
+
description: 'Empty captions panel.',
|
|
1220
|
+
},
|
|
453
1221
|
'@theorem.panel.captions.empty.description': {
|
|
454
1222
|
defaultMessage: 'What you and the agent say will show here.',
|
|
455
1223
|
description: 'Empty captions panel.',
|
|
456
1224
|
},
|
|
457
|
-
'@theorem.live.greeting': {
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
1225
|
+
'@theorem.live.greeting': {
|
|
1226
|
+
defaultMessage: 'Ready when you are.',
|
|
1227
|
+
description: 'Live landing heading, before a call.',
|
|
1228
|
+
},
|
|
1229
|
+
'@theorem.live.start_voice_call': {
|
|
1230
|
+
defaultMessage: 'Start voice call',
|
|
1231
|
+
description: 'Live landing, voice profiles.',
|
|
1232
|
+
},
|
|
1233
|
+
'@theorem.live.start_call': {
|
|
1234
|
+
defaultMessage: 'Start call',
|
|
1235
|
+
description: 'Starts or restarts a call.',
|
|
1236
|
+
},
|
|
1237
|
+
'@theorem.live.start_video_call': {
|
|
1238
|
+
defaultMessage: 'Start video call',
|
|
1239
|
+
description: 'Live landing, video profiles.',
|
|
1240
|
+
},
|
|
461
1241
|
'@theorem.live.microphone': { defaultMessage: 'Microphone', description: 'Mic toggle.' },
|
|
462
1242
|
'@theorem.live.mute': { defaultMessage: 'Mute', description: 'Mic toggle tooltip, unmuted.' },
|
|
463
1243
|
'@theorem.live.unmute': { defaultMessage: 'Unmute', description: 'Mic toggle tooltip, muted.' },
|
|
464
1244
|
'@theorem.live.camera': { defaultMessage: 'Camera', description: 'Camera toggle.' },
|
|
465
|
-
'@theorem.live.camera_on': {
|
|
466
|
-
|
|
467
|
-
|
|
1245
|
+
'@theorem.live.camera_on': {
|
|
1246
|
+
defaultMessage: 'Turn camera on',
|
|
1247
|
+
description: 'Camera toggle tooltip, off.',
|
|
1248
|
+
},
|
|
1249
|
+
'@theorem.live.camera_off': {
|
|
1250
|
+
defaultMessage: 'Turn camera off',
|
|
1251
|
+
description: 'Camera toggle tooltip, on.',
|
|
1252
|
+
},
|
|
1253
|
+
'@theorem.live.flip_camera': {
|
|
1254
|
+
defaultMessage: 'Flip camera',
|
|
1255
|
+
description: 'Switches front and back camera.',
|
|
1256
|
+
},
|
|
468
1257
|
'@theorem.live.end_call': { defaultMessage: 'End call', description: 'Hangs up.' },
|
|
469
|
-
'@theorem.live.
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
1258
|
+
'@theorem.live.new_session': {
|
|
1259
|
+
defaultMessage: 'New session',
|
|
1260
|
+
description: 'Captions divider between calls.',
|
|
1261
|
+
},
|
|
1262
|
+
'@theorem.live.controls': {
|
|
1263
|
+
defaultMessage: 'Call controls',
|
|
1264
|
+
description: 'The control toolbar (screen readers).',
|
|
1265
|
+
},
|
|
1266
|
+
'@theorem.live.camera_preview': {
|
|
1267
|
+
defaultMessage: 'Camera preview',
|
|
1268
|
+
description: 'Self-view (screen readers).',
|
|
1269
|
+
},
|
|
1270
|
+
'@theorem.live.state.calling_tool': {
|
|
1271
|
+
defaultMessage: 'calling {tool}',
|
|
1272
|
+
description: 'Call status: a tool runs.',
|
|
1273
|
+
params: ['tool'],
|
|
1274
|
+
},
|
|
473
1275
|
'@theorem.live.state.connecting': { defaultMessage: 'connecting', description: 'Call status.' },
|
|
474
|
-
'@theorem.live.state.
|
|
475
|
-
|
|
1276
|
+
'@theorem.live.state.reconnecting': {
|
|
1277
|
+
defaultMessage: 'reconnecting',
|
|
1278
|
+
description: 'Call status: the call dropped and is being taken up again.',
|
|
1279
|
+
},
|
|
1280
|
+
'@theorem.live.state.requesting_mic': {
|
|
1281
|
+
defaultMessage: 'requesting mic',
|
|
1282
|
+
description: 'Call status.',
|
|
1283
|
+
},
|
|
1284
|
+
'@theorem.live.state.speaking': {
|
|
1285
|
+
defaultMessage: 'speaking',
|
|
1286
|
+
description: 'Call status: the agent speaks.',
|
|
1287
|
+
},
|
|
476
1288
|
'@theorem.live.state.connected': { defaultMessage: 'connected', description: 'Call status.' },
|
|
477
1289
|
'@theorem.live.state.muted': { defaultMessage: 'muted', description: 'Call status.' },
|
|
478
1290
|
'@theorem.live.state.listening': { defaultMessage: 'listening', description: 'Call status.' },
|
|
@@ -488,10 +1300,24 @@ export function composerDrawerLabel(t, summary) {
|
|
|
488
1300
|
.map((part) => t(`@theorem.composer.drawer.${part.kind}.count`, { n: part.n }))
|
|
489
1301
|
.join(t('@theorem.composer.drawer.separator'));
|
|
490
1302
|
}
|
|
1303
|
+
/** What a reply or a called agent used: its tokens, then its cost when the provider gave one. */
|
|
1304
|
+
export function usageLine(t, locale, tokens) {
|
|
1305
|
+
const count = t('@theorem.transcript.tokens', { count: tokens.total });
|
|
1306
|
+
if (!tokens.cost)
|
|
1307
|
+
return count;
|
|
1308
|
+
const usd = new Intl.NumberFormat(locale, {
|
|
1309
|
+
style: 'currency',
|
|
1310
|
+
currency: 'USD',
|
|
1311
|
+
maximumSignificantDigits: 2,
|
|
1312
|
+
});
|
|
1313
|
+
const cost = usd.format(tokens.cost.usd);
|
|
1314
|
+
// why: A partial cost covers only the calls that reported one.
|
|
1315
|
+
return `${count} · ${tokens.cost.partial ? t('@theorem.panel.trace.at_least', { value: cost }) : cost}`;
|
|
1316
|
+
}
|
|
491
1317
|
/** Wall-clock duration, matching Seance's builder-trace formatter: "<0.1ms", "0.4ms", "850ms", "3.2s", "12s", "1m 5s". */
|
|
492
1318
|
export function workDuration(t, durationMs) {
|
|
493
1319
|
const ms = Math.max(0, durationMs);
|
|
494
|
-
// A guardrail check can take a fraction of a millisecond; one decimal keeps it from reading as nothing.
|
|
1320
|
+
// why: A guardrail check can take a fraction of a millisecond; one decimal keeps it from reading as nothing.
|
|
495
1321
|
if (ms > 0 && ms < 0.05)
|
|
496
1322
|
return t('@theorem.duration.belowTenth');
|
|
497
1323
|
if (ms < 10)
|
|
@@ -504,8 +1330,20 @@ export function workDuration(t, durationMs) {
|
|
|
504
1330
|
return t('@theorem.duration.seconds', { seconds: Math.round(ms / 1_000) });
|
|
505
1331
|
return minutesAndSeconds(t, Math.floor(ms / 60_000), Math.round((ms % 60_000) / 1_000));
|
|
506
1332
|
}
|
|
1333
|
+
/** A console result's quiet line: model, time, tokens, and cost, leaving out what it lacks. */
|
|
1334
|
+
export function resultMeta(t, usd, result) {
|
|
1335
|
+
const { usage, elapsedMs } = result;
|
|
1336
|
+
return [
|
|
1337
|
+
result.model,
|
|
1338
|
+
elapsedMs == null ? null : workDuration(t, elapsedMs),
|
|
1339
|
+
usage?.inputTokens === undefined ? null : result.tokens(usage.inputTokens),
|
|
1340
|
+
usage?.costUsd === undefined ? null : usd.format(usage.costUsd),
|
|
1341
|
+
]
|
|
1342
|
+
.filter(Boolean)
|
|
1343
|
+
.join(' · ');
|
|
1344
|
+
}
|
|
507
1345
|
/** Whole-second ticker while a turn runs: "0s", "12s", "1m 5s". */
|
|
508
|
-
function liveDuration(t, durationMs) {
|
|
1346
|
+
export function liveDuration(t, durationMs) {
|
|
509
1347
|
const total = Math.floor(Math.max(0, durationMs) / 1_000);
|
|
510
1348
|
if (total < 60)
|
|
511
1349
|
return t('@theorem.duration.seconds', { seconds: total });
|
|
@@ -556,13 +1394,13 @@ function catalogParams(key) {
|
|
|
556
1394
|
export function assertLabelOverrides(labels, strict) {
|
|
557
1395
|
for (const [locale, table] of Object.entries(labels)) {
|
|
558
1396
|
if (!isLocale(locale))
|
|
559
|
-
throw new Error(`Theorem labels: ${locale}: not a BCP 47 locale`); //
|
|
1397
|
+
throw new Error(`Theorem labels: ${locale}: not a BCP 47 locale`); // labels-exempt: builder contract error
|
|
560
1398
|
for (const [key, message] of Object.entries(table ?? {})) {
|
|
561
1399
|
if (!strict && !key.startsWith('@theorem.'))
|
|
562
1400
|
continue;
|
|
563
1401
|
const problem = labelProblem(locale, key, message);
|
|
564
1402
|
if (problem)
|
|
565
|
-
throw new Error(`Theorem labels: ${locale} ${key}: ${problem}`); //
|
|
1403
|
+
throw new Error(`Theorem labels: ${locale} ${key}: ${problem}`); // labels-exempt: builder contract error
|
|
566
1404
|
}
|
|
567
1405
|
}
|
|
568
1406
|
}
|
|
@@ -596,7 +1434,9 @@ function labelProblem(locale, key, message) {
|
|
|
596
1434
|
format.format(Object.fromEntries(params.map((name) => [name, 1])));
|
|
597
1435
|
}
|
|
598
1436
|
catch (error) {
|
|
599
|
-
const allowed = params.length > 0
|
|
1437
|
+
const allowed = params.length > 0
|
|
1438
|
+
? `may only use ${params.map((name) => `{${name}}`).join(', ')}`
|
|
1439
|
+
: 'takes no values';
|
|
600
1440
|
return `the message ${allowed} (${String(error)})`;
|
|
601
1441
|
}
|
|
602
1442
|
return undefined;
|