@koda-sl/baker-bridge 0.138.0-dev.43453bfcd → 0.139.0-dev.a1467d0a8
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 +1 -1
- package/dist/hono/agent.d.ts.map +1 -1
- package/dist/hono/agent.js +1 -2
- package/dist/hono/agent.js.map +1 -1
- package/dist/hono/agent.test.js +0 -24
- package/dist/hono/agent.test.js.map +1 -1
- package/dist/hono/bridge-job.d.ts +0 -2
- package/dist/hono/bridge-job.d.ts.map +1 -1
- package/dist/hono/bridge-job.js +1 -2
- package/dist/hono/bridge-job.js.map +1 -1
- package/dist/hono/prompt-context.d.ts +0 -9
- package/dist/hono/prompt-context.d.ts.map +1 -1
- package/dist/hono/prompt-context.js +0 -23
- package/dist/hono/prompt-context.js.map +1 -1
- package/dist/hono/prompt-context.test.js +1 -11
- package/dist/hono/prompt-context.test.js.map +1 -1
- package/dist/hono/types.d.ts +0 -7
- package/dist/hono/types.d.ts.map +1 -1
- package/dist/review/digest.d.ts +5 -0
- package/dist/review/digest.d.ts.map +1 -1
- package/dist/review/digest.js +41 -11
- package/dist/review/digest.js.map +1 -1
- package/dist/review/digest.test.js +94 -0
- package/dist/review/digest.test.js.map +1 -1
- package/dist/review/evidence-block.js +1 -1
- package/dist/review/evidence-block.js.map +1 -1
- package/dist/review/reply-language.d.ts +25 -0
- package/dist/review/reply-language.d.ts.map +1 -0
- package/dist/review/reply-language.js +81 -0
- package/dist/review/reply-language.js.map +1 -0
- package/package.json +2 -1
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// Which language a chat message is written in, read by eld's n-gram model:
|
|
2
|
+
// offline and deterministic, so the same Session always digests the same way.
|
|
3
|
+
// franc's trigrams read short English lines ("I'll look at what Alex sent.",
|
|
4
|
+
// "publish it please") as German or French; eld reads them as English. Only the
|
|
5
|
+
// languages below compete, which keeps a short Spanish line from being read as
|
|
6
|
+
// Galician or Asturian.
|
|
7
|
+
import { eld } from "eld/small";
|
|
8
|
+
const LANGUAGES = {
|
|
9
|
+
en: "English",
|
|
10
|
+
es: "Spanish",
|
|
11
|
+
pt: "Portuguese",
|
|
12
|
+
ca: "Catalan",
|
|
13
|
+
fr: "French",
|
|
14
|
+
it: "Italian",
|
|
15
|
+
de: "German",
|
|
16
|
+
};
|
|
17
|
+
const detector = eld.newInstance();
|
|
18
|
+
detector.setLanguageSubset(Object.keys(LANGUAGES));
|
|
19
|
+
// Fenced and inline code, quoted text and paths are the marketer's own words or
|
|
20
|
+
// our names played back — a page title, a funnel step, a file, a code comment —
|
|
21
|
+
// and keep their language whatever the sentence around them is written in.
|
|
22
|
+
const NOT_PROSE = /```[\s\S]*?```|"[^"\n]*"|“[^”\n]*”|«[^»\n]*»|`[^`\n]*`|https?:\/\/\S+|(?:^|\s)[\w.-]*\/[\w./-]+/g;
|
|
23
|
+
// Fewer letters than this is too short to tell: "ok", "go", "Listo." Such a
|
|
24
|
+
// message is never flagged, and never sets the marketer's language.
|
|
25
|
+
const MIN_LETTERS = 15;
|
|
26
|
+
const SPEAKER_LABEL = /\[Current speaker: [^\]\n]*\]\n+/g;
|
|
27
|
+
const ATTACHED_FILES = /=== ATTACHED [\s\S]*?=== END ATTACHED FILES ===/g;
|
|
28
|
+
// A workspace skill the marketer typed (`/landing Crea una página…`) reaches the
|
|
29
|
+
// SDK verbatim, without a speaker label, so its arguments are theirs. The CLI
|
|
30
|
+
// records it either as typed or as `<command-args>`.
|
|
31
|
+
const TYPED_COMMAND = /^\/[^\s/]+\s+([\s\S]+)$/;
|
|
32
|
+
const COMMAND_ARGS = /<command-args>([\s\S]*?)<\/command-args>/;
|
|
33
|
+
const letters = (text) => (text.match(/\p{L}/gu) ?? []).length;
|
|
34
|
+
function read(text) {
|
|
35
|
+
return letters(text) < MIN_LETTERS ? undefined : LANGUAGES[detector.detect(text).language];
|
|
36
|
+
}
|
|
37
|
+
/** The language a message is written in, or undefined when it is too short to tell. */
|
|
38
|
+
export function messageLanguage(text) {
|
|
39
|
+
return read(text.replace(NOT_PROSE, " "));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* What the marketer typed in a turn's opening line, or undefined when nobody
|
|
43
|
+
* typed it. The bridge labels every message a person sent with
|
|
44
|
+
* `[Current speaker: …]`, and sends a typed skill command as it was typed; a
|
|
45
|
+
* skill body, a task notification or hook feedback arrives in the same seat
|
|
46
|
+
* with neither, and must not set the language the replies are read against.
|
|
47
|
+
* What follows the label is theirs, less the attachment block the bridge
|
|
48
|
+
* appends in English.
|
|
49
|
+
*/
|
|
50
|
+
export function marketerWords(userLine) {
|
|
51
|
+
const labels = [...userLine.matchAll(SPEAKER_LABEL)];
|
|
52
|
+
const last = labels[labels.length - 1];
|
|
53
|
+
if (last?.index === undefined) {
|
|
54
|
+
const command = COMMAND_ARGS.exec(userLine) ?? TYPED_COMMAND.exec(userLine.trim());
|
|
55
|
+
return command?.[1]?.replace(ATTACHED_FILES, " ");
|
|
56
|
+
}
|
|
57
|
+
return userLine.slice(last.index + last[0].length).replace(ATTACHED_FILES, " ");
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* A reply in another language than the marketer's, or undefined. Only English
|
|
61
|
+
* beside another language counts: Spanish, Catalan and Portuguese are too close
|
|
62
|
+
* to tell apart on one line, and the drift that reaches marketers is into the
|
|
63
|
+
* English of the tools, or out of English into an older Spanish context. The
|
|
64
|
+
* reply is read whole and sentence by sentence, so one English line inside a
|
|
65
|
+
* Spanish message still shows.
|
|
66
|
+
*/
|
|
67
|
+
export function languageMismatch(reply, marketer) {
|
|
68
|
+
if (marketer === undefined) {
|
|
69
|
+
return undefined;
|
|
70
|
+
}
|
|
71
|
+
const words = reply.replace(NOT_PROSE, " ");
|
|
72
|
+
const parts = [words, ...words.split(/(?<=[.!?:;])\s+|\n+/)];
|
|
73
|
+
for (const part of parts) {
|
|
74
|
+
const written = read(part);
|
|
75
|
+
if (written !== undefined && written !== marketer && (written === "English" || marketer === "English")) {
|
|
76
|
+
return { reply: written, marketer };
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=reply-language.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply-language.js","sourceRoot":"","sources":["../../src/review/reply-language.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@koda-sl/baker-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.139.0-dev.a1467d0a8",
|
|
4
4
|
"description": "HTTP server wrapping the Claude Agent SDK. Persists chat events to Convex; the dashboard subscribes via Convex realtime",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -44,6 +44,7 @@
|
|
|
44
44
|
"@anthropic-ai/claude-agent-sdk": "^0.3.295",
|
|
45
45
|
"@hono/node-server": "^1.19.14",
|
|
46
46
|
"@t3-oss/env-core": "^0.13.10",
|
|
47
|
+
"eld": "^2.1.0",
|
|
47
48
|
"hono": "^4.12.25",
|
|
48
49
|
"image-size": "^2.0.2",
|
|
49
50
|
"mockttp": "4.6.3",
|