everybuddy 0.1.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 +21 -0
- package/README.md +184 -0
- package/dist/atlas/bundled.d.ts +15 -0
- package/dist/atlas/bundled.js +438 -0
- package/dist/atlas/bundled.js.map +1 -0
- package/dist/bones/rarity.d.ts +2 -0
- package/dist/bones/rarity.js +43 -0
- package/dist/bones/rarity.js.map +1 -0
- package/dist/bones/roll.d.ts +10 -0
- package/dist/bones/roll.js +71 -0
- package/dist/bones/roll.js.map +1 -0
- package/dist/bones/species.d.ts +1 -0
- package/dist/bones/species.js +3 -0
- package/dist/bones/species.js.map +1 -0
- package/dist/bones/stats.d.ts +6 -0
- package/dist/bones/stats.js +55 -0
- package/dist/bones/stats.js.map +1 -0
- package/dist/cli/attach.d.ts +5 -0
- package/dist/cli/attach.js +64 -0
- package/dist/cli/attach.js.map +1 -0
- package/dist/cli/card.d.ts +3 -0
- package/dist/cli/card.js +19 -0
- package/dist/cli/card.js.map +1 -0
- package/dist/cli/detach.d.ts +4 -0
- package/dist/cli/detach.js +36 -0
- package/dist/cli/detach.js.map +1 -0
- package/dist/cli/event.d.ts +7 -0
- package/dist/cli/event.js +35 -0
- package/dist/cli/event.js.map +1 -0
- package/dist/cli/hatch.d.ts +6 -0
- package/dist/cli/hatch.js +20 -0
- package/dist/cli/hatch.js.map +1 -0
- package/dist/cli/init.d.ts +2 -0
- package/dist/cli/init.js +76 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/install.d.ts +32 -0
- package/dist/cli/install.js +121 -0
- package/dist/cli/install.js.map +1 -0
- package/dist/cli/io.d.ts +9 -0
- package/dist/cli/io.js +35 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/setup.d.ts +26 -0
- package/dist/cli/setup.js +297 -0
- package/dist/cli/setup.js.map +1 -0
- package/dist/cli/sidecar.d.ts +5 -0
- package/dist/cli/sidecar.js +12 -0
- package/dist/cli/sidecar.js.map +1 -0
- package/dist/i18n/companion.d.ts +9 -0
- package/dist/i18n/companion.js +117 -0
- package/dist/i18n/companion.js.map +1 -0
- package/dist/i18n/ui.d.ts +67 -0
- package/dist/i18n/ui.js +270 -0
- package/dist/i18n/ui.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/render/card.d.ts +10 -0
- package/dist/render/card.js +188 -0
- package/dist/render/card.js.map +1 -0
- package/dist/render/color.d.ts +5 -0
- package/dist/render/color.js +100 -0
- package/dist/render/color.js.map +1 -0
- package/dist/render/compose.d.ts +2 -0
- package/dist/render/compose.js +10 -0
- package/dist/render/compose.js.map +1 -0
- package/dist/render/gacha.d.ts +9 -0
- package/dist/render/gacha.js +322 -0
- package/dist/render/gacha.js.map +1 -0
- package/dist/render/sprites.d.ts +5 -0
- package/dist/render/sprites.js +316 -0
- package/dist/render/sprites.js.map +1 -0
- package/dist/runtime/observer.d.ts +73 -0
- package/dist/runtime/observer.js +448 -0
- package/dist/runtime/observer.js.map +1 -0
- package/dist/runtime/sidecar.d.ts +18 -0
- package/dist/runtime/sidecar.js +670 -0
- package/dist/runtime/sidecar.js.map +1 -0
- package/dist/runtime/socket.d.ts +6 -0
- package/dist/runtime/socket.js +47 -0
- package/dist/runtime/socket.js.map +1 -0
- package/dist/runtime/tmux.d.ts +41 -0
- package/dist/runtime/tmux.js +186 -0
- package/dist/runtime/tmux.js.map +1 -0
- package/dist/runtime/types.d.ts +96 -0
- package/dist/runtime/types.js +2 -0
- package/dist/runtime/types.js.map +1 -0
- package/dist/soul/hatch.d.ts +6 -0
- package/dist/soul/hatch.js +90 -0
- package/dist/soul/hatch.js.map +1 -0
- package/dist/soul/profile.d.ts +6 -0
- package/dist/soul/profile.js +48 -0
- package/dist/soul/profile.js.map +1 -0
- package/dist/soul/providers/anthropic.d.ts +17 -0
- package/dist/soul/providers/anthropic.js +105 -0
- package/dist/soul/providers/anthropic.js.map +1 -0
- package/dist/soul/providers/index.d.ts +10 -0
- package/dist/soul/providers/index.js +23 -0
- package/dist/soul/providers/index.js.map +1 -0
- package/dist/soul/providers/openai.d.ts +20 -0
- package/dist/soul/providers/openai.js +120 -0
- package/dist/soul/providers/openai.js.map +1 -0
- package/dist/soul/providers/types.d.ts +4 -0
- package/dist/soul/providers/types.js +2 -0
- package/dist/soul/providers/types.js.map +1 -0
- package/dist/storage/companion.d.ts +3 -0
- package/dist/storage/companion.js +155 -0
- package/dist/storage/companion.js.map +1 -0
- package/dist/storage/config.d.ts +36 -0
- package/dist/storage/config.js +220 -0
- package/dist/storage/config.js.map +1 -0
- package/dist/storage/paths.d.ts +3 -0
- package/dist/storage/paths.js +12 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/types/companion.d.ts +84 -0
- package/dist/types/companion.js +2 -0
- package/dist/types/companion.js.map +1 -0
- package/dist/types/onboarding.d.ts +12 -0
- package/dist/types/onboarding.js +2 -0
- package/dist/types/onboarding.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { createProvider } from "../soul/providers/index.js";
|
|
3
|
+
import { DEFAULT_OBSERVER_PROFILE } from "../soul/profile.js";
|
|
4
|
+
import { resolveBuddyConfig } from "../storage/config.js";
|
|
5
|
+
const OBSERVER_SYSTEM_PROMPT = [
|
|
6
|
+
"You decide whether a terminal companion should speak in a small bubble.",
|
|
7
|
+
"The companion is a separate watcher, not the main assistant.",
|
|
8
|
+
"You receive a recent window of terminal commands plus the companion personality.",
|
|
9
|
+
"Return strict JSON only.",
|
|
10
|
+
].join(" ");
|
|
11
|
+
const DEFAULT_LANGUAGE = "zh";
|
|
12
|
+
const DEFAULT_LLM_COOLDOWN_MS = 6_000;
|
|
13
|
+
const DEDUPE_WINDOW_MS = 18_000;
|
|
14
|
+
const MEMORY_LIMIT = 5;
|
|
15
|
+
const COMMAND_WINDOW_LIMIT = 5;
|
|
16
|
+
export class CompanionObserver {
|
|
17
|
+
companion;
|
|
18
|
+
language;
|
|
19
|
+
provider;
|
|
20
|
+
now;
|
|
21
|
+
llmCooldownMs;
|
|
22
|
+
constructor(options) {
|
|
23
|
+
this.companion = options.companion;
|
|
24
|
+
this.language = options.language ?? DEFAULT_LANGUAGE;
|
|
25
|
+
this.provider = options.provider;
|
|
26
|
+
this.now = options.now ?? Date.now;
|
|
27
|
+
this.llmCooldownMs = options.llmCooldownMs;
|
|
28
|
+
}
|
|
29
|
+
observe(event, state) {
|
|
30
|
+
const command = event.command
|
|
31
|
+
? observeCommand(event.command, event.cwd, this.companion?.soul.name)
|
|
32
|
+
: undefined;
|
|
33
|
+
const tracker = state.commandTrackers[event.paneId];
|
|
34
|
+
const effectiveCommand = command ??
|
|
35
|
+
(tracker ? observeCommand(tracker.commandRaw, tracker.cwd, this.companion?.soul.name) : undefined);
|
|
36
|
+
const durationMs = tracker ? Math.max(0, event.timestamp - tracker.startedAt) : undefined;
|
|
37
|
+
if (event.type === "pane_active") {
|
|
38
|
+
return {
|
|
39
|
+
status: "idle",
|
|
40
|
+
reactionMode: state.status === "typing" ? "clear" : "preserve",
|
|
41
|
+
reactionText: undefined,
|
|
42
|
+
importance: "silent",
|
|
43
|
+
command: undefined,
|
|
44
|
+
durationMs: undefined,
|
|
45
|
+
shouldGenerateModel: false,
|
|
46
|
+
shouldRemember: false,
|
|
47
|
+
addressedToBuddy: false,
|
|
48
|
+
pulse: false,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (event.type === "input_update") {
|
|
52
|
+
return {
|
|
53
|
+
status: command ? "typing" : "idle",
|
|
54
|
+
reactionMode: "preserve",
|
|
55
|
+
reactionText: undefined,
|
|
56
|
+
importance: command?.addressedToBuddy ? "addressed" : command ? "low" : "silent",
|
|
57
|
+
command,
|
|
58
|
+
durationMs: undefined,
|
|
59
|
+
shouldGenerateModel: false,
|
|
60
|
+
shouldRemember: false,
|
|
61
|
+
addressedToBuddy: command?.addressedToBuddy ?? false,
|
|
62
|
+
pulse: command?.addressedToBuddy ?? false,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (event.type === "command_start") {
|
|
66
|
+
return {
|
|
67
|
+
status: "thinking",
|
|
68
|
+
reactionMode: "preserve",
|
|
69
|
+
reactionText: undefined,
|
|
70
|
+
importance: effectiveCommand?.addressedToBuddy ? "addressed" : "low",
|
|
71
|
+
command: effectiveCommand,
|
|
72
|
+
durationMs: undefined,
|
|
73
|
+
shouldGenerateModel: false,
|
|
74
|
+
shouldRemember: false,
|
|
75
|
+
addressedToBuddy: effectiveCommand?.addressedToBuddy ?? false,
|
|
76
|
+
pulse: effectiveCommand?.addressedToBuddy ?? false,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
status: "finished",
|
|
81
|
+
reactionMode: "clear",
|
|
82
|
+
reactionText: undefined,
|
|
83
|
+
importance: effectiveCommand?.addressedToBuddy ? "addressed" : "low",
|
|
84
|
+
command: effectiveCommand,
|
|
85
|
+
durationMs,
|
|
86
|
+
shouldGenerateModel: effectiveCommand !== undefined,
|
|
87
|
+
shouldRemember: false,
|
|
88
|
+
addressedToBuddy: effectiveCommand?.addressedToBuddy ?? false,
|
|
89
|
+
pulse: effectiveCommand?.addressedToBuddy ?? false,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async maybeGenerateDecision(plan, event, state) {
|
|
93
|
+
if (!this.provider || !this.companion || !plan.shouldGenerateModel || !plan.command) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
const commandWindow = state.commandWindows[event.paneId] ?? [];
|
|
97
|
+
const profile = this.companion.soul.observerProfile ?? DEFAULT_OBSERVER_PROFILE;
|
|
98
|
+
const now = this.now();
|
|
99
|
+
if (commandWindow.length < minimumWindowSize(profile)) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
const cooldownMs = this.llmCooldownMs ?? cooldownMsForProfile(profile);
|
|
103
|
+
if (state.recentNotableReactionAt !== undefined &&
|
|
104
|
+
now - state.recentNotableReactionAt < cooldownMs) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
try {
|
|
108
|
+
const response = await this.provider.complete(buildObserverPrompt({
|
|
109
|
+
companion: this.companion,
|
|
110
|
+
commandWindow,
|
|
111
|
+
command: plan.command,
|
|
112
|
+
memory: selectRecentBubbleMemory(state.memory),
|
|
113
|
+
event,
|
|
114
|
+
language: this.language,
|
|
115
|
+
status: state.status,
|
|
116
|
+
observerProfile: profile,
|
|
117
|
+
}));
|
|
118
|
+
const decision = parseObserverDecision(response);
|
|
119
|
+
if (!decision.shouldSpeak || !decision.reaction) {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
const normalized = normalizeObserverResponse(decision.reaction, commandWindow);
|
|
123
|
+
if (!normalized) {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
if (state.recentReaction &&
|
|
127
|
+
now - state.recentReaction.at < DEDUPE_WINDOW_MS &&
|
|
128
|
+
isNearDuplicateReaction(state.recentReaction.text, normalized)) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
return {
|
|
132
|
+
...decision,
|
|
133
|
+
reaction: normalized,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
async maybeGenerateReaction(plan, event, state) {
|
|
141
|
+
return (await this.maybeGenerateDecision(plan, event, state))?.reaction;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
export async function createCompanionObserver(companion) {
|
|
145
|
+
let language = DEFAULT_LANGUAGE;
|
|
146
|
+
let provider;
|
|
147
|
+
try {
|
|
148
|
+
const config = await resolveBuddyConfig();
|
|
149
|
+
language = config.language;
|
|
150
|
+
if (config.apiKey) {
|
|
151
|
+
provider = createProvider({
|
|
152
|
+
provider: config.provider,
|
|
153
|
+
apiKey: config.apiKey,
|
|
154
|
+
model: config.observerModel ?? config.model,
|
|
155
|
+
baseUrl: config.baseUrl,
|
|
156
|
+
systemPrompt: OBSERVER_SYSTEM_PROMPT,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
// Fall back to a silent observer when config is not available.
|
|
162
|
+
}
|
|
163
|
+
return new CompanionObserver({
|
|
164
|
+
companion,
|
|
165
|
+
language,
|
|
166
|
+
provider,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
export function observeCommand(command, cwd, companionName) {
|
|
170
|
+
const raw = command.trim();
|
|
171
|
+
const normalized = normalizeCommand(raw);
|
|
172
|
+
return {
|
|
173
|
+
raw,
|
|
174
|
+
normalized,
|
|
175
|
+
cwdRole: describeCwdRole(cwd),
|
|
176
|
+
addressedToBuddy: isDirectBuddyAddress(normalized, companionName),
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
export function classifyEventImportance(params) {
|
|
180
|
+
const { event, command } = params;
|
|
181
|
+
if (!command) {
|
|
182
|
+
return "silent";
|
|
183
|
+
}
|
|
184
|
+
if (command.addressedToBuddy) {
|
|
185
|
+
return "addressed";
|
|
186
|
+
}
|
|
187
|
+
if (event.type === "input_update") {
|
|
188
|
+
return "low";
|
|
189
|
+
}
|
|
190
|
+
if (event.type === "command_start") {
|
|
191
|
+
return "low";
|
|
192
|
+
}
|
|
193
|
+
return "low";
|
|
194
|
+
}
|
|
195
|
+
export function buildCommandTracker(event, command, _importance) {
|
|
196
|
+
return {
|
|
197
|
+
paneId: event.paneId,
|
|
198
|
+
commandRaw: command.raw,
|
|
199
|
+
startedAt: event.timestamp,
|
|
200
|
+
cwd: event.cwd,
|
|
201
|
+
addressedToBuddy: command.addressedToBuddy,
|
|
202
|
+
cwdRole: command.cwdRole,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
export function buildCommandWindowEntry(params) {
|
|
206
|
+
const { event, command, durationMs } = params;
|
|
207
|
+
return {
|
|
208
|
+
command: command.raw,
|
|
209
|
+
normalizedCommand: command.normalized,
|
|
210
|
+
cwd: event.cwd,
|
|
211
|
+
cwdRole: command.cwdRole,
|
|
212
|
+
exitCode: event.exitCode,
|
|
213
|
+
durationMs,
|
|
214
|
+
timestamp: event.timestamp,
|
|
215
|
+
addressedToBuddy: command.addressedToBuddy,
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
export function rememberCommandWindowEntry(entries, entry) {
|
|
219
|
+
return [...entries, entry].slice(-COMMAND_WINDOW_LIMIT);
|
|
220
|
+
}
|
|
221
|
+
export function buildMemoryEntry(params) {
|
|
222
|
+
const { event, command, importance, durationMs, reactionText, topic, mood } = params;
|
|
223
|
+
return {
|
|
224
|
+
timestamp: event.timestamp,
|
|
225
|
+
commandRaw: command.raw,
|
|
226
|
+
commandNormalized: command.normalized,
|
|
227
|
+
cwd: event.cwd,
|
|
228
|
+
cwdRole: command.cwdRole,
|
|
229
|
+
outcome: command.addressedToBuddy
|
|
230
|
+
? "addressed"
|
|
231
|
+
: event.exitCode === undefined
|
|
232
|
+
? "unknown"
|
|
233
|
+
: event.exitCode === 0
|
|
234
|
+
? "success"
|
|
235
|
+
: "failure",
|
|
236
|
+
exitCode: event.exitCode,
|
|
237
|
+
durationMs,
|
|
238
|
+
importance,
|
|
239
|
+
reactionText,
|
|
240
|
+
addressedToBuddy: command.addressedToBuddy,
|
|
241
|
+
topic,
|
|
242
|
+
mood,
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
export function rememberMemoryEntry(memory, entry) {
|
|
246
|
+
return [entry, ...memory].slice(0, MEMORY_LIMIT);
|
|
247
|
+
}
|
|
248
|
+
export function buildObserverPrompt(context) {
|
|
249
|
+
const { companion, commandWindow, command, memory, event, language, status, observerProfile } = context;
|
|
250
|
+
const languageInstruction = language === "zh"
|
|
251
|
+
? "Use Simplified Chinese. Keep `reaction` to one short sentence, ideally under 16 Chinese characters."
|
|
252
|
+
: "Use English. Keep `reaction` to one short sentence, under 12 words.";
|
|
253
|
+
const recentWindow = commandWindow
|
|
254
|
+
.map((entry, index) => {
|
|
255
|
+
return `${index + 1}. command=${entry.command}; cwd=${entry.cwdRole}; exit=${entry.exitCode ?? "?"}; duration=${entry.durationMs ?? "?"}ms; addressed=${entry.addressedToBuddy ? "yes" : "no"}`;
|
|
256
|
+
})
|
|
257
|
+
.join("\n");
|
|
258
|
+
const recentMemory = memory.length > 0
|
|
259
|
+
? memory
|
|
260
|
+
.map((entry, index) => {
|
|
261
|
+
return `${index + 1}. reaction=${entry.reactionText ?? "(none)"}; outcome=${entry.outcome}; topic=${entry.topic ?? "(none)"}; mood=${entry.mood ?? "(none)"}`;
|
|
262
|
+
})
|
|
263
|
+
.join("\n")
|
|
264
|
+
: "(none)";
|
|
265
|
+
return [
|
|
266
|
+
`A small ${companion.bones.species} named ${companion.soul.name} sits beside the user's terminal and occasionally comments in a speech bubble.`,
|
|
267
|
+
`You are ${companion.soul.name}. You are a separate watcher, not the main assistant.`,
|
|
268
|
+
"",
|
|
269
|
+
`Personality: ${companion.soul.personality}`,
|
|
270
|
+
`Observer voice: ${observerProfile.voice}`,
|
|
271
|
+
`Observer chattiness: ${observerProfile.chattiness}/5`,
|
|
272
|
+
`Observer sharpness: ${observerProfile.sharpness}/5`,
|
|
273
|
+
`Observer patience: ${observerProfile.patience}/5`,
|
|
274
|
+
`Current pane status: ${status}`,
|
|
275
|
+
`Latest cwd role: ${command.cwdRole}`,
|
|
276
|
+
`Latest command addressed you directly: ${command.addressedToBuddy ? "yes" : "no"}`,
|
|
277
|
+
`Latest command exit code: ${event.exitCode ?? "unknown"}`,
|
|
278
|
+
"",
|
|
279
|
+
"Recent command window (oldest to newest):",
|
|
280
|
+
recentWindow || "(none)",
|
|
281
|
+
"",
|
|
282
|
+
"Recent bubbles:",
|
|
283
|
+
recentMemory,
|
|
284
|
+
"",
|
|
285
|
+
"Rules:",
|
|
286
|
+
"- Decide whether the current command window is worth commenting on.",
|
|
287
|
+
"- React to the pattern and mood, not the raw command text.",
|
|
288
|
+
"- Do not restate the command line.",
|
|
289
|
+
"- Stay sharp and playful, never mean-spirited.",
|
|
290
|
+
"- Avoid repeating the recent bubbles.",
|
|
291
|
+
"- If this moment is not worth a bubble, set shouldSpeak to false and leave reaction empty.",
|
|
292
|
+
"- If speaking, reaction must be one line only.",
|
|
293
|
+
"- No markdown, no code fences, no quotes around reaction text.",
|
|
294
|
+
`- ${languageInstruction}`,
|
|
295
|
+
"",
|
|
296
|
+
'Return strict JSON only: {"shouldSpeak":true|false,"reaction":"...","topic":"...","mood":"..."}',
|
|
297
|
+
].join("\n");
|
|
298
|
+
}
|
|
299
|
+
export function parseObserverDecision(response) {
|
|
300
|
+
const stripped = stripMarkdownFence(response).trim();
|
|
301
|
+
const parsed = JSON.parse(stripped);
|
|
302
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
303
|
+
throw new Error("Observer response must be a JSON object.");
|
|
304
|
+
}
|
|
305
|
+
const record = parsed;
|
|
306
|
+
const shouldSpeak = record.shouldSpeak;
|
|
307
|
+
const reaction = normalizeOptionalField(record.reaction);
|
|
308
|
+
const topic = normalizeOptionalField(record.topic);
|
|
309
|
+
const mood = normalizeOptionalField(record.mood);
|
|
310
|
+
if (typeof shouldSpeak !== "boolean") {
|
|
311
|
+
throw new Error("Observer response `shouldSpeak` must be a boolean.");
|
|
312
|
+
}
|
|
313
|
+
if (shouldSpeak && (!reaction || reaction.length === 0)) {
|
|
314
|
+
throw new Error("Observer response `reaction` must be non-empty when `shouldSpeak` is true.");
|
|
315
|
+
}
|
|
316
|
+
return {
|
|
317
|
+
shouldSpeak,
|
|
318
|
+
...(reaction ? { reaction } : {}),
|
|
319
|
+
...(topic ? { topic } : {}),
|
|
320
|
+
...(mood ? { mood } : {}),
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
export function normalizeObserverResponse(response, commandWindow) {
|
|
324
|
+
const stripped = stripMarkdownFence(response).trim();
|
|
325
|
+
if (stripped.length === 0) {
|
|
326
|
+
return undefined;
|
|
327
|
+
}
|
|
328
|
+
const firstLine = stripped
|
|
329
|
+
.split(/\r?\n/)
|
|
330
|
+
.map((line) => line.trim())
|
|
331
|
+
.find((line) => line.length > 0);
|
|
332
|
+
if (!firstLine) {
|
|
333
|
+
return undefined;
|
|
334
|
+
}
|
|
335
|
+
const unquoted = stripMatchingQuotes(firstLine);
|
|
336
|
+
const normalized = unquoted.replace(/\s+/g, " ").trim();
|
|
337
|
+
if (normalized.length === 0) {
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
if (isCommandEcho(normalized, commandWindow)) {
|
|
341
|
+
return undefined;
|
|
342
|
+
}
|
|
343
|
+
return normalized;
|
|
344
|
+
}
|
|
345
|
+
function selectRecentBubbleMemory(memory) {
|
|
346
|
+
return memory.filter((entry) => entry.reactionText && entry.reactionText.length > 0).slice(0, 2);
|
|
347
|
+
}
|
|
348
|
+
function minimumWindowSize(profile) {
|
|
349
|
+
if (profile.chattiness >= 4) {
|
|
350
|
+
return 1;
|
|
351
|
+
}
|
|
352
|
+
if (profile.chattiness >= 2) {
|
|
353
|
+
return 2;
|
|
354
|
+
}
|
|
355
|
+
return 3;
|
|
356
|
+
}
|
|
357
|
+
function cooldownMsForProfile(profile) {
|
|
358
|
+
switch (profile.chattiness) {
|
|
359
|
+
case 5:
|
|
360
|
+
return 2_000;
|
|
361
|
+
case 4:
|
|
362
|
+
return 3_000;
|
|
363
|
+
case 3:
|
|
364
|
+
return 4_500;
|
|
365
|
+
case 2:
|
|
366
|
+
return 6_000;
|
|
367
|
+
case 1:
|
|
368
|
+
default:
|
|
369
|
+
return 8_000;
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
function normalizeCommand(command) {
|
|
373
|
+
return command?.trim().toLowerCase().replace(/\s+/g, " ") ?? "";
|
|
374
|
+
}
|
|
375
|
+
function isDirectBuddyAddress(normalized, companionName) {
|
|
376
|
+
if (normalized === "/buddy" || normalized.startsWith("/buddy ")) {
|
|
377
|
+
return true;
|
|
378
|
+
}
|
|
379
|
+
if (!companionName) {
|
|
380
|
+
return false;
|
|
381
|
+
}
|
|
382
|
+
const buddyName = normalizeCommand(companionName);
|
|
383
|
+
return normalized === buddyName || normalized.startsWith(`${buddyName} `);
|
|
384
|
+
}
|
|
385
|
+
function describeCwdRole(cwd) {
|
|
386
|
+
const home = process.env.HOME?.trim();
|
|
387
|
+
if (home && cwd === home) {
|
|
388
|
+
return "home";
|
|
389
|
+
}
|
|
390
|
+
const base = path.basename(cwd);
|
|
391
|
+
return base.length > 0 ? base : cwd;
|
|
392
|
+
}
|
|
393
|
+
function stripMarkdownFence(value) {
|
|
394
|
+
const trimmed = value.trim();
|
|
395
|
+
if (!trimmed.startsWith("```")) {
|
|
396
|
+
return trimmed;
|
|
397
|
+
}
|
|
398
|
+
return trimmed
|
|
399
|
+
.replace(/^```(?:[\w-]+)?\s*/i, "")
|
|
400
|
+
.replace(/\s*```$/, "")
|
|
401
|
+
.trim();
|
|
402
|
+
}
|
|
403
|
+
function stripMatchingQuotes(value) {
|
|
404
|
+
const trimmed = value.trim();
|
|
405
|
+
const pairs = [
|
|
406
|
+
['"', '"'],
|
|
407
|
+
["'", "'"],
|
|
408
|
+
["“", "”"],
|
|
409
|
+
];
|
|
410
|
+
for (const [left, right] of pairs) {
|
|
411
|
+
if (trimmed.startsWith(left) && trimmed.endsWith(right)) {
|
|
412
|
+
return trimmed.slice(left.length, trimmed.length - right.length).trim();
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
return trimmed;
|
|
416
|
+
}
|
|
417
|
+
function normalizeOptionalField(value) {
|
|
418
|
+
if (typeof value !== "string") {
|
|
419
|
+
return undefined;
|
|
420
|
+
}
|
|
421
|
+
const trimmed = value.trim();
|
|
422
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
423
|
+
}
|
|
424
|
+
function isCommandEcho(response, commandWindow) {
|
|
425
|
+
if (!commandWindow || commandWindow.length === 0) {
|
|
426
|
+
return false;
|
|
427
|
+
}
|
|
428
|
+
const normalizedResponse = normalizeCommand(response);
|
|
429
|
+
return commandWindow.some((entry) => {
|
|
430
|
+
const normalizedCommand = normalizeCommand(entry.normalizedCommand || entry.command);
|
|
431
|
+
if (normalizedCommand.length === 0) {
|
|
432
|
+
return false;
|
|
433
|
+
}
|
|
434
|
+
if (normalizedResponse === normalizedCommand || normalizedResponse.includes(normalizedCommand)) {
|
|
435
|
+
return true;
|
|
436
|
+
}
|
|
437
|
+
const commandTokens = normalizedCommand.split(" ").filter((token) => token.length >= 3);
|
|
438
|
+
if (commandTokens.length === 0) {
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
const matchedTokens = commandTokens.filter((token) => normalizedResponse.includes(token)).length;
|
|
442
|
+
return matchedTokens >= Math.min(2, commandTokens.length);
|
|
443
|
+
});
|
|
444
|
+
}
|
|
445
|
+
function isNearDuplicateReaction(previous, next) {
|
|
446
|
+
return normalizeCommand(previous) === normalizeCommand(next);
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=observer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer.js","sourceRoot":"","sources":["../../src/runtime/observer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { RenderMode, SidecarState } from "./types.js";
|
|
2
|
+
import type { BuddyLanguage, CompanionRecord } from "../types/companion.js";
|
|
3
|
+
export interface SidecarCommandOptions {
|
|
4
|
+
windowId: string;
|
|
5
|
+
targetPane?: string | undefined;
|
|
6
|
+
}
|
|
7
|
+
export declare function runSidecarCommand(options: SidecarCommandOptions): Promise<void>;
|
|
8
|
+
export declare function resolveTargetPane(paneIds: string[], sidecarPaneId: string, currentTargetPaneId?: string): string | undefined;
|
|
9
|
+
export declare function resolveRenderMode(columns: number): RenderMode;
|
|
10
|
+
export declare function resolveReactionBubble(state: Pick<SidecarState, "reactionText" | "reactionExpiresAt">, now: number): {
|
|
11
|
+
text: string | undefined;
|
|
12
|
+
fading: boolean;
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveSpriteFrameState(frameTick: number, animated: boolean, frameCount: number, pulsing?: boolean): {
|
|
15
|
+
frameIndex: number;
|
|
16
|
+
blink: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare function buildIdleSoulSummary(companion: CompanionRecord, language?: BuddyLanguage): string;
|