Skip to content

Commit 19339b5

Browse files
authored
Merge pull request #55 from your-papa/dev
Release 0.6.0
2 parents 82d3c65 + 214b4a7 commit 19339b5

19 files changed

+393
-233
lines changed

manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"description": "Interact with your privacy focused assistant, leveraging Ollama or OpenAI, making your second brain even smarter.",
55
"author": "Leo310, nicobrauchtgit",
66
"authorUrl": "https://github.com/nicobrauchtgit",
7-
"version": "0.5.0",
7+
"version": "0.5.1",
88
"minAppVersion": "1.5.0",
99
"isDesktopOnly": true
1010
}

src/SmartSecondBrain.ts

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ export default class SmartSecondBrain {
108108
} catch (e) {
109109
Log.error(e);
110110
papaState.set('error');
111-
// TODO add error state
111+
errorState.set('failed-indexing');
112112
new Notice(t('notice.failed_indexing'), 4000);
113113
}
114114

@@ -139,29 +139,26 @@ export default class SmartSecondBrain {
139139

140140
async runPapa() {
141141
papaState.set('running');
142-
const cH = get(chatHistory);
143-
const userQuery = cH[cH.length - 1].content;
144142
try {
143+
const cH = get(chatHistory);
144+
const userQuery = cH[cH.length - 1].content;
145145
const responseStream = this.papa.run({
146146
isRAG: get(data).isUsingRag,
147147
userQuery,
148148
chatHistory: serializeChatHistory(cH.slice(0, cH.length - 1)),
149149
lang: get(data).assistantLanguage,
150150
});
151-
152151
for await (const response of responseStream) {
153152
runState.set(response.status);
154153
runContent.set(response.content);
155-
if (get(runState) === 'stopped') {
156-
papaState.set('idle');
157-
return; // when used break it somehow returns the whole function
158-
}
159154
}
160155
} catch (error) {
161-
Log.error(error);
156+
const errorMsg = get(_)('notice.run_failed', { values: { error } });
157+
// Log.error(errorMsg);
158+
runContent.set(errorMsg);
162159
// papaState.set('error');
163160
// errorState.set('run-failed');
164-
new Notice(get(_)('notice.failed_run', { values: { error } }), 4000);
161+
new Notice(errorMsg, 4000);
165162
}
166163
papaState.set('idle');
167164
}
@@ -214,6 +211,15 @@ export default class SmartSecondBrain {
214211
if (this.papa) this.papa.setSimilarityThreshold(value);
215212
}
216213

214+
stopRun() {
215+
if (this.papa) this.papa.stopRun();
216+
papaState.set('idle');
217+
}
218+
219+
setNumOfDocsToRetrieve(k: number) {
220+
if (this.papa) this.papa.setNumOfDocsToRetrieve(k);
221+
}
222+
217223
setGenModel(genModel: GenModel) {
218224
if (this.papa) this.papa.setGenModel(genModel);
219225
}

src/components/Chat/Chat.svelte

Lines changed: 18 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,10 @@
22
import InputComponent from './Input.svelte';
33
import QuickSettingsDrawer from './QuickSettingsDrawer.svelte';
44
import { Notice } from 'obsidian';
5-
import { afterUpdate } from 'svelte';
65
import DotAnimation from '../base/DotAnimation.svelte';
76
import MessageContainer from './MessageContainer.svelte';
87
import { t } from 'svelte-i18n';
9-
import {
10-
papaState,
11-
chatHistory,
12-
isChatInSidebar,
13-
chatInput,
14-
isEditing,
15-
isEditingAssistantMessage,
16-
type ChatMessage,
17-
runContent,
18-
runState,
19-
data,
20-
} from '../../store';
8+
import { papaState, chatHistory, chatInput, isEditing, isEditingAssistantMessage, type ChatMessage, runContent, runState, data } from '../../store';
219
import {
2210
onClick,
2311
onMouseOver,
@@ -41,9 +29,9 @@
4129
}
4230
let contentNode: HTMLElement;
4331
44-
afterUpdate(() => {
45-
if (contentNode && $runState === 'generating' && $runContent) renderMarkdown(contentNode, $runContent);
46-
});
32+
$: if (contentNode && ($runState === 'generating' || $runState === 'stopped') && $runContent) {
33+
renderMarkdown(contentNode, $runContent);
34+
}
4735
4836
$: if ($runState === 'retrieving' && $runContent == '0') {
4937
new Notice($t('notice.no_notes_retrieved'));
@@ -71,29 +59,22 @@
7159

7260
<!-- svelte-ignore a11y-click-events-have-key-events -->
7361
<!-- svelte-ignore a11y-no-static-element-interactions -->
62+
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
7463
<div class="--background-modifier-border flex h-full flex-col gap-1">
7564
<QuickSettingsDrawer />
7665
<div
7766
bind:this={chatWindow}
7867
on:scroll={() => (isAutoScrolling = chatWindow.scrollTop + chatWindow.clientHeight + 1 >= chatWindow.scrollHeight)}
79-
class="chat-window w-full flex-grow select-text overflow-y-scroll rounded-md border border-solid border-[--background-modifier-border] {$isChatInSidebar
80-
? 'bg-[--background-secondary]'
81-
: 'bg-[--background-primary]'}"
68+
class="chat-window w-full flex-grow select-text overflow-y-scroll rounded-md border border-solid border-[--background-modifier-border] bg-[--background-primary]"
8269
>
8370
{#each $chatHistory as message (message.id)}
8471
<MessageContainer role={message.role}>
8572
{#if message.role === 'User'}
86-
<!-- svelte-ignore a11y-click-events-have-key-events -->
87-
<!-- svelte-ignore a11y-no-static-element-interactions -->
88-
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
8973
<span bind:this={editElem} on:mouseover={onMouseOver} on:click={onClick} use:renderMarkdown={message.content} />
90-
<!-- svelte-ignore a11y-click-events-have-key-events -->
91-
<!-- svelte-ignore a11y-no-static-element-interactions -->
9274
<div class="flex {$data.isChatComfy ? 'justify-end' : ''} gap-1 opacity-0 group-hover:opacity-100">
9375
{#if $isEditing && editMessageId === message.id}
9476
<span aria-label={$t('chat.copy')} class={iconStyle} on:click|preventDefault={cancelEditing} use:icon={'x-circle'} />
9577
{:else}
96-
<!-- svelte-ignore a11y-no-static-element-interactions -->
9778
<span
9879
aria-label={$t('chat.edit')}
9980
class={iconStyle}
@@ -103,18 +84,11 @@
10384
{/if}
10485
</div>
10586
{:else}
106-
<!-- svelte-ignore a11y-click-events-have-key-events -->
107-
<!-- svelte-ignore a11y-no-static-element-interactions -->
108-
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
10987
<span on:mouseover={onMouseOver} use:renderMarkdown={message.content} on:click={onClick} bind:this={initialAssistantMessageSpan} />
11088
<div class="flex gap-1 opacity-0 group-hover:opacity-100">
11189
{#if !$isEditingAssistantMessage}
112-
<!-- svelte-ignore a11y-no-static-element-interactions -->
113-
<!-- svelte-ignore a11y-click-events-have-key-events -->
11490
<span aria-label={$t('chat.copy')} class={iconStyle} on:click={() => toClipboard(message.content)} use:icon={'copy'} />
11591
{#if $chatHistory.indexOf(message) !== 0}
116-
<!-- svelte-ignore a11y-no-static-element-interactions -->
117-
<!-- svelte-ignore a11y-click-events-have-key-events -->
11892
<span
11993
aria-label={$t('chat.regenerate')}
12094
class={iconStyle}
@@ -123,8 +97,6 @@
12397
/>
12498
{/if}
12599
{#if $chatHistory.length === 1}
126-
<!-- svelte-ignore a11y-no-static-element-interactions -->
127-
<!-- svelte-ignore a11y-click-events-have-key-events -->
128100
<span
129101
aria-label={$t('chat.change_assistant_prompt')}
130102
class={iconStyle}
@@ -133,16 +105,12 @@
133105
/>
134106
{/if}
135107
{:else}
136-
<!-- svelte-ignore a11y-click-events-have-key-events -->
137-
<!-- svelte-ignore a11y-no-static-element-interactions -->
138108
<span
139109
aria-label={$t('chat.cancel_edit')}
140110
class={iconStyle}
141111
on:click|preventDefault={() => cancelEditingInitialAssistantMessage(initialAssistantMessageSpan)}
142112
use:icon={'x-circle'}
143113
/>
144-
<!-- svelte-ignore a11y-click-events-have-key-events -->
145-
<!-- svelte-ignore a11y-no-static-element-interactions -->
146114
<span
147115
aria-label={$t('chat.reset_assistant_prompt')}
148116
class={iconStyle}
@@ -162,13 +130,21 @@
162130
<p>{$t('chat.retrieving')}<DotAnimation /></p>
163131
{:else if $runState === 'reducing'}
164132
<p>{$t('chat.reducing', { values: { num: $runContent } })}<DotAnimation /></p>
165-
{:else if $runState === 'generating' && $runContent}
166-
<!-- svelte-ignore a11y-click-events-have-key-events -->
167-
<!-- svelte-ignore a11y-no-static-element-interactions -->
168-
<!-- svelte-ignore a11y-mouse-events-have-key-events -->
133+
{:else if $runState === 'generating'}
169134
<span bind:this={contentNode} style="background: transparent;" />
170135
{/if}
171136
</MessageContainer>
137+
{:else if $papaState === 'idle' && $runState === 'stopped'}
138+
<MessageContainer role="Assistant">
139+
<span bind:this={contentNode} style="background: transparent;" />
140+
<p>{$t('chat.stopped')}</p>
141+
<span
142+
aria-label={$t('chat.regenerate')}
143+
class={iconStyle + ' opacity-0 group-hover:opacity-100'}
144+
on:click|preventDefault={() => redoGeneration()}
145+
use:icon={'refresh-cw'}
146+
/>
147+
</MessageContainer>
172148
{/if}
173149
</div>
174150
<InputComponent bind:textarea />

src/components/Chat/Input.svelte

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { Notice, setIcon } from 'obsidian';
2+
import { setIcon } from 'obsidian';
33
import { t } from 'svelte-i18n';
44
import {
55
plugin,
@@ -10,13 +10,12 @@
1010
papaState,
1111
papaIndexingProgress,
1212
isChatInSidebar,
13-
runState,
1413
runContent,
1514
isEditing,
1615
} from '../../store';
1716
import ProgressCircle from '../base/ProgressCircle.svelte';
1817
import { addMessage } from '../../controller/Messages';
19-
import Logo from '../base/Logo.svelte';
18+
import Logo from '../Logos/LogoSimple.svelte';
2019
2120
export let textarea: HTMLTextAreaElement;
2221
@@ -73,21 +72,19 @@
7372
</script>
7473

7574
<!-- save delete and rag settings slightly above input field -->
75+
<!-- svelte-ignore a11y-click-events-have-key-events -->
76+
<!-- svelte-ignore a11y-no-static-element-interactions -->
7677
<div class="relative">
7778
<div
7879
class="absolute -top-[62px] left-1/2 flex -translate-x-1/2 items-center gap-3 rounded-t-2xl border border-solid border-x-[--background-modifier-border] border-b-transparent border-t-[--background-modifier-border] {$isChatInSidebar
7980
? 'bg-[--background-secondary]'
8081
: 'bg-[--background-primary]'} pt-2 px-2"
8182
>
8283
{#if $chatHistory.length > 1}
83-
<!-- svelte-ignore a11y-click-events-have-key-events -->
84-
<!-- svelte-ignore a11y-no-static-element-interactions -->
8584
<div aria-label={$t('chat.save')} class={iconStyle} use:icon={'save'} on:click={() => $plugin.saveChat()} hidden={$papaState === 'running'} />
8685
{/if}
87-
<!-- svelte-ignore a11y-click-events-have-key-events -->
88-
<!-- svelte-ignore a11y-no-static-element-interactions -->
8986
<div
90-
aria-label={$data.isUsingRag ? $t('chat.toggle_llm') : $t('chat.toggle_papa')}
87+
aria-label={$data.isUsingRag ? $t('chat.toggle_papa') : $t('chat.toggle_llm')}
9188
on:click={handleRAGToggle}
9289
class={`h-[48px] w-[48px] *:!h-[48px] *:!w-[48px] hover:text-[--text-accent-hover] hover:scale-110 transform duration-300 ease-in-out ${
9390
$data.isUsingRag ? 'text-[--color-accent]' : 'text-[--text-normal]'
@@ -96,8 +93,6 @@
9693
<Logo />
9794
</div>
9895
{#if $chatHistory.length > 1}
99-
<!-- svelte-ignore a11y-click-events-have-key-events -->
100-
<!-- svelte-ignore a11y-no-static-element-interactions -->
10196
<div
10297
aria-label={$t('chat.delete')}
10398
class={iconStyle}
@@ -120,7 +115,7 @@
120115
{#if $papaState === 'running'}
121116
<button
122117
aria-label={$t('chat.stop')}
123-
on:click={() => ($runState = 'stopped')}
118+
on:click={() => $plugin.s2b.stopRun()}
124119
class="h-8 rounded-r-md px-4 py-2 transition duration-300 ease-in-out hover:bg-[--text-accent-hover]"
125120
use:icon={'stop-circle'}
126121
/>

src/components/Chat/MessageContainer.svelte

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script lang="ts">
2-
import { data, isChatInSidebar } from '../../store';
2+
import { data } from '../../store';
33
import { t } from 'svelte-i18n';
44
55
export let role: 'User' | 'Assistant';
@@ -20,15 +20,11 @@
2020
</div>
2121
{/if}
2222
{:else if $data.isChatComfy}
23-
<div class="group ml-4 mt-4 w-fit max-w-[80%] rounded-t-lg rounded-br-lg bg-[--background-primary-alt] px-4 pb-1 pt-[1px] [&_p]:mb-2">
23+
<div class="group my-4 ml-4 w-fit max-w-[80%] rounded-t-lg rounded-br-lg bg-[--background-primary-alt] px-4 pb-1 pt-[1px] [&_p]:mb-2">
2424
<slot />
2525
</div>
2626
{:else}
27-
<div
28-
class="group border-x-0 border-b border-t-0 border-solid border-[--background-modifier-border] p-2 pr-4 {$isChatInSidebar
29-
? 'bg-[--background-secondary-alt]'
30-
: 'bg-[--background-primary-alt]'}"
31-
>
27+
<div class="group border-x-0 border-b border-t-0 border-solid border-[--background-modifier-border] bg-[--background-primary-alt] p-2 pr-4">
3228
<div class="mt-2 font-bold text-[--text-accent]">{$t('chat.assistant')}</div>
3329
<slot />
3430
</div>

0 commit comments

Comments
 (0)