@ruimte/agents-react 0.0.0 → 0.7.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.
- package/LICENSE +110 -0
- package/README.md +142 -1
- package/dist/agents/AccountDot.d.ts +4 -0
- package/dist/agents/AccountDot.js +8 -0
- package/dist/agents/AgentIcon.d.ts +6 -0
- package/dist/agents/AgentIcon.js +20 -0
- package/dist/agents/ProviderLogo.d.ts +8 -0
- package/dist/agents/ProviderLogo.js +8 -0
- package/dist/agents/account-limits.d.ts +7 -0
- package/dist/agents/account-limits.js +26 -0
- package/dist/agents/accounts.d.ts +22 -0
- package/dist/agents/accounts.js +103 -0
- package/dist/agents/model-name.d.ts +6 -0
- package/dist/agents/model-name.js +44 -0
- package/dist/agents/provider-paths.d.ts +2 -0
- package/dist/agents/provider-paths.js +8 -0
- package/dist/agents/status-look.d.ts +13 -0
- package/dist/agents/status-look.js +22 -0
- package/dist/chat/account-choice.d.ts +11 -0
- package/dist/chat/account-choice.js +30 -0
- package/dist/chat/actions.d.ts +6 -0
- package/dist/chat/actions.js +64 -0
- package/dist/chat/activity.d.ts +5 -0
- package/dist/chat/activity.js +4 -0
- package/dist/chat/attachments.d.ts +23 -0
- package/dist/chat/attachments.js +70 -0
- package/dist/chat/bookmarks.d.ts +14 -0
- package/dist/chat/bookmarks.js +73 -0
- package/dist/chat/chat-client.d.ts +53 -0
- package/dist/chat/chat-client.js +232 -0
- package/dist/chat/chat-references.d.ts +5 -0
- package/dist/chat/chat-references.js +5 -0
- package/dist/chat/drafts.d.ts +29 -0
- package/dist/chat/drafts.js +104 -0
- package/dist/chat/forks.d.ts +2 -0
- package/dist/chat/forks.js +26 -0
- package/dist/chat/guards.d.ts +12 -0
- package/dist/chat/guards.js +63 -0
- package/dist/chat/logic/answers.d.ts +3 -0
- package/dist/chat/logic/answers.js +14 -0
- package/dist/chat/logic/bookmarks.d.ts +5 -0
- package/dist/chat/logic/bookmarks.js +31 -0
- package/dist/chat/logic/context-usage.d.ts +12 -0
- package/dist/chat/logic/context-usage.js +20 -0
- package/dist/chat/logic/fork.d.ts +44 -0
- package/dist/chat/logic/fork.js +138 -0
- package/dist/chat/logic/handback.d.ts +2 -0
- package/dist/chat/logic/handback.js +8 -0
- package/dist/chat/logic/json.d.ts +1 -0
- package/dist/chat/logic/json.js +2 -0
- package/dist/chat/logic/limit.d.ts +7 -0
- package/dist/chat/logic/limit.js +34 -0
- package/dist/chat/logic/resume-compaction.d.ts +14 -0
- package/dist/chat/logic/resume-compaction.js +47 -0
- package/dist/chat/logic/scrubber.d.ts +50 -0
- package/dist/chat/logic/scrubber.js +216 -0
- package/dist/chat/logic/timeline-copy.d.ts +4 -0
- package/dist/chat/logic/timeline-copy.js +51 -0
- package/dist/chat/logic/timeline-target.d.ts +12 -0
- package/dist/chat/logic/timeline-target.js +34 -0
- package/dist/chat/logic/timeline.d.ts +110 -0
- package/dist/chat/logic/timeline.js +339 -0
- package/dist/chat/logic/tool-catalog.d.ts +10 -0
- package/dist/chat/logic/tool-catalog.js +40 -0
- package/dist/chat/logic/tools.d.ts +15 -0
- package/dist/chat/logic/tools.js +79 -0
- package/dist/chat/logic/workflow.d.ts +14 -0
- package/dist/chat/logic/workflow.js +47 -0
- package/dist/chat/mentions.d.ts +46 -0
- package/dist/chat/mentions.js +128 -0
- package/dist/chat/persisted-json.d.ts +5 -0
- package/dist/chat/persisted-json.js +24 -0
- package/dist/chat/preferences.d.ts +23 -0
- package/dist/chat/preferences.js +110 -0
- package/dist/chat/quote.d.ts +2 -0
- package/dist/chat/quote.js +25 -0
- package/dist/chat/recent-messages.d.ts +17 -0
- package/dist/chat/recent-messages.js +28 -0
- package/dist/chat/resume-compaction-dismissals.d.ts +3 -0
- package/dist/chat/resume-compaction-dismissals.js +14 -0
- package/dist/chat/runtime-modes.d.ts +4 -0
- package/dist/chat/runtime-modes.js +11 -0
- package/dist/chat/stash.d.ts +24 -0
- package/dist/chat/stash.js +88 -0
- package/dist/chat/subagent-conversation.d.ts +38 -0
- package/dist/chat/subagent-conversation.js +150 -0
- package/dist/chat/subagent-list.d.ts +16 -0
- package/dist/chat/subagent-list.js +76 -0
- package/dist/chat/subagent-support.d.ts +6 -0
- package/dist/chat/subagent-support.js +14 -0
- package/dist/chat/subagent-view.d.ts +33 -0
- package/dist/chat/subagent-view.js +65 -0
- package/dist/chat/thumbnails.d.ts +10 -0
- package/dist/chat/thumbnails.js +87 -0
- package/dist/chat/timeline-scroll.d.ts +16 -0
- package/dist/chat/timeline-scroll.js +100 -0
- package/dist/chat/ui/AccountPill.d.ts +3 -0
- package/dist/chat/ui/AccountPill.js +24 -0
- package/dist/chat/ui/BookmarkMarker.d.ts +8 -0
- package/dist/chat/ui/BookmarkMarker.js +59 -0
- package/dist/chat/ui/BookmarkSubmenu.d.ts +3 -0
- package/dist/chat/ui/BookmarkSubmenu.js +44 -0
- package/dist/chat/ui/ChatActivity.d.ts +3 -0
- package/dist/chat/ui/ChatActivity.js +87 -0
- package/dist/chat/ui/ChatReferenceChip.d.ts +4 -0
- package/dist/chat/ui/ChatReferenceChip.js +17 -0
- package/dist/chat/ui/CodeBlock.d.ts +4 -0
- package/dist/chat/ui/CodeBlock.js +130 -0
- package/dist/chat/ui/Composer.d.ts +14 -0
- package/dist/chat/ui/Composer.js +821 -0
- package/dist/chat/ui/ComposerInput.d.ts +28 -0
- package/dist/chat/ui/ComposerInput.js +118 -0
- package/dist/chat/ui/DiffPool.d.ts +5 -0
- package/dist/chat/ui/DiffPool.js +26 -0
- package/dist/chat/ui/EditDiff.d.ts +4 -0
- package/dist/chat/ui/EditDiff.js +21 -0
- package/dist/chat/ui/FadingWords.d.ts +3 -0
- package/dist/chat/ui/FadingWords.js +5 -0
- package/dist/chat/ui/ImageView.d.ts +6 -0
- package/dist/chat/ui/ImageView.js +85 -0
- package/dist/chat/ui/LimitState.d.ts +8 -0
- package/dist/chat/ui/LimitState.js +117 -0
- package/dist/chat/ui/Markdown.d.ts +18 -0
- package/dist/chat/ui/Markdown.js +158 -0
- package/dist/chat/ui/MessageActions.d.ts +9 -0
- package/dist/chat/ui/MessageActions.js +56 -0
- package/dist/chat/ui/Pickers.d.ts +15 -0
- package/dist/chat/ui/Pickers.js +110 -0
- package/dist/chat/ui/PromptComposer.d.ts +13 -0
- package/dist/chat/ui/PromptComposer.js +48 -0
- package/dist/chat/ui/QuoteButton.d.ts +7 -0
- package/dist/chat/ui/QuoteButton.js +76 -0
- package/dist/chat/ui/ResumeCompactionDock.d.ts +5 -0
- package/dist/chat/ui/ResumeCompactionDock.js +15 -0
- package/dist/chat/ui/RunSettings.d.ts +25 -0
- package/dist/chat/ui/RunSettings.js +148 -0
- package/dist/chat/ui/Scrubber.d.ts +17 -0
- package/dist/chat/ui/Scrubber.js +121 -0
- package/dist/chat/ui/SubagentControls.d.ts +11 -0
- package/dist/chat/ui/SubagentControls.js +37 -0
- package/dist/chat/ui/SubagentStopButton.d.ts +7 -0
- package/dist/chat/ui/SubagentStopButton.js +36 -0
- package/dist/chat/ui/SubagentTimeline.d.ts +4 -0
- package/dist/chat/ui/SubagentTimeline.js +92 -0
- package/dist/chat/ui/Timeline.d.ts +5 -0
- package/dist/chat/ui/Timeline.js +318 -0
- package/dist/chat/ui/TimelineMenu.d.ts +12 -0
- package/dist/chat/ui/TimelineMenu.js +61 -0
- package/dist/chat/ui/UnifiedDiff.d.ts +8 -0
- package/dist/chat/ui/UnifiedDiff.js +51 -0
- package/dist/chat/ui/UploadThumb.d.ts +4 -0
- package/dist/chat/ui/UploadThumb.js +11 -0
- package/dist/chat/ui/chips.d.ts +4 -0
- package/dist/chat/ui/chips.js +11 -0
- package/dist/chat/ui/code-lines.d.ts +18 -0
- package/dist/chat/ui/code-lines.js +46 -0
- package/dist/chat/ui/code-streaming.d.ts +1 -0
- package/dist/chat/ui/code-streaming.js +3 -0
- package/dist/chat/ui/code-theme.d.ts +3 -0
- package/dist/chat/ui/code-theme.js +10 -0
- package/dist/chat/ui/composer/chips.d.ts +6 -0
- package/dist/chat/ui/composer/chips.js +29 -0
- package/dist/chat/ui/composer/editor.d.ts +11 -0
- package/dist/chat/ui/composer/editor.js +94 -0
- package/dist/chat/ui/composer/keys.d.ts +30 -0
- package/dist/chat/ui/composer/keys.js +98 -0
- package/dist/chat/ui/diff-theme.d.ts +2 -0
- package/dist/chat/ui/diff-theme.js +20 -0
- package/dist/chat/ui/file-links.d.ts +5 -0
- package/dist/chat/ui/file-links.js +18 -0
- package/dist/chat/ui/find-reveal.d.ts +7 -0
- package/dist/chat/ui/find-reveal.js +13 -0
- package/dist/chat/ui/icons.d.ts +4 -0
- package/dist/chat/ui/icons.js +20 -0
- package/dist/chat/ui/markdown-blocks.d.ts +6 -0
- package/dist/chat/ui/markdown-blocks.js +101 -0
- package/dist/chat/ui/quote-selection.d.ts +3 -0
- package/dist/chat/ui/quote-selection.js +44 -0
- package/dist/chat/ui/rehype-chips.d.ts +23 -0
- package/dist/chat/ui/rehype-chips.js +28 -0
- package/dist/chat/ui/rehype-fade.d.ts +23 -0
- package/dist/chat/ui/rehype-fade.js +30 -0
- package/dist/chat/ui/remark-html-as-text.d.ts +8 -0
- package/dist/chat/ui/remark-html-as-text.js +24 -0
- package/dist/chat/ui/reveal.d.ts +13 -0
- package/dist/chat/ui/reveal.js +112 -0
- package/dist/chat/ui/rows/ForksRow.d.ts +4 -0
- package/dist/chat/ui/rows/ForksRow.js +40 -0
- package/dist/chat/ui/rows/MessageRows.d.ts +36 -0
- package/dist/chat/ui/rows/MessageRows.js +190 -0
- package/dist/chat/ui/rows/Rows.d.ts +12 -0
- package/dist/chat/ui/rows/Rows.js +49 -0
- package/dist/chat/ui/rows/SubagentRow.d.ts +15 -0
- package/dist/chat/ui/rows/SubagentRow.js +98 -0
- package/dist/chat/ui/rows/WorkRows.d.ts +46 -0
- package/dist/chat/ui/rows/WorkRows.js +143 -0
- package/dist/chat/ui/rows/WorkflowRow.d.ts +7 -0
- package/dist/chat/ui/rows/WorkflowRow.js +37 -0
- package/dist/chat/ui/rows/row-rhythm.d.ts +3 -0
- package/dist/chat/ui/rows/row-rhythm.js +14 -0
- package/dist/chat/ui/useToggleSet.d.ts +6 -0
- package/dist/chat/ui/useToggleSet.js +25 -0
- package/dist/host.d.ts +167 -0
- package/dist/host.js +41 -0
- package/dist/lazy.d.ts +5 -0
- package/dist/lazy.js +35 -0
- package/dist/locales/en/agent-chat.json +417 -0
- package/dist/locales/en/agent-prompts.json +42 -0
- package/dist/locales/en/agent-providers.json +131 -0
- package/dist/locales/en/agent-usage.json +131 -0
- package/dist/locales/nl/agent-chat.json +417 -0
- package/dist/locales/nl/agent-prompts.json +42 -0
- package/dist/locales/nl/agent-providers.json +131 -0
- package/dist/locales/nl/agent-usage.json +131 -0
- package/dist/locales.d.ts +5 -0
- package/dist/locales.js +18 -0
- package/dist/mounted-registry.d.ts +7 -0
- package/dist/mounted-registry.js +39 -0
- package/dist/port-transport.d.ts +6 -0
- package/dist/port-transport.js +120 -0
- package/dist/prompts/logic/focus.d.ts +1 -0
- package/dist/prompts/logic/focus.js +17 -0
- package/dist/prompts/logic/keys.d.ts +42 -0
- package/dist/prompts/logic/keys.js +84 -0
- package/dist/prompts/logic/prompts.d.ts +34 -0
- package/dist/prompts/logic/prompts.fixtures.d.ts +5 -0
- package/dist/prompts/logic/prompts.fixtures.js +73 -0
- package/dist/prompts/logic/prompts.js +22 -0
- package/dist/prompts/logic/subjects.d.ts +49 -0
- package/dist/prompts/logic/subjects.js +56 -0
- package/dist/prompts/logic/useFocusAfterAnswer.d.ts +6 -0
- package/dist/prompts/logic/useFocusAfterAnswer.js +28 -0
- package/dist/prompts/logic/usePromptSession.d.ts +24 -0
- package/dist/prompts/logic/usePromptSession.js +87 -0
- package/dist/prompts/ui/ApprovalBody.d.ts +13 -0
- package/dist/prompts/ui/ApprovalBody.js +35 -0
- package/dist/prompts/ui/PromptActions.d.ts +26 -0
- package/dist/prompts/ui/PromptActions.js +19 -0
- package/dist/prompts/ui/PromptCard.d.ts +16 -0
- package/dist/prompts/ui/PromptCard.js +50 -0
- package/dist/prompts/ui/PromptView.d.ts +2 -0
- package/dist/prompts/ui/PromptView.js +47 -0
- package/dist/prompts/ui/QuestionBody.d.ts +9 -0
- package/dist/prompts/ui/QuestionBody.js +87 -0
- package/dist/providers/AccountColors.d.ts +5 -0
- package/dist/providers/AccountColors.js +8 -0
- package/dist/providers/AccountDetail.d.ts +12 -0
- package/dist/providers/AccountDetail.js +76 -0
- package/dist/providers/AccountVariables.d.ts +8 -0
- package/dist/providers/AccountVariables.js +48 -0
- package/dist/providers/AddAccountForm.d.ts +10 -0
- package/dist/providers/AddAccountForm.js +58 -0
- package/dist/providers/CliDetail.d.ts +11 -0
- package/dist/providers/CliDetail.js +62 -0
- package/dist/providers/ProvidersPane.d.ts +8 -0
- package/dist/providers/ProvidersPane.js +90 -0
- package/dist/providers/account-actions.d.ts +7 -0
- package/dist/providers/account-actions.js +53 -0
- package/dist/providers/parts.d.ts +9 -0
- package/dist/providers/parts.js +18 -0
- package/dist/providers/provider-abilities.d.ts +2 -0
- package/dist/providers/provider-abilities.js +7 -0
- package/dist/providers/variables.d.ts +13 -0
- package/dist/providers/variables.js +53 -0
- package/dist/scope.d.ts +11 -0
- package/dist/scope.js +10 -0
- package/dist/settings/sections.d.ts +13 -0
- package/dist/settings/sections.js +30 -0
- package/dist/state/chats.d.ts +32 -0
- package/dist/state/chats.js +124 -0
- package/dist/state/provider-accounts.d.ts +17 -0
- package/dist/state/provider-accounts.js +63 -0
- package/dist/state/providers.d.ts +17 -0
- package/dist/state/providers.js +29 -0
- package/dist/state/usage.d.ts +41 -0
- package/dist/state/usage.js +100 -0
- package/dist/theme.css +186 -0
- package/dist/transport.d.ts +24 -0
- package/dist/transport.js +16 -0
- package/dist/ui/PlainTextarea.d.ts +2 -0
- package/dist/ui/PlainTextarea.js +5 -0
- package/dist/usage/LimitsList.d.ts +18 -0
- package/dist/usage/LimitsList.js +69 -0
- package/dist/usage/UsageBreakdown.d.ts +9 -0
- package/dist/usage/UsageBreakdown.js +69 -0
- package/dist/usage/UsageChart.d.ts +10 -0
- package/dist/usage/UsageChart.js +49 -0
- package/dist/usage/UsageDialog.d.ts +6 -0
- package/dist/usage/UsageDialog.js +15 -0
- package/dist/usage/UsageLimits.d.ts +1 -0
- package/dist/usage/UsageLimits.js +62 -0
- package/dist/usage/UsageLimitsCard.d.ts +4 -0
- package/dist/usage/UsageLimitsCard.js +27 -0
- package/dist/usage/UsagePage.d.ts +7 -0
- package/dist/usage/UsagePage.js +161 -0
- package/dist/usage/UsagePane.d.ts +3 -0
- package/dist/usage/UsagePane.js +24 -0
- package/dist/usage/UsageSummary.d.ts +12 -0
- package/dist/usage/UsageSummary.js +15 -0
- package/dist/usage/UsageTiles.d.ts +7 -0
- package/dist/usage/UsageTiles.js +19 -0
- package/dist/usage/format.d.ts +14 -0
- package/dist/usage/format.js +50 -0
- package/dist/usage/limit-groups.d.ts +22 -0
- package/dist/usage/limit-groups.js +78 -0
- package/dist/usage/limits.d.ts +4 -0
- package/dist/usage/limits.js +58 -0
- package/dist/usage/money.d.ts +1 -0
- package/dist/usage/money.js +13 -0
- package/dist/usage/summary.d.ts +34 -0
- package/dist/usage/summary.js +90 -0
- package/package.json +639 -2
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
{
|
|
2
|
+
"status": {
|
|
3
|
+
"checking": "Controleren",
|
|
4
|
+
"disabled": "Uitgezet",
|
|
5
|
+
"notFound": "CLI niet gevonden",
|
|
6
|
+
"signedOut": "Niet ingelogd",
|
|
7
|
+
"ready": "Ingelogd",
|
|
8
|
+
"readyPlan": "Ingelogd · {{plan}}",
|
|
9
|
+
"available": "Klaar",
|
|
10
|
+
"folderMissing": "Map ontbreekt",
|
|
11
|
+
"unavailable": "Niet beschikbaar",
|
|
12
|
+
"failed": "Controle mislukt"
|
|
13
|
+
},
|
|
14
|
+
"failed": "De instellingen van de providers konden niet worden getekend",
|
|
15
|
+
"list": {
|
|
16
|
+
"label": "Agent-CLI's en hun accounts",
|
|
17
|
+
"default": "Standaard",
|
|
18
|
+
"addAccount": "Een {{provider}}-account toevoegen",
|
|
19
|
+
"notInstalled": "Niet geïnstalleerd",
|
|
20
|
+
"missing": "Ontbreekt",
|
|
21
|
+
"notInstalledNote": "Installeer er een en start Ruimte op die machine opnieuw om hem toe te voegen.",
|
|
22
|
+
"none": "Geen agent-CLI's gevonden op deze machine.",
|
|
23
|
+
"noAccounts": "Deze machine houdt nog geen accounts bij. Werk Ruimte daar bij om er een toe te voegen."
|
|
24
|
+
},
|
|
25
|
+
"abilities": {
|
|
26
|
+
"version": "Versie {{version}}.",
|
|
27
|
+
"chatAndTerminal": "Chat en terminal.",
|
|
28
|
+
"terminalOnly": "Alleen terminal.",
|
|
29
|
+
"reportsStatus": "Meldt de agentstatus.",
|
|
30
|
+
"noStatus": "Meldt geen agentstatus."
|
|
31
|
+
},
|
|
32
|
+
"cli": {
|
|
33
|
+
"addAccount": "Account toevoegen",
|
|
34
|
+
"onlyDefault": "{{provider}} heeft geen instelling voor zijn configuratiemap, dus alleen zijn standaardaccount.",
|
|
35
|
+
"defaults": {
|
|
36
|
+
"title": "Standaarden voor nieuwe chats",
|
|
37
|
+
"description": "Een model of account kiezen in een chat verandert hier ook de standaard.",
|
|
38
|
+
"account": "Account",
|
|
39
|
+
"accountFor": "Standaardaccount voor {{provider}}",
|
|
40
|
+
"model": "Model",
|
|
41
|
+
"modelFor": "Standaardmodel voor {{provider}}",
|
|
42
|
+
"shared": "Gedeeld door elk {{provider}}-account.",
|
|
43
|
+
"usesCliDefault": "Gebruikt het standaardmodel van de CLI zelf.",
|
|
44
|
+
"providerDefault": "Standaard van de provider",
|
|
45
|
+
"legacyModel": "{{name}} (legacy)"
|
|
46
|
+
},
|
|
47
|
+
"accounts": "Accounts"
|
|
48
|
+
},
|
|
49
|
+
"account": {
|
|
50
|
+
"kind": "{{provider}}-account",
|
|
51
|
+
"enabled": {
|
|
52
|
+
"label": "Dit account gebruiken",
|
|
53
|
+
"description": "Uitgezet wordt het niet aangeboden voor nieuwe chats en agents."
|
|
54
|
+
},
|
|
55
|
+
"showFolder": "Map tonen",
|
|
56
|
+
"folderCopied": "Pad van de map gekopieerd",
|
|
57
|
+
"name": "Naam",
|
|
58
|
+
"color": "Kleur",
|
|
59
|
+
"login": {
|
|
60
|
+
"title": "Login",
|
|
61
|
+
"signedInAs": "Ingelogd als {{email}}",
|
|
62
|
+
"signedIn": "Ingelogd",
|
|
63
|
+
"planDetail": "{{plan}}-abonnement. Opnieuw inloggen opent een terminal-node met de login van de CLI zelf.",
|
|
64
|
+
"detail": "Opnieuw inloggen opent een terminal-node met de login van de CLI zelf.",
|
|
65
|
+
"signedOut": "Niet ingelogd",
|
|
66
|
+
"signedOutDetail": "Opent een terminal-node die de login van de CLI met deze map draait.",
|
|
67
|
+
"logIn": "Inloggen",
|
|
68
|
+
"logInAgain": "Opnieuw inloggen"
|
|
69
|
+
},
|
|
70
|
+
"folder": {
|
|
71
|
+
"label": "Map",
|
|
72
|
+
"detail": "Aan de CLI gegeven als <code>{{variable}}</code>. De CLI bewaart hier zijn eigen login, instellingen en geschiedenis.",
|
|
73
|
+
"detailPlain": "De CLI bewaart hier zijn eigen login, instellingen en geschiedenis."
|
|
74
|
+
},
|
|
75
|
+
"variables": {
|
|
76
|
+
"title": "Variabelen",
|
|
77
|
+
"description": "Extra omgeving voor alleen dit account. Gevoelige waarden blijven in de sleutelhanger.",
|
|
78
|
+
"add": "Variabele toevoegen",
|
|
79
|
+
"name": "Naam van variabele {{index}}",
|
|
80
|
+
"value": "Waarde van {{name}}",
|
|
81
|
+
"kept": "Bewaard in de sleutelhanger",
|
|
82
|
+
"lock": "{{name}} in de sleutelhanger bewaren",
|
|
83
|
+
"unlock": "{{name}} als platte tekst bewaren",
|
|
84
|
+
"noKeychain": "Deze machine heeft geen sleutelhanger, dus een waarde kan niet geheim blijven.",
|
|
85
|
+
"remove": "{{name}} verwijderen",
|
|
86
|
+
"none": "Geen variabelen",
|
|
87
|
+
"discard": "Weggooien",
|
|
88
|
+
"problem": {
|
|
89
|
+
"noName": "Elke variabele heeft een naam nodig.",
|
|
90
|
+
"invalidName": "{{name}} is geen naam voor een variabele.",
|
|
91
|
+
"duplicate": "{{name}} staat er twee keer in.",
|
|
92
|
+
"noValue": "{{name}} heeft een waarde nodig."
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"remove": {
|
|
96
|
+
"label": "Account verwijderen",
|
|
97
|
+
"description": "Chats die het gebruiken vragen bij hun volgende turn om een ander account. De map blijft op de schijf.",
|
|
98
|
+
"defaultNote": "Het standaardaccount gebruikt de eigen map van de CLI en kan niet weg. Zet het in plaats daarvan hierboven uit.",
|
|
99
|
+
"button": "Verwijderen",
|
|
100
|
+
"confirmTitle": "{{account}} verwijderen?",
|
|
101
|
+
"confirmDescription": "Ruimte vergeet dit account. De map blijft op de schijf staan op {{folder}}, met de login erin.",
|
|
102
|
+
"confirm": "Account verwijderen"
|
|
103
|
+
},
|
|
104
|
+
"saveFailed": "Kon het account niet opslaan"
|
|
105
|
+
},
|
|
106
|
+
"add": {
|
|
107
|
+
"title": "Een {{provider}}-account toevoegen",
|
|
108
|
+
"description": "Ruimte maakt er een map voor op de machine en opent dan een terminal-node waarin je inlogt.",
|
|
109
|
+
"name": "Naam",
|
|
110
|
+
"namePlaceholder": "Werk",
|
|
111
|
+
"color": "Kleur",
|
|
112
|
+
"advanced": "Geavanceerd",
|
|
113
|
+
"link": {
|
|
114
|
+
"label": "Een bestaande map koppelen",
|
|
115
|
+
"description": "Gebruik een configuratiemap die al op de machine staat in plaats van een nieuwe. Ruimte verplaatst of verwijdert hem nooit.",
|
|
116
|
+
"placeholder": "Pad op de machine"
|
|
117
|
+
},
|
|
118
|
+
"create": "Account toevoegen",
|
|
119
|
+
"linkButton": "Map koppelen",
|
|
120
|
+
"failed": "Kon het account niet toevoegen"
|
|
121
|
+
},
|
|
122
|
+
"section": {
|
|
123
|
+
"label": "Providers",
|
|
124
|
+
"description": "De agent-CLI's op deze machine en de accounts waarmee ze inloggen."
|
|
125
|
+
},
|
|
126
|
+
"notAnswering": "Geeft geen antwoord. Pas dit aan zodra de machine terug is.",
|
|
127
|
+
"common": {
|
|
128
|
+
"save": "Opslaan",
|
|
129
|
+
"cancel": "Annuleren"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
{
|
|
2
|
+
"limits": {
|
|
3
|
+
"title": "Limieten",
|
|
4
|
+
"explain": "Het streepje op een balk laat zien hoeveel van het venster voorbij is. Een balk voorbij dat streepje verbruikt sneller dan het venster teruggeeft.",
|
|
5
|
+
"loading": "Limieten laden…",
|
|
6
|
+
"used": "{{percent}}% gebruikt",
|
|
7
|
+
"bar": "{{window}}, {{percent}}% gebruikt",
|
|
8
|
+
"windowPassed": "{{percent}}% van het venster voorbij",
|
|
9
|
+
"faster": "Verbruikt sneller dan het venster teruggeeft.",
|
|
10
|
+
"slower": "Verbruikt langzamer dan het venster teruggeeft.",
|
|
11
|
+
"resets": "Reset {{at}}",
|
|
12
|
+
"none": "Nog geen limieten gemeld.",
|
|
13
|
+
"notInstalled": "Niet geïnstalleerd op deze machine.",
|
|
14
|
+
"noSubscription": "Dit account gebruikt een API-sleutel en kent geen abonnementslimieten.",
|
|
15
|
+
"unreachable": "De CLI was niet bereikbaar.",
|
|
16
|
+
"filter": "Accounts waarvan je de limieten ziet",
|
|
17
|
+
"signedOut": "Niet ingelogd",
|
|
18
|
+
"signedOutDetail": "Niet ingelogd. Log in om de limieten te zien.",
|
|
19
|
+
"logIn": "Inloggen",
|
|
20
|
+
"nextReset": "{{window}} reset {{at}}",
|
|
21
|
+
"checked": {
|
|
22
|
+
"now": "nu",
|
|
23
|
+
"ago": "{{duration}} geleden",
|
|
24
|
+
"fromTurn": "Uit een turn · {{when}}"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"settings": {
|
|
28
|
+
"currency": {
|
|
29
|
+
"label": "Valuta",
|
|
30
|
+
"dollars": "Prijzen zoals gepubliceerd, in dollars.",
|
|
31
|
+
"noRate": "Nog geen wisselkoers. De pagina toont dollars zolang die er niet is.",
|
|
32
|
+
"converted": "Omgerekend met de ECB-referentiekoers van {{date}}.",
|
|
33
|
+
"options": {
|
|
34
|
+
"USD": "Dollars",
|
|
35
|
+
"EUR": "Euro's"
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"page": {
|
|
39
|
+
"label": "Verbruikspagina",
|
|
40
|
+
"description": "Kosten, tokens en planlimieten, per account.",
|
|
41
|
+
"open": "Verbruik openen"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"section": {
|
|
45
|
+
"label": "Verbruik",
|
|
46
|
+
"description": "De valuta van de verbruikspagina."
|
|
47
|
+
},
|
|
48
|
+
"dialog": {
|
|
49
|
+
"title": "Verbruik",
|
|
50
|
+
"description": "Kosten, tokens en limieten van je abonnement",
|
|
51
|
+
"close": "Verbruik sluiten",
|
|
52
|
+
"rescan": "Opnieuw scannen",
|
|
53
|
+
"period": "Periode",
|
|
54
|
+
"metric": "Eenheid",
|
|
55
|
+
"failed": "Verbruik kon niet worden getekend",
|
|
56
|
+
"periods": {
|
|
57
|
+
"today": "Vandaag",
|
|
58
|
+
"7d": "7 dagen",
|
|
59
|
+
"30d": "30 dagen",
|
|
60
|
+
"90d": "90 dagen"
|
|
61
|
+
},
|
|
62
|
+
"metrics": {
|
|
63
|
+
"cost": "Kosten",
|
|
64
|
+
"tokens": "Tokens"
|
|
65
|
+
},
|
|
66
|
+
"accounts": {
|
|
67
|
+
"label": "Account",
|
|
68
|
+
"all": "Alle accounts"
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"empty": {
|
|
72
|
+
"noTranscripts": "Geen transcripts van Claude of Codex gevonden. De machine leest ~/.claude/projects en ~/.codex/sessions.",
|
|
73
|
+
"noUsage": "Nog geen verbruik op deze machine."
|
|
74
|
+
},
|
|
75
|
+
"agents": {
|
|
76
|
+
"none": "Op deze machine staat geen agent-CLI.",
|
|
77
|
+
"installed": "Deze machine heeft {{list}}.",
|
|
78
|
+
"settings": "Agent-instellingen"
|
|
79
|
+
},
|
|
80
|
+
"provenance": {
|
|
81
|
+
"failed": "Kon de transcripts niet lezen. Dit is de laatste scan die wel lukte.",
|
|
82
|
+
"scanned_one": "Gescand om {{time}}, {{files}} bestand",
|
|
83
|
+
"scanned_other": "Gescand om {{time}}, {{files}} bestanden",
|
|
84
|
+
"bundledPrices": "Prijzen uit de meegeleverde tabel",
|
|
85
|
+
"fetchedPrices": "Prijzen van LiteLLM, {{date}}",
|
|
86
|
+
"rate": "{{currency}} tegen de ECB-koers van {{date}}"
|
|
87
|
+
},
|
|
88
|
+
"summary": {
|
|
89
|
+
"sessions_one": "{{sessions}} sessie",
|
|
90
|
+
"sessions_other": "{{sessions}} sessies",
|
|
91
|
+
"calls_one": "{{calls}} aanroep",
|
|
92
|
+
"calls_other": "{{calls}} aanroepen",
|
|
93
|
+
"apiRates": "tegen API-tarieven"
|
|
94
|
+
},
|
|
95
|
+
"tiles": {
|
|
96
|
+
"processed": "Verwerkt",
|
|
97
|
+
"uncachedInput": "Input zonder cache",
|
|
98
|
+
"cachedInput": "Input uit cache",
|
|
99
|
+
"cacheWrites": "Naar cache geschreven",
|
|
100
|
+
"output": "Output",
|
|
101
|
+
"cacheSavings": "Bespaard met cache"
|
|
102
|
+
},
|
|
103
|
+
"chart": {
|
|
104
|
+
"total": "Totaal"
|
|
105
|
+
},
|
|
106
|
+
"breakdown": {
|
|
107
|
+
"title": "Uitsplitsing",
|
|
108
|
+
"tabs": {
|
|
109
|
+
"models": "Modellen",
|
|
110
|
+
"projects": "Projecten",
|
|
111
|
+
"day": "Dag"
|
|
112
|
+
},
|
|
113
|
+
"models": {
|
|
114
|
+
"model": "Model",
|
|
115
|
+
"calls": "Aanroepen",
|
|
116
|
+
"input": "Input",
|
|
117
|
+
"output": "Output",
|
|
118
|
+
"cache": "Cache R/W",
|
|
119
|
+
"cost": "Kosten",
|
|
120
|
+
"share": "Aandeel",
|
|
121
|
+
"pricedAs": "Geprijsd als {{model}}",
|
|
122
|
+
"noPrice": "Geen prijs bekend voor dit model"
|
|
123
|
+
},
|
|
124
|
+
"days": {
|
|
125
|
+
"day": "Dag",
|
|
126
|
+
"total": "Totaal",
|
|
127
|
+
"tokens": "Tokens",
|
|
128
|
+
"empty": "Geen activiteit in deze periode."
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
type Bundle = Record<string, unknown>;
|
|
2
|
+
export declare const AGENTS_NAMESPACES: readonly ['agent-chat', 'agent-prompts', 'agent-providers', 'agent-usage'];
|
|
3
|
+
export type AgentsNamespace = (typeof AGENTS_NAMESPACES)[number];
|
|
4
|
+
export declare const AGENTS_LOCALES: Record<string, () => Promise<Record<AgentsNamespace, Bundle>>>;
|
|
5
|
+
export {};
|
package/dist/locales.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* The words of this package, a namespace per surface, which the app adds to its i18next beside its own namespaces. */
|
|
2
|
+
export const AGENTS_NAMESPACES = ['agent-chat', 'agent-prompts', 'agent-providers', 'agent-usage'];
|
|
3
|
+
const open = async (files) => Object.fromEntries(await Promise.all(Object.entries(files).map(async ([namespace, file]) => [namespace, (await file()).default])));
|
|
4
|
+
/* One loader per language that answers every namespace of it, so a bundler splits them and a window only downloads the language it shows. */
|
|
5
|
+
export const AGENTS_LOCALES = {
|
|
6
|
+
en: () => open({
|
|
7
|
+
'agent-chat': () => import('./locales/en/agent-chat.json'),
|
|
8
|
+
'agent-prompts': () => import('./locales/en/agent-prompts.json'),
|
|
9
|
+
'agent-providers': () => import('./locales/en/agent-providers.json'),
|
|
10
|
+
'agent-usage': () => import('./locales/en/agent-usage.json')
|
|
11
|
+
}),
|
|
12
|
+
nl: () => open({
|
|
13
|
+
'agent-chat': () => import('./locales/nl/agent-chat.json'),
|
|
14
|
+
'agent-prompts': () => import('./locales/nl/agent-prompts.json'),
|
|
15
|
+
'agent-providers': () => import('./locales/nl/agent-providers.json'),
|
|
16
|
+
'agent-usage': () => import('./locales/nl/agent-usage.json')
|
|
17
|
+
})
|
|
18
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface MountedEntry {
|
|
2
|
+
attached: boolean;
|
|
3
|
+
}
|
|
4
|
+
export declare class MountedRegistry<T extends MountedEntry> extends Map<string, T> {
|
|
5
|
+
detachAll(report?: (id: string, entry: T) => void): void;
|
|
6
|
+
reattachAll(reattach: (id: string, entry: T) => Promise<void>): Promise<void>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Enough to hide the round trips of a slow link, few enough that a first screen is not queued behind twenty.
|
|
2
|
+
const REATTACH_CONCURRENCY = 4;
|
|
3
|
+
/*
|
|
4
|
+
* What a client keeps for the nodes it has open on one machine, and the reconnect discipline they
|
|
5
|
+
* all share: a lost socket detaches everything, and the socket that comes back attaches it again.
|
|
6
|
+
* The host on the other side is a fresh one as far as this client knows, so nothing is assumed.
|
|
7
|
+
*/
|
|
8
|
+
export class MountedRegistry extends Map {
|
|
9
|
+
/* Nothing is attached over a link that is gone; `report` is how a store hears about it. */
|
|
10
|
+
detachAll(report) {
|
|
11
|
+
for (const [id, entry] of this) {
|
|
12
|
+
entry.attached = false;
|
|
13
|
+
report?.(id, entry);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/*
|
|
17
|
+
* One pass over what is mounted but not attached, in mount order, a few at a time. It works on a
|
|
18
|
+
* copy, because attaching mounts and unmounts as it goes. An entry that left in the meantime is
|
|
19
|
+
* skipped, since a node may leave the canvas while its attach is on the wire.
|
|
20
|
+
*/
|
|
21
|
+
async reattachAll(reattach) {
|
|
22
|
+
const queue = [...this];
|
|
23
|
+
const work = async () => {
|
|
24
|
+
for (let next = queue.shift(); next !== undefined; next = queue.shift()) {
|
|
25
|
+
const [id, entry] = next;
|
|
26
|
+
if (entry.attached || this.get(id) !== entry) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
try {
|
|
30
|
+
await reattach(id, entry);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// A socket that dropped again brings the next pass; anything else surfaces on the next mount.
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
await Promise.all(Array.from({ length: REATTACH_CONCURRENCY }, work));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import i18next from 'i18next';
|
|
2
|
+
import { parseServerFrame } from '@ruimte/agent-contracts/envelope';
|
|
3
|
+
import { AGENT_EVENT_SCHEMAS, AGENT_REQUEST_SCHEMAS } from '@ruimte/agent-contracts/protocol';
|
|
4
|
+
import { ChatTransportError } from './transport';
|
|
5
|
+
const isEventType = (event) => Object.hasOwn(AGENT_EVENT_SCHEMAS, event);
|
|
6
|
+
/*
|
|
7
|
+
* A chat host at the other end of a port, such as a process that runs the chats beside the window.
|
|
8
|
+
* A port does not drop and come back the way a socket does, so it is open from the first request
|
|
9
|
+
* until `close`. Frames are checked where they arrive, and a frame that does not hold up is dropped
|
|
10
|
+
* with a warning, the way the socket transport of an app drops one.
|
|
11
|
+
*/
|
|
12
|
+
export const portTransport = (port) => {
|
|
13
|
+
let status = 'open';
|
|
14
|
+
let nextId = 1;
|
|
15
|
+
const pending = new Map();
|
|
16
|
+
const eventHandlers = new Map();
|
|
17
|
+
const statusHandlers = new Set();
|
|
18
|
+
const answer = (id, frame) => {
|
|
19
|
+
const entry = pending.get(id);
|
|
20
|
+
if (!entry) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
pending.delete(id);
|
|
24
|
+
if (!frame.ok) {
|
|
25
|
+
entry.reject(new ChatTransportError(frame.error.code, frame.error.message));
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const result = AGENT_REQUEST_SCHEMAS[entry.type].result.safeParse(frame.result);
|
|
29
|
+
if (!result.success) {
|
|
30
|
+
entry.reject(new ChatTransportError('bad-reply', i18next.t('agent-chat:transport.badReply', { type: entry.type })));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
entry.resolve(result.data);
|
|
34
|
+
};
|
|
35
|
+
const dispatch = (event, payload) => {
|
|
36
|
+
if (!isEventType(event)) {
|
|
37
|
+
console.warn('Dropped an unknown event', event);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const parsed = AGENT_EVENT_SCHEMAS[event].safeParse(payload);
|
|
41
|
+
if (!parsed.success) {
|
|
42
|
+
console.warn(`Dropped a malformed ${event} event`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// A copy, so a handler that unsubscribes while it runs does not change the set being walked.
|
|
46
|
+
for (const handler of [...(eventHandlers.get(event) ?? [])]) {
|
|
47
|
+
handler(parsed.data);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const stopListening = port.onFrame((raw) => {
|
|
51
|
+
if (status === 'closed') {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const parsed = parseServerFrame(raw);
|
|
55
|
+
if (!parsed.ok) {
|
|
56
|
+
console.warn('Dropped a malformed frame', parsed.message);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const frame = parsed.value;
|
|
60
|
+
if ('event' in frame) {
|
|
61
|
+
dispatch(frame.event, frame.payload);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (frame.id === null) {
|
|
65
|
+
// An answer without an id is about a frame the host could not read; nothing waits for it.
|
|
66
|
+
console.warn('The chat host refused a frame', frame);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
answer(frame.id, frame);
|
|
70
|
+
});
|
|
71
|
+
return {
|
|
72
|
+
get status() {
|
|
73
|
+
return status;
|
|
74
|
+
},
|
|
75
|
+
request(type, payload) {
|
|
76
|
+
if (status !== 'open') {
|
|
77
|
+
return Promise.reject(new ChatTransportError('not-connected', i18next.t('agent-chat:transport.notConnected')));
|
|
78
|
+
}
|
|
79
|
+
const id = String(nextId++);
|
|
80
|
+
const promise = new Promise((resolve, reject) => {
|
|
81
|
+
pending.set(id, { type, resolve: resolve, reject });
|
|
82
|
+
});
|
|
83
|
+
port.send({ id, type, payload });
|
|
84
|
+
return promise;
|
|
85
|
+
},
|
|
86
|
+
on(event, handler) {
|
|
87
|
+
let handlers = eventHandlers.get(event);
|
|
88
|
+
if (!handlers) {
|
|
89
|
+
handlers = new Set();
|
|
90
|
+
eventHandlers.set(event, handlers);
|
|
91
|
+
}
|
|
92
|
+
const set = handlers;
|
|
93
|
+
set.add(handler);
|
|
94
|
+
return () => {
|
|
95
|
+
set.delete(handler);
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
subscribeStatus(handler) {
|
|
99
|
+
statusHandlers.add(handler);
|
|
100
|
+
return () => {
|
|
101
|
+
statusHandlers.delete(handler);
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
close() {
|
|
105
|
+
if (status === 'closed') {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
status = 'closed';
|
|
109
|
+
stopListening();
|
|
110
|
+
const waiting = [...pending.values()];
|
|
111
|
+
pending.clear();
|
|
112
|
+
for (const entry of waiting) {
|
|
113
|
+
entry.reject(new ChatTransportError('disconnected', i18next.t('agent-chat:transport.closedBeforeAnswer')));
|
|
114
|
+
}
|
|
115
|
+
for (const handler of [...statusHandlers]) {
|
|
116
|
+
handler(status);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const focusPromptStart: (root: ParentNode | null | undefined) => boolean;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Puts the keyboard on where a card is answered: a question's choice or field, else the first of a
|
|
3
|
+
* request's buttons. Allow is drawn last and filled, so it only gets the keyboard when it stands alone,
|
|
4
|
+
* and a stray Enter never grants anything. False when `root` holds no card.
|
|
5
|
+
*/
|
|
6
|
+
export const focusPromptStart = (root) => {
|
|
7
|
+
const card = root?.querySelector('.prompt-card');
|
|
8
|
+
if (!card) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
const start = card.querySelector('[data-prompt-entry]:not(:disabled)') ??
|
|
12
|
+
card.querySelector('[role="toolbar"] button:not(:disabled):not([data-prompt-primary])') ??
|
|
13
|
+
card.querySelector('[data-prompt-primary]:not(:disabled)') ??
|
|
14
|
+
card.querySelector('.prompt-heading');
|
|
15
|
+
start?.focus({ preventScroll: true });
|
|
16
|
+
return start !== null;
|
|
17
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { type KeyLike } from '@ruimte/ui/shortcut';
|
|
2
|
+
export declare const PROMPT_SHORTCUTS: {
|
|
3
|
+
readonly primary: import("@ruimte/ui/shortcut").Shortcut;
|
|
4
|
+
readonly previousPrompt: import("@ruimte/ui/shortcut").Shortcut;
|
|
5
|
+
readonly nextPrompt: import("@ruimte/ui/shortcut").Shortcut;
|
|
6
|
+
};
|
|
7
|
+
export type PromptKeyEvent = KeyLike & {
|
|
8
|
+
isComposing: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type ListStep = 'previous' | 'next' | 'first' | 'last';
|
|
11
|
+
export type ChoiceKeyAction = {
|
|
12
|
+
kind: 'move';
|
|
13
|
+
to: ListStep;
|
|
14
|
+
} | {
|
|
15
|
+
kind: 'pick';
|
|
16
|
+
} | {
|
|
17
|
+
kind: 'pick-and-commit';
|
|
18
|
+
} | {
|
|
19
|
+
kind: 'commit';
|
|
20
|
+
};
|
|
21
|
+
export type AnswerFieldKeyAction = {
|
|
22
|
+
kind: 'to-last-choice';
|
|
23
|
+
} | {
|
|
24
|
+
kind: 'commit';
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'ignore';
|
|
27
|
+
};
|
|
28
|
+
export declare const stepIndex: (index: number, count: number, to: ListStep) => number;
|
|
29
|
+
export declare const choiceKey: (event: PromptKeyEvent, { multiSelect, anyChosen }: {
|
|
30
|
+
multiSelect: boolean;
|
|
31
|
+
anyChosen: boolean;
|
|
32
|
+
}) => ChoiceKeyAction | null;
|
|
33
|
+
export declare const answerFieldKey: (event: PromptKeyEvent, { belowChoices, caretAtStart, hasText }: {
|
|
34
|
+
belowChoices: boolean;
|
|
35
|
+
caretAtStart: boolean;
|
|
36
|
+
hasText: boolean;
|
|
37
|
+
}) => AnswerFieldKeyAction | null;
|
|
38
|
+
export declare const headingKey: (event: PromptKeyEvent) => boolean;
|
|
39
|
+
export declare const toolbarKey: (event: PromptKeyEvent) => ListStep | null;
|
|
40
|
+
export declare const isPrimaryKey: (event: PromptKeyEvent, apple: boolean) => boolean;
|
|
41
|
+
export declare const pageKey: (event: PromptKeyEvent, apple: boolean, typing: boolean) => -1 | 1 | null;
|
|
42
|
+
export declare const staysInCard: (event: PromptKeyEvent) => boolean;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { matchesShortcut, shortcut } from '@ruimte/ui/shortcut';
|
|
2
|
+
/*
|
|
3
|
+
* The keys inside a prompt card. Bare keys are allowed here and nowhere else on a canvas because a card
|
|
4
|
+
* is a widget the keyboard is already in. They only mean something while the focus is inside one.
|
|
5
|
+
*/
|
|
6
|
+
export const PROMPT_SHORTCUTS = {
|
|
7
|
+
primary: shortcut('Mod+Enter'),
|
|
8
|
+
previousPrompt: shortcut('Mod+Shift+ArrowLeft'),
|
|
9
|
+
nextPrompt: shortcut('Mod+Shift+ArrowRight')
|
|
10
|
+
};
|
|
11
|
+
const isPlain = (event) => !event.ctrlKey && !event.metaKey && !event.altKey && !event.shiftKey && !event.isComposing;
|
|
12
|
+
const LIST_KEYS = { ArrowUp: 'previous', ArrowDown: 'next', Home: 'first', End: 'last' };
|
|
13
|
+
const TOOLBAR_KEYS = { ArrowLeft: 'previous', ArrowRight: 'next', Home: 'first', End: 'last' };
|
|
14
|
+
/* Both lists wrap, the way a radio group does. */
|
|
15
|
+
export const stepIndex = (index, count, to) => {
|
|
16
|
+
if (count === 0) {
|
|
17
|
+
return -1;
|
|
18
|
+
}
|
|
19
|
+
switch (to) {
|
|
20
|
+
case 'first':
|
|
21
|
+
return 0;
|
|
22
|
+
case 'last':
|
|
23
|
+
return count - 1;
|
|
24
|
+
case 'previous':
|
|
25
|
+
return (index - 1 + count) % count;
|
|
26
|
+
case 'next':
|
|
27
|
+
return (index + 1) % count;
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
/*
|
|
31
|
+
* A choice of a question. Enter on a multi select question only moves on once something is chosen, so
|
|
32
|
+
* the first Enter on an empty question picks the choice instead of doing nothing.
|
|
33
|
+
*/
|
|
34
|
+
export const choiceKey = (event, { multiSelect, anyChosen }) => {
|
|
35
|
+
if (!isPlain(event)) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const step = LIST_KEYS[event.key];
|
|
39
|
+
if (step) {
|
|
40
|
+
return { kind: 'move', to: step };
|
|
41
|
+
}
|
|
42
|
+
if (event.code === 'Space') {
|
|
43
|
+
return { kind: 'pick' };
|
|
44
|
+
}
|
|
45
|
+
if (event.key === 'Enter') {
|
|
46
|
+
if (!multiSelect) {
|
|
47
|
+
return { kind: 'pick-and-commit' };
|
|
48
|
+
}
|
|
49
|
+
return anyChosen ? { kind: 'commit' } : { kind: 'pick' };
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
};
|
|
53
|
+
/* A written answer: under the choices ("Something else…") or the only field of a question without choices. */
|
|
54
|
+
export const answerFieldKey = (event, { belowChoices, caretAtStart, hasText }) => {
|
|
55
|
+
if (!isPlain(event)) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
if (event.key === 'ArrowUp' && belowChoices && caretAtStart) {
|
|
59
|
+
return { kind: 'to-last-choice' };
|
|
60
|
+
}
|
|
61
|
+
if (event.key === 'Enter') {
|
|
62
|
+
// An empty answer is not sent, and an empty line in front of the answer is never what Enter meant.
|
|
63
|
+
return hasText ? { kind: 'commit' } : { kind: 'ignore' };
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
};
|
|
67
|
+
export const headingKey = (event) => isPlain(event) && event.key === 'ArrowDown';
|
|
68
|
+
export const toolbarKey = (event) => (isPlain(event) ? (TOOLBAR_KEYS[event.key] ?? null) : null);
|
|
69
|
+
export const isPrimaryKey = (event, apple) => !event.isComposing && matchesShortcut(PROMPT_SHORTCUTS.primary, event, apple);
|
|
70
|
+
/* Paging through a stack. In a text field these keys select to the start or end of the line, so they stay there. */
|
|
71
|
+
export const pageKey = (event, apple, typing) => {
|
|
72
|
+
if (typing || event.isComposing) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
if (matchesShortcut(PROMPT_SHORTCUTS.previousPrompt, event, apple)) {
|
|
76
|
+
return -1;
|
|
77
|
+
}
|
|
78
|
+
return matchesShortcut(PROMPT_SHORTCUTS.nextPrompt, event, apple) ? 1 : null;
|
|
79
|
+
};
|
|
80
|
+
/*
|
|
81
|
+
* A key without Ctrl, Cmd or Alt never leaves a card: arrows would reach the canvas, Space would start a
|
|
82
|
+
* pan and Backspace would delete the selected nodes. Escape and Tab still go on, since they leave the card.
|
|
83
|
+
*/
|
|
84
|
+
export const staysInCard = (event) => !event.ctrlKey && !event.metaKey && !event.altKey && event.key !== 'Escape' && event.key !== 'Tab';
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ChatApprovalItem, ChatQuestionItem, ChatQuestion } from '@ruimte/agent-contracts';
|
|
2
|
+
export type PendingPrompt = ChatApprovalItem | ChatQuestionItem;
|
|
3
|
+
export type PromptAction = {
|
|
4
|
+
kind: 'approve';
|
|
5
|
+
decision: 'allow' | 'allow-always' | 'deny';
|
|
6
|
+
message?: string;
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'answer';
|
|
9
|
+
answers: Record<string, string>;
|
|
10
|
+
} | {
|
|
11
|
+
kind: 'dismiss';
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'choose';
|
|
14
|
+
choiceId: string;
|
|
15
|
+
};
|
|
16
|
+
export interface PromptAnswer {
|
|
17
|
+
choices: string[];
|
|
18
|
+
text: string;
|
|
19
|
+
custom: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface PromptDraft {
|
|
22
|
+
index: number;
|
|
23
|
+
answers: Record<string, PromptAnswer>;
|
|
24
|
+
reason: string;
|
|
25
|
+
showReason: boolean;
|
|
26
|
+
}
|
|
27
|
+
export declare const emptyPromptDraft: () => PromptDraft;
|
|
28
|
+
export declare const answerValue: (answer: PromptAnswer) => string;
|
|
29
|
+
export declare const questionAnswer: (draft: PromptDraft, question: ChatQuestion) => PromptAnswer;
|
|
30
|
+
export declare function pickPromptChoice(answer: PromptAnswer, question: ChatQuestion, label: string): PromptAnswer;
|
|
31
|
+
export declare const isBlockingPrompt: (item: PendingPrompt) => boolean;
|
|
32
|
+
export declare const orderPrompts: <T>(prompts: readonly T[], blocking: (prompt: T) => boolean, createdAt: (prompt: T) => number) => T[];
|
|
33
|
+
export declare function nextPrompt(items: readonly PendingPrompt[], activeId: string | null): PendingPrompt | null;
|
|
34
|
+
export declare function promptAnswers(item: ChatQuestionItem, draft: PromptDraft): Record<string, string> | null;
|