foundation-ai-agent 1.0.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/README.md +338 -0
- package/dist/compat/butler-cloud.d.ts +33 -0
- package/dist/compat/butler-cloud.d.ts.map +1 -0
- package/dist/compat/butler-cloud.js +69 -0
- package/dist/compat/butler-cloud.js.map +1 -0
- package/dist/compat/butler-edge.d.ts +34 -0
- package/dist/compat/butler-edge.d.ts.map +1 -0
- package/dist/compat/butler-edge.js +62 -0
- package/dist/compat/butler-edge.js.map +1 -0
- package/dist/compat/butler-pair.d.ts +27 -0
- package/dist/compat/butler-pair.d.ts.map +1 -0
- package/dist/compat/butler-pair.js +23 -0
- package/dist/compat/butler-pair.js.map +1 -0
- package/dist/compat/entry.d.ts +26 -0
- package/dist/compat/entry.d.ts.map +1 -0
- package/dist/compat/entry.js +35 -0
- package/dist/compat/entry.js.map +1 -0
- package/dist/compat/index.d.ts +12 -0
- package/dist/compat/index.d.ts.map +1 -0
- package/dist/compat/index.js +12 -0
- package/dist/compat/index.js.map +1 -0
- package/dist/compat/queue.d.ts +31 -0
- package/dist/compat/queue.d.ts.map +1 -0
- package/dist/compat/queue.js +54 -0
- package/dist/compat/queue.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger.d.ts +28 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +62 -0
- package/dist/ledger.js.map +1 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +2 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/observer.d.ts +37 -0
- package/dist/observability/observer.d.ts.map +1 -0
- package/dist/observability/observer.js +53 -0
- package/dist/observability/observer.js.map +1 -0
- package/dist/observability/types.d.ts +92 -0
- package/dist/observability/types.d.ts.map +1 -0
- package/dist/observability/types.js +9 -0
- package/dist/observability/types.js.map +1 -0
- package/dist/s01-realtime/index.d.ts +3 -0
- package/dist/s01-realtime/index.d.ts.map +1 -0
- package/dist/s01-realtime/index.js +2 -0
- package/dist/s01-realtime/index.js.map +1 -0
- package/dist/s01-realtime/signaling.d.ts +78 -0
- package/dist/s01-realtime/signaling.d.ts.map +1 -0
- package/dist/s01-realtime/signaling.js +20 -0
- package/dist/s01-realtime/signaling.js.map +1 -0
- package/dist/s01-realtime/types.d.ts +40 -0
- package/dist/s01-realtime/types.d.ts.map +1 -0
- package/dist/s01-realtime/types.js +8 -0
- package/dist/s01-realtime/types.js.map +1 -0
- package/dist/s02-crdt/index.d.ts +3 -0
- package/dist/s02-crdt/index.d.ts.map +1 -0
- package/dist/s02-crdt/index.js +2 -0
- package/dist/s02-crdt/index.js.map +1 -0
- package/dist/s02-crdt/types.d.ts +45 -0
- package/dist/s02-crdt/types.d.ts.map +1 -0
- package/dist/s02-crdt/types.js +10 -0
- package/dist/s02-crdt/types.js.map +1 -0
- package/dist/s02-crdt/yjs.d.ts +9 -0
- package/dist/s02-crdt/yjs.d.ts.map +1 -0
- package/dist/s02-crdt/yjs.js +67 -0
- package/dist/s02-crdt/yjs.js.map +1 -0
- package/dist/s03-streaming/index.d.ts +3 -0
- package/dist/s03-streaming/index.d.ts.map +1 -0
- package/dist/s03-streaming/index.js +2 -0
- package/dist/s03-streaming/index.js.map +1 -0
- package/dist/s03-streaming/playlist.d.ts +8 -0
- package/dist/s03-streaming/playlist.d.ts.map +1 -0
- package/dist/s03-streaming/playlist.js +49 -0
- package/dist/s03-streaming/playlist.js.map +1 -0
- package/dist/s03-streaming/types.d.ts +69 -0
- package/dist/s03-streaming/types.d.ts.map +1 -0
- package/dist/s03-streaming/types.js +8 -0
- package/dist/s03-streaming/types.js.map +1 -0
- package/dist/s04-messaging/index.d.ts +3 -0
- package/dist/s04-messaging/index.d.ts.map +1 -0
- package/dist/s04-messaging/index.js +2 -0
- package/dist/s04-messaging/index.js.map +1 -0
- package/dist/s04-messaging/serializer.d.ts +11 -0
- package/dist/s04-messaging/serializer.d.ts.map +1 -0
- package/dist/s04-messaging/serializer.js +45 -0
- package/dist/s04-messaging/serializer.js.map +1 -0
- package/dist/s04-messaging/types.d.ts +54 -0
- package/dist/s04-messaging/types.d.ts.map +1 -0
- package/dist/s04-messaging/types.js +8 -0
- package/dist/s04-messaging/types.js.map +1 -0
- package/dist/s05-rendering/index.d.ts +3 -0
- package/dist/s05-rendering/index.d.ts.map +1 -0
- package/dist/s05-rendering/index.js +3 -0
- package/dist/s05-rendering/index.js.map +1 -0
- package/dist/s05-rendering/state-machine.d.ts +20 -0
- package/dist/s05-rendering/state-machine.d.ts.map +1 -0
- package/dist/s05-rendering/state-machine.js +47 -0
- package/dist/s05-rendering/state-machine.js.map +1 -0
- package/dist/s05-rendering/types.d.ts +13 -0
- package/dist/s05-rendering/types.d.ts.map +1 -0
- package/dist/s05-rendering/types.js +16 -0
- package/dist/s05-rendering/types.js.map +1 -0
- package/dist/s06-payments/billing.d.ts +9 -0
- package/dist/s06-payments/billing.d.ts.map +1 -0
- package/dist/s06-payments/billing.js +79 -0
- package/dist/s06-payments/billing.js.map +1 -0
- package/dist/s06-payments/index.d.ts +4 -0
- package/dist/s06-payments/index.d.ts.map +1 -0
- package/dist/s06-payments/index.js +3 -0
- package/dist/s06-payments/index.js.map +1 -0
- package/dist/s06-payments/stripe.d.ts +52 -0
- package/dist/s06-payments/stripe.d.ts.map +1 -0
- package/dist/s06-payments/stripe.js +103 -0
- package/dist/s06-payments/stripe.js.map +1 -0
- package/dist/s06-payments/types.d.ts +80 -0
- package/dist/s06-payments/types.d.ts.map +1 -0
- package/dist/s06-payments/types.js +13 -0
- package/dist/s06-payments/types.js.map +1 -0
- package/dist/s07-identity/index.d.ts +2 -0
- package/dist/s07-identity/index.d.ts.map +1 -0
- package/dist/s07-identity/index.js +2 -0
- package/dist/s07-identity/index.js.map +1 -0
- package/dist/s07-identity/session.d.ts +53 -0
- package/dist/s07-identity/session.d.ts.map +1 -0
- package/dist/s07-identity/session.js +114 -0
- package/dist/s07-identity/session.js.map +1 -0
- package/dist/s08-containers/docker.d.ts +39 -0
- package/dist/s08-containers/docker.d.ts.map +1 -0
- package/dist/s08-containers/docker.js +72 -0
- package/dist/s08-containers/docker.js.map +1 -0
- package/dist/s08-containers/index.d.ts +4 -0
- package/dist/s08-containers/index.d.ts.map +1 -0
- package/dist/s08-containers/index.js +3 -0
- package/dist/s08-containers/index.js.map +1 -0
- package/dist/s08-containers/sandbox.d.ts +10 -0
- package/dist/s08-containers/sandbox.d.ts.map +1 -0
- package/dist/s08-containers/sandbox.js +68 -0
- package/dist/s08-containers/sandbox.js.map +1 -0
- package/dist/s08-containers/types.d.ts +66 -0
- package/dist/s08-containers/types.d.ts.map +1 -0
- package/dist/s08-containers/types.js +8 -0
- package/dist/s08-containers/types.js.map +1 -0
- package/dist/s09-persistence/cold.d.ts +43 -0
- package/dist/s09-persistence/cold.d.ts.map +1 -0
- package/dist/s09-persistence/cold.js +135 -0
- package/dist/s09-persistence/cold.js.map +1 -0
- package/dist/s09-persistence/hot.d.ts +32 -0
- package/dist/s09-persistence/hot.d.ts.map +1 -0
- package/dist/s09-persistence/hot.js +63 -0
- package/dist/s09-persistence/hot.js.map +1 -0
- package/dist/s09-persistence/index.d.ts +6 -0
- package/dist/s09-persistence/index.d.ts.map +1 -0
- package/dist/s09-persistence/index.js +6 -0
- package/dist/s09-persistence/index.js.map +1 -0
- package/dist/s09-persistence/pg-warm.d.ts +30 -0
- package/dist/s09-persistence/pg-warm.d.ts.map +1 -0
- package/dist/s09-persistence/pg-warm.js +139 -0
- package/dist/s09-persistence/pg-warm.js.map +1 -0
- package/dist/s09-persistence/s3-cold.d.ts +39 -0
- package/dist/s09-persistence/s3-cold.d.ts.map +1 -0
- package/dist/s09-persistence/s3-cold.js +102 -0
- package/dist/s09-persistence/s3-cold.js.map +1 -0
- package/dist/s09-persistence/warm.d.ts +33 -0
- package/dist/s09-persistence/warm.d.ts.map +1 -0
- package/dist/s09-persistence/warm.js +169 -0
- package/dist/s09-persistence/warm.js.map +1 -0
- package/dist/s10-inference/action.d.ts +39 -0
- package/dist/s10-inference/action.d.ts.map +1 -0
- package/dist/s10-inference/action.js +73 -0
- package/dist/s10-inference/action.js.map +1 -0
- package/dist/s10-inference/agents/index.d.ts +3 -0
- package/dist/s10-inference/agents/index.d.ts.map +1 -0
- package/dist/s10-inference/agents/index.js +3 -0
- package/dist/s10-inference/agents/index.js.map +1 -0
- package/dist/s10-inference/agents/mirror.d.ts +73 -0
- package/dist/s10-inference/agents/mirror.d.ts.map +1 -0
- package/dist/s10-inference/agents/mirror.js +106 -0
- package/dist/s10-inference/agents/mirror.js.map +1 -0
- package/dist/s10-inference/agents/registry.d.ts +64 -0
- package/dist/s10-inference/agents/registry.d.ts.map +1 -0
- package/dist/s10-inference/agents/registry.js +92 -0
- package/dist/s10-inference/agents/registry.js.map +1 -0
- package/dist/s10-inference/context.d.ts +39 -0
- package/dist/s10-inference/context.d.ts.map +1 -0
- package/dist/s10-inference/context.js +36 -0
- package/dist/s10-inference/context.js.map +1 -0
- package/dist/s10-inference/index.d.ts +7 -0
- package/dist/s10-inference/index.d.ts.map +1 -0
- package/dist/s10-inference/index.js +6 -0
- package/dist/s10-inference/index.js.map +1 -0
- package/dist/s10-inference/loop.d.ts +42 -0
- package/dist/s10-inference/loop.d.ts.map +1 -0
- package/dist/s10-inference/loop.js +104 -0
- package/dist/s10-inference/loop.js.map +1 -0
- package/dist/s10-inference/provider.d.ts +43 -0
- package/dist/s10-inference/provider.d.ts.map +1 -0
- package/dist/s10-inference/provider.js +9 -0
- package/dist/s10-inference/provider.js.map +1 -0
- package/dist/s10-inference/providers/anthropic.d.ts +13 -0
- package/dist/s10-inference/providers/anthropic.d.ts.map +1 -0
- package/dist/s10-inference/providers/anthropic.js +168 -0
- package/dist/s10-inference/providers/anthropic.js.map +1 -0
- package/dist/s10-inference/providers/ollama.d.ts +9 -0
- package/dist/s10-inference/providers/ollama.d.ts.map +1 -0
- package/dist/s10-inference/providers/ollama.js +102 -0
- package/dist/s10-inference/providers/ollama.js.map +1 -0
- package/dist/s10-inference/providers/openai.d.ts +14 -0
- package/dist/s10-inference/providers/openai.d.ts.map +1 -0
- package/dist/s10-inference/providers/openai.js +172 -0
- package/dist/s10-inference/providers/openai.js.map +1 -0
- package/dist/s11-transport/index.d.ts +4 -0
- package/dist/s11-transport/index.d.ts.map +1 -0
- package/dist/s11-transport/index.js +4 -0
- package/dist/s11-transport/index.js.map +1 -0
- package/dist/s11-transport/room.d.ts +28 -0
- package/dist/s11-transport/room.d.ts.map +1 -0
- package/dist/s11-transport/room.js +69 -0
- package/dist/s11-transport/room.js.map +1 -0
- package/dist/s11-transport/transport.d.ts +20 -0
- package/dist/s11-transport/transport.d.ts.map +1 -0
- package/dist/s11-transport/transport.js +39 -0
- package/dist/s11-transport/transport.js.map +1 -0
- package/dist/s11-transport/ws.d.ts +15 -0
- package/dist/s11-transport/ws.d.ts.map +1 -0
- package/dist/s11-transport/ws.js +71 -0
- package/dist/s11-transport/ws.js.map +1 -0
- package/dist/s12-versioncontrol/index.d.ts +4 -0
- package/dist/s12-versioncontrol/index.d.ts.map +1 -0
- package/dist/s12-versioncontrol/index.js +3 -0
- package/dist/s12-versioncontrol/index.js.map +1 -0
- package/dist/s12-versioncontrol/ledger-dag.d.ts +25 -0
- package/dist/s12-versioncontrol/ledger-dag.d.ts.map +1 -0
- package/dist/s12-versioncontrol/ledger-dag.js +84 -0
- package/dist/s12-versioncontrol/ledger-dag.js.map +1 -0
- package/dist/s12-versioncontrol/merkle.d.ts +16 -0
- package/dist/s12-versioncontrol/merkle.d.ts.map +1 -0
- package/dist/s12-versioncontrol/merkle.js +81 -0
- package/dist/s12-versioncontrol/merkle.js.map +1 -0
- package/dist/s12-versioncontrol/types.d.ts +50 -0
- package/dist/s12-versioncontrol/types.d.ts.map +1 -0
- package/dist/s12-versioncontrol/types.js +8 -0
- package/dist/s12-versioncontrol/types.js.map +1 -0
- package/dist/touches/audio-tap.d.ts +32 -0
- package/dist/touches/audio-tap.d.ts.map +1 -0
- package/dist/touches/audio-tap.js +54 -0
- package/dist/touches/audio-tap.js.map +1 -0
- package/dist/touches/avatar-state.d.ts +22 -0
- package/dist/touches/avatar-state.d.ts.map +1 -0
- package/dist/touches/avatar-state.js +35 -0
- package/dist/touches/avatar-state.js.map +1 -0
- package/dist/touches/container-room.d.ts +17 -0
- package/dist/touches/container-room.d.ts.map +1 -0
- package/dist/touches/container-room.js +34 -0
- package/dist/touches/container-room.js.map +1 -0
- package/dist/touches/cost-billing.d.ts +20 -0
- package/dist/touches/cost-billing.d.ts.map +1 -0
- package/dist/touches/cost-billing.js +26 -0
- package/dist/touches/cost-billing.js.map +1 -0
- package/dist/touches/cost-track.d.ts +19 -0
- package/dist/touches/cost-track.d.ts.map +1 -0
- package/dist/touches/cost-track.js +20 -0
- package/dist/touches/cost-track.js.map +1 -0
- package/dist/touches/crdt-sync.d.ts +14 -0
- package/dist/touches/crdt-sync.d.ts.map +1 -0
- package/dist/touches/crdt-sync.js +49 -0
- package/dist/touches/crdt-sync.js.map +1 -0
- package/dist/touches/identity-gate.d.ts +22 -0
- package/dist/touches/identity-gate.d.ts.map +1 -0
- package/dist/touches/identity-gate.js +24 -0
- package/dist/touches/identity-gate.js.map +1 -0
- package/dist/touches/index.d.ts +14 -0
- package/dist/touches/index.d.ts.map +1 -0
- package/dist/touches/index.js +14 -0
- package/dist/touches/index.js.map +1 -0
- package/dist/touches/memory-persist.d.ts +29 -0
- package/dist/touches/memory-persist.d.ts.map +1 -0
- package/dist/touches/memory-persist.js +49 -0
- package/dist/touches/memory-persist.js.map +1 -0
- package/dist/touches/messenger-bridge.d.ts +19 -0
- package/dist/touches/messenger-bridge.d.ts.map +1 -0
- package/dist/touches/messenger-bridge.js +49 -0
- package/dist/touches/messenger-bridge.js.map +1 -0
- package/dist/touches/sentiment-tap.d.ts +43 -0
- package/dist/touches/sentiment-tap.d.ts.map +1 -0
- package/dist/touches/sentiment-tap.js +81 -0
- package/dist/touches/sentiment-tap.js.map +1 -0
- package/dist/touches/stichwort.d.ts +46 -0
- package/dist/touches/stichwort.d.ts.map +1 -0
- package/dist/touches/stichwort.js +64 -0
- package/dist/touches/stichwort.js.map +1 -0
- package/dist/touches/transport-signal.d.ts +26 -0
- package/dist/touches/transport-signal.d.ts.map +1 -0
- package/dist/touches/transport-signal.js +49 -0
- package/dist/touches/transport-signal.js.map +1 -0
- package/dist/touches/version-persist.d.ts +18 -0
- package/dist/touches/version-persist.d.ts.map +1 -0
- package/dist/touches/version-persist.js +38 -0
- package/dist/touches/version-persist.js.map +1 -0
- package/dist/types.d.ts +61 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- package/package.json +117 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S2 ↔ S11
|
|
3
|
+
*
|
|
4
|
+
* CRDT-Updates als Transport-Events. Bidirektional:
|
|
5
|
+
* Lokale Änderung → Update als Event → Transport → Remote Doc
|
|
6
|
+
* Remote Event → Update → lokales Doc
|
|
7
|
+
*/
|
|
8
|
+
import type { SharedDoc } from '../s02-crdt/types.js';
|
|
9
|
+
import type { Transport } from '../s11-transport/transport.js';
|
|
10
|
+
/** Verbindet ein SharedDoc mit einem Transport — bidirektional */
|
|
11
|
+
export declare function syncDocToTransport(doc: SharedDoc, transport: Transport, peerId: string): () => void;
|
|
12
|
+
/** Einmal-Sync: Vollständigen State senden */
|
|
13
|
+
export declare function sendFullState(doc: SharedDoc, transport: Transport, peerId: string): void;
|
|
14
|
+
//# sourceMappingURL=crdt-sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crdt-sync.d.ts","sourceRoot":"","sources":["../../src/touches/crdt-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,sBAAsB,CAAA;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAI9D,kEAAkE;AAClE,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,MAAM,IAAI,CA6BZ;AAED,8CAA8C;AAC9C,wBAAgB,aAAa,CAC3B,GAAG,EAAE,SAAS,EACd,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,GACb,IAAI,CAQN"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S2 ↔ S11
|
|
3
|
+
*
|
|
4
|
+
* CRDT-Updates als Transport-Events. Bidirektional:
|
|
5
|
+
* Lokale Änderung → Update als Event → Transport → Remote Doc
|
|
6
|
+
* Remote Event → Update → lokales Doc
|
|
7
|
+
*/
|
|
8
|
+
const CRDT_EVENT_TYPE = 'crdt:update';
|
|
9
|
+
/** Verbindet ein SharedDoc mit einem Transport — bidirektional */
|
|
10
|
+
export function syncDocToTransport(doc, transport, peerId) {
|
|
11
|
+
// Lokale Änderungen → Transport
|
|
12
|
+
const unsubDoc = doc.onChange((update) => {
|
|
13
|
+
const event = {
|
|
14
|
+
type: CRDT_EVENT_TYPE,
|
|
15
|
+
source: peerId,
|
|
16
|
+
payload: { update: Array.from(update) },
|
|
17
|
+
ts: Date.now(),
|
|
18
|
+
};
|
|
19
|
+
transport.send(event);
|
|
20
|
+
});
|
|
21
|
+
// Remote Events → lokales Doc
|
|
22
|
+
let running = true;
|
|
23
|
+
const consume = async () => {
|
|
24
|
+
for await (const event of transport.receive()) {
|
|
25
|
+
if (!running)
|
|
26
|
+
break;
|
|
27
|
+
if (event.type === CRDT_EVENT_TYPE && event.source !== peerId) {
|
|
28
|
+
const payload = event.payload;
|
|
29
|
+
doc.applyUpdate(new Uint8Array(payload.update));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
void consume();
|
|
34
|
+
return () => {
|
|
35
|
+
running = false;
|
|
36
|
+
unsubDoc();
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/** Einmal-Sync: Vollständigen State senden */
|
|
40
|
+
export function sendFullState(doc, transport, peerId) {
|
|
41
|
+
const state = doc.getState();
|
|
42
|
+
transport.send({
|
|
43
|
+
type: 'crdt:full-state',
|
|
44
|
+
source: peerId,
|
|
45
|
+
payload: { update: Array.from(state) },
|
|
46
|
+
ts: Date.now(),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=crdt-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crdt-sync.js","sourceRoot":"","sources":["../../src/touches/crdt-sync.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,eAAe,GAAG,aAAa,CAAA;AAErC,kEAAkE;AAClE,MAAM,UAAU,kBAAkB,CAChC,GAAc,EACd,SAAoB,EACpB,MAAc;IAEd,gCAAgC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE;QACvC,MAAM,KAAK,GAAgC;YACzC,IAAI,EAAE,eAAe;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;YACvC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;SACf,CAAA;QACD,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,8BAA8B;IAC9B,IAAI,OAAO,GAAG,IAAI,CAAA;IAClB,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO;gBAAE,MAAK;YACnB,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC9D,MAAM,OAAO,GAAG,KAAK,CAAC,OAA+B,CAAA;gBACrD,GAAG,CAAC,WAAW,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;YACjD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IACD,KAAK,OAAO,EAAE,CAAA;IAEd,OAAO,GAAG,EAAE;QACV,OAAO,GAAG,KAAK,CAAA;QACf,QAAQ,EAAE,CAAA;IACZ,CAAC,CAAA;AACH,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,aAAa,CAC3B,GAAc,EACd,SAAoB,EACpB,MAAc;IAEd,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;IAC5B,SAAS,CAAC,IAAI,CAAC;QACb,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACtC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;KACf,CAAC,CAAA;AACJ,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S7 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Consent-Scopes werden zu Action-Permissions.
|
|
5
|
+
* observe = deny (darf nur beobachten)
|
|
6
|
+
* assist = ask (darf vorschlagen, Host muss freigeben)
|
|
7
|
+
* act = allow (darf autonom handeln)
|
|
8
|
+
*
|
|
9
|
+
* Das ist die Brücke zwischen Identity (S7) und Inference (S10).
|
|
10
|
+
*/
|
|
11
|
+
import type { GateDecision } from '../s10-inference/action.js';
|
|
12
|
+
import type { ConsentLevel, Identity, Session } from '../s07-identity/session.js';
|
|
13
|
+
/**
|
|
14
|
+
* Mappt eine Consent-Feature-Prüfung auf eine Action Gate-Decision.
|
|
15
|
+
* Jede Action deklariert welches Feature und welches Level sie braucht.
|
|
16
|
+
*/
|
|
17
|
+
export type ActionConsent = {
|
|
18
|
+
feature: string;
|
|
19
|
+
required: ConsentLevel;
|
|
20
|
+
};
|
|
21
|
+
export declare function consentToGate(identity: Identity, session: Session, consent: ActionConsent): GateDecision;
|
|
22
|
+
//# sourceMappingURL=identity-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-gate.d.ts","sourceRoot":"","sources":["../../src/touches/identity-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEjF;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,YAAY,CAAA;CACvB,CAAA;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,aAAa,GACrB,YAAY,CAYd"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S7 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Consent-Scopes werden zu Action-Permissions.
|
|
5
|
+
* observe = deny (darf nur beobachten)
|
|
6
|
+
* assist = ask (darf vorschlagen, Host muss freigeben)
|
|
7
|
+
* act = allow (darf autonom handeln)
|
|
8
|
+
*
|
|
9
|
+
* Das ist die Brücke zwischen Identity (S7) und Inference (S10).
|
|
10
|
+
*/
|
|
11
|
+
export function consentToGate(identity, session, consent) {
|
|
12
|
+
const result = identity.checkConsent(session, consent.feature, consent.required);
|
|
13
|
+
if (!result.ok)
|
|
14
|
+
return 'deny';
|
|
15
|
+
// Consent granted — aber WELCHE Gate-Decision?
|
|
16
|
+
const scope = session.scopes.find(s => s.feature === consent.feature);
|
|
17
|
+
switch (scope?.level) {
|
|
18
|
+
case 'act': return 'allow';
|
|
19
|
+
case 'assist': return 'ask';
|
|
20
|
+
case 'observe': return 'deny';
|
|
21
|
+
default: return 'deny';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=identity-gate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"identity-gate.js","sourceRoot":"","sources":["../../src/touches/identity-gate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAcH,MAAM,UAAU,aAAa,CAC3B,QAAkB,EAClB,OAAgB,EAChB,OAAsB;IAEtB,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;IAChF,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,OAAO,MAAM,CAAA;IAE7B,+CAA+C;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;IACrE,QAAQ,KAAK,EAAE,KAAK,EAAE,CAAC;QACrB,KAAK,KAAK,CAAC,CAAC,OAAO,OAAO,CAAA;QAC1B,KAAK,QAAQ,CAAC,CAAC,OAAO,KAAK,CAAA;QAC3B,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,CAAA;QAC7B,OAAO,CAAC,CAAC,OAAO,MAAM,CAAA;IACxB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { type AudioTap, type AudioTapConfig, type TranscriptChunk, createAudioTap } from './audio-tap.js';
|
|
2
|
+
export { type ActionConsent, consentToGate } from './identity-gate.js';
|
|
3
|
+
export { type MemoryStack, createMemoryStack } from './memory-persist.js';
|
|
4
|
+
export { type CostTrackHook, createCostTrackHook } from './cost-track.js';
|
|
5
|
+
export { type DetectedKeyword, type StichwortConfig, type WakeState, detect, checkWake, pipeline } from './stichwort.js';
|
|
6
|
+
export { isValidSignalingMessage, eventToSignaling, signalingToEvent, enforceSource } from './transport-signal.js';
|
|
7
|
+
export { syncDocToTransport, sendFullState } from './crdt-sync.js';
|
|
8
|
+
export { buildBriefingPrompt, parseBriefingResponse } from './messenger-bridge.js';
|
|
9
|
+
export { loopResultToAvatarEvent, stateToGesture, AVATAR_TRANSITIONS } from './avatar-state.js';
|
|
10
|
+
export { buildSessionMerkleTree, persistDAGSnapshot } from './version-persist.js';
|
|
11
|
+
export { consentToTier, syncLedgerToBilling } from './cost-billing.js';
|
|
12
|
+
export { type Emotion, type SentimentScore, type DynamicsSnapshot, type SentimentAnalyzer, sentimentToEntry, computeDynamics, suggestNudge } from './sentiment-tap.js';
|
|
13
|
+
export { type RoomContainer, createRoomContainer, destroyRoomContainer } from './container-room.js';
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/touches/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzG,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAE,KAAK,aAAa,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACxH,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtK,OAAO,EAAE,KAAK,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export { createAudioTap } from './audio-tap.js';
|
|
2
|
+
export { consentToGate } from './identity-gate.js';
|
|
3
|
+
export { createMemoryStack } from './memory-persist.js';
|
|
4
|
+
export { createCostTrackHook } from './cost-track.js';
|
|
5
|
+
export { detect, checkWake, pipeline } from './stichwort.js';
|
|
6
|
+
export { isValidSignalingMessage, eventToSignaling, signalingToEvent, enforceSource } from './transport-signal.js';
|
|
7
|
+
export { syncDocToTransport, sendFullState } from './crdt-sync.js';
|
|
8
|
+
export { buildBriefingPrompt, parseBriefingResponse } from './messenger-bridge.js';
|
|
9
|
+
export { loopResultToAvatarEvent, stateToGesture, AVATAR_TRANSITIONS } from './avatar-state.js';
|
|
10
|
+
export { buildSessionMerkleTree, persistDAGSnapshot } from './version-persist.js';
|
|
11
|
+
export { consentToTier, syncLedgerToBilling } from './cost-billing.js';
|
|
12
|
+
export { sentimentToEntry, computeDynamics, suggestNudge } from './sentiment-tap.js';
|
|
13
|
+
export { createRoomContainer, destroyRoomContainer } from './container-room.js';
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/touches/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4D,cAAc,EAAE,MAAM,gBAAgB,CAAA;AACzG,OAAO,EAAsB,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACtE,OAAO,EAAoB,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACzE,OAAO,EAAsB,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACzE,OAAO,EAA8D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACxH,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAClH,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAClE,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAA;AAClF,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACjF,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAoF,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACtK,OAAO,EAAsB,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S9 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Drei-Tier Memory als eine Einheit:
|
|
5
|
+
* HOT (In-Session) → compact() → WARM (SQLite) → flushToCold() → COLD (Storage)
|
|
6
|
+
*
|
|
7
|
+
* maintain() prüft HOT-Budget, kompaktiert bei Überschreitung.
|
|
8
|
+
* flushToCold() archiviert am Session-Ende.
|
|
9
|
+
*/
|
|
10
|
+
import type { HotMemory } from '../s09-persistence/hot.js';
|
|
11
|
+
import type { WarmMemory } from '../s09-persistence/warm.js';
|
|
12
|
+
import type { ColdMemory } from '../s09-persistence/cold.js';
|
|
13
|
+
export type MemoryStack = {
|
|
14
|
+
hot: HotMemory;
|
|
15
|
+
warm: WarmMemory;
|
|
16
|
+
cold?: ColdMemory;
|
|
17
|
+
/** Prüft ob HOT kompaktiert werden muss und führt Flush zu WARM aus */
|
|
18
|
+
maintain(budget: number): Promise<{
|
|
19
|
+
compacted: boolean;
|
|
20
|
+
summary?: string;
|
|
21
|
+
}>;
|
|
22
|
+
/** Session-Ende: HOT flushen + Snapshot in COLD archivieren */
|
|
23
|
+
flushToCold(sessionId: string): Promise<{
|
|
24
|
+
entriesFlushed: number;
|
|
25
|
+
artifactStored: boolean;
|
|
26
|
+
}>;
|
|
27
|
+
};
|
|
28
|
+
export declare function createMemoryStack(hot: HotMemory, warm: WarmMemory, cold?: ColdMemory): MemoryStack;
|
|
29
|
+
//# sourceMappingURL=memory-persist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-persist.d.ts","sourceRoot":"","sources":["../../src/touches/memory-persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAE5D,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,SAAS,CAAA;IACd,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,uEAAuE;IACvE,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC3E,+DAA+D;IAC/D,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAC7F,CAAA;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,UAAU,GAAG,WAAW,CA2ClG"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S9 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Drei-Tier Memory als eine Einheit:
|
|
5
|
+
* HOT (In-Session) → compact() → WARM (SQLite) → flushToCold() → COLD (Storage)
|
|
6
|
+
*
|
|
7
|
+
* maintain() prüft HOT-Budget, kompaktiert bei Überschreitung.
|
|
8
|
+
* flushToCold() archiviert am Session-Ende.
|
|
9
|
+
*/
|
|
10
|
+
export function createMemoryStack(hot, warm, cold) {
|
|
11
|
+
return {
|
|
12
|
+
hot,
|
|
13
|
+
warm,
|
|
14
|
+
cold,
|
|
15
|
+
async maintain(budget) {
|
|
16
|
+
if (hot.estimateTokens() <= budget) {
|
|
17
|
+
return { compacted: false };
|
|
18
|
+
}
|
|
19
|
+
const { summary, flushed } = await hot.compact();
|
|
20
|
+
if (flushed.length > 0) {
|
|
21
|
+
await warm.store(flushed);
|
|
22
|
+
}
|
|
23
|
+
return { compacted: true, summary };
|
|
24
|
+
},
|
|
25
|
+
async flushToCold(sessionId) {
|
|
26
|
+
// Alle verbleibenden HOT-Entries → WARM
|
|
27
|
+
const remaining = [...hot.entries()];
|
|
28
|
+
if (remaining.length > 0) {
|
|
29
|
+
await warm.store(remaining);
|
|
30
|
+
}
|
|
31
|
+
// Snapshot → COLD (wenn vorhanden)
|
|
32
|
+
let artifactStored = false;
|
|
33
|
+
if (cold) {
|
|
34
|
+
const snapshot = hot.getSnapshot();
|
|
35
|
+
if (snapshot) {
|
|
36
|
+
const result = await cold.store(sessionId, snapshot, {
|
|
37
|
+
type: 'transcript',
|
|
38
|
+
source: 'memory-stack-flush',
|
|
39
|
+
entryCount: remaining.length,
|
|
40
|
+
});
|
|
41
|
+
artifactStored = result.ok;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
hot.clear();
|
|
45
|
+
return { entriesFlushed: remaining.length, artifactStored };
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=memory-persist.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory-persist.js","sourceRoot":"","sources":["../../src/touches/memory-persist.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAgBH,MAAM,UAAU,iBAAiB,CAAC,GAAc,EAAE,IAAgB,EAAE,IAAiB;IACnF,OAAO;QACL,GAAG;QACH,IAAI;QACJ,IAAI;QAEJ,KAAK,CAAC,QAAQ,CAAC,MAAM;YACnB,IAAI,GAAG,CAAC,cAAc,EAAE,IAAI,MAAM,EAAE,CAAC;gBACnC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAA;YAC7B,CAAC;YAED,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAA;YAChD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC3B,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;QACrC,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,SAAS;YACzB,wCAAwC;YACxC,MAAM,SAAS,GAAG,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAA;YACpC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YAC7B,CAAC;YAED,mCAAmC;YACnC,IAAI,cAAc,GAAG,KAAK,CAAA;YAC1B,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;gBAClC,IAAI,QAAQ,EAAE,CAAC;oBACb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE;wBACnD,IAAI,EAAE,YAAY;wBAClB,MAAM,EAAE,oBAAoB;wBAC5B,UAAU,EAAE,SAAS,CAAC,MAAM;qBAC7B,CAAC,CAAA;oBACF,cAAc,GAAG,MAAM,CAAC,EAAE,CAAA;gBAC5B,CAAC;YACH,CAAC;YAED,GAAG,CAAC,KAAK,EAAE,CAAA;YACX,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAC7D,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S4 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Briefing-Generierung über den Inference Loop.
|
|
5
|
+
* Input: Session-Entries → Loop generiert BriefingContent → Channel sendet.
|
|
6
|
+
*/
|
|
7
|
+
import type { Entry } from '../types.js';
|
|
8
|
+
import type { BriefingContent } from '../s04-messaging/types.js';
|
|
9
|
+
/**
|
|
10
|
+
* Baut einen LLM-Prompt aus Entries für Briefing-Generierung.
|
|
11
|
+
* Der Caller führt den Prompt über seinen Provider/Loop aus.
|
|
12
|
+
*/
|
|
13
|
+
export declare function buildBriefingPrompt(entries: readonly Entry[], sessionId: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Parsed die LLM-Antwort zu BriefingContent.
|
|
16
|
+
* Tolerant gegenüber Format-Variationen.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseBriefingResponse(text: string): BriefingContent | null;
|
|
19
|
+
//# sourceMappingURL=messenger-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger-bridge.d.ts","sourceRoot":"","sources":["../../src/touches/messenger-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAA;AAEhE;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAexF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAiB1E"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S4 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Briefing-Generierung über den Inference Loop.
|
|
5
|
+
* Input: Session-Entries → Loop generiert BriefingContent → Channel sendet.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Baut einen LLM-Prompt aus Entries für Briefing-Generierung.
|
|
9
|
+
* Der Caller führt den Prompt über seinen Provider/Loop aus.
|
|
10
|
+
*/
|
|
11
|
+
export function buildBriefingPrompt(entries, sessionId) {
|
|
12
|
+
const facts = entries
|
|
13
|
+
.map(e => {
|
|
14
|
+
const prefix = e.category ? `[${e.category}]` : '';
|
|
15
|
+
return `${prefix} ${e.source}: ${e.text}`;
|
|
16
|
+
})
|
|
17
|
+
.join('\n');
|
|
18
|
+
return [
|
|
19
|
+
`Fasse die folgende Meeting-Session (${sessionId}) zusammen.`,
|
|
20
|
+
'Antworte als JSON mit: headline, decisions[], actionItems[], conflicts[], nextSteps[].',
|
|
21
|
+
'Nur Fakten. Nichts erfinden. Wenn etwas unklar ist, weglassen.',
|
|
22
|
+
'',
|
|
23
|
+
facts,
|
|
24
|
+
].join('\n');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Parsed die LLM-Antwort zu BriefingContent.
|
|
28
|
+
* Tolerant gegenüber Format-Variationen.
|
|
29
|
+
*/
|
|
30
|
+
export function parseBriefingResponse(text) {
|
|
31
|
+
try {
|
|
32
|
+
// Versuche JSON aus der Antwort zu extrahieren
|
|
33
|
+
const jsonMatch = text.match(/\{[\s\S]*\}/);
|
|
34
|
+
if (!jsonMatch)
|
|
35
|
+
return null;
|
|
36
|
+
const parsed = JSON.parse(jsonMatch[0]);
|
|
37
|
+
return {
|
|
38
|
+
headline: parsed.headline ?? 'Meeting Summary',
|
|
39
|
+
decisions: Array.isArray(parsed.decisions) ? parsed.decisions : [],
|
|
40
|
+
actionItems: Array.isArray(parsed.actionItems) ? parsed.actionItems : [],
|
|
41
|
+
conflicts: Array.isArray(parsed.conflicts) ? parsed.conflicts : undefined,
|
|
42
|
+
nextSteps: Array.isArray(parsed.nextSteps) ? parsed.nextSteps : undefined,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=messenger-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messenger-bridge.js","sourceRoot":"","sources":["../../src/touches/messenger-bridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAyB,EAAE,SAAiB;IAC9E,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE;QACP,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;QAClD,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAC3C,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;QACL,uCAAuC,SAAS,aAAa;QAC7D,wFAAwF;QACxF,gEAAgE;QAChE,EAAE;QACF,KAAK;KACN,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC;QACH,+CAA+C;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;QAC3C,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAA;QAE3B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAA4B,CAAA;QAClE,OAAO;YACL,QAAQ,EAAG,MAAM,CAAC,QAAmB,IAAI,iBAAiB;YAC1D,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAqB,CAAC,CAAC,CAAC,EAAE;YAC9E,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,WAAuB,CAAC,CAAC,CAAC,EAAE;YACpF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAqB,CAAC,CAAC,CAAC,SAAS;YACrF,SAAS,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAqB,CAAC,CAAC,CAAC,SAAS;SACtF,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10 — Sentiment Analysis
|
|
3
|
+
*
|
|
4
|
+
* Wie audio-tap, aber statt Text-Transcript liefert es Sentiment-Scores.
|
|
5
|
+
* Audio-Features (Tonhöhe, Sprechgeschwindigkeit, Pausen) → Emotion.
|
|
6
|
+
*
|
|
7
|
+
* Interface first — Sentiment-Inference kann LLM-Prompt oder spezialisiertes Modell sein.
|
|
8
|
+
*/
|
|
9
|
+
import type { TranscriptChunk } from './audio-tap.js';
|
|
10
|
+
import type { Entry } from '../types.js';
|
|
11
|
+
export type Emotion = 'neutral' | 'positive' | 'negative' | 'tense' | 'excited' | 'frustrated' | (string & {});
|
|
12
|
+
export type SentimentScore = {
|
|
13
|
+
speakerId: string;
|
|
14
|
+
emotion: Emotion;
|
|
15
|
+
valence: number;
|
|
16
|
+
arousal: number;
|
|
17
|
+
confidence: number;
|
|
18
|
+
ts: number;
|
|
19
|
+
};
|
|
20
|
+
export type DynamicsSnapshot = {
|
|
21
|
+
ts: number;
|
|
22
|
+
/** Sprechanteil pro Teilnehmer (0-1) */
|
|
23
|
+
speakingShare: Map<string, number>;
|
|
24
|
+
/** Wer dominiert? (höchster Sprechanteil) */
|
|
25
|
+
dominantSpeaker?: string;
|
|
26
|
+
/** Wer wurde übergangen? (niedrigster Sprechanteil, > 0 Beiträge) */
|
|
27
|
+
quietestSpeaker?: string;
|
|
28
|
+
/** Durchschnittliches Sentiment */
|
|
29
|
+
avgValence: number;
|
|
30
|
+
/** Gesamte Spannung */
|
|
31
|
+
avgArousal: number;
|
|
32
|
+
};
|
|
33
|
+
/** Sentiment-Analyzer Interface — injektierbar */
|
|
34
|
+
export type SentimentAnalyzer = {
|
|
35
|
+
analyze(chunk: TranscriptChunk): Promise<SentimentScore>;
|
|
36
|
+
};
|
|
37
|
+
/** Wandelt SentimentScore in einen Entry für HOT Memory */
|
|
38
|
+
export declare function sentimentToEntry(score: SentimentScore, sessionId?: string): Entry;
|
|
39
|
+
/** Berechnet Meeting-Dynamik aus Sentiment-History */
|
|
40
|
+
export declare function computeDynamics(scores: SentimentScore[]): DynamicsSnapshot;
|
|
41
|
+
/** Nudge-Vorschlag basierend auf Dynamik */
|
|
42
|
+
export declare function suggestNudge(dynamics: DynamicsSnapshot): string | null;
|
|
43
|
+
//# sourceMappingURL=sentiment-tap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentiment-tap.d.ts","sourceRoot":"","sources":["../../src/touches/sentiment-tap.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AACrD,OAAO,KAAK,EAAE,KAAK,EAAiB,MAAM,aAAa,CAAA;AAGvD,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAE9G,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;IACV,wCAAwC;IACxC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,mCAAmC;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,uBAAuB;IACvB,UAAU,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,kDAAkD;AAClD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CAAA;CACzD,CAAA;AAED,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CASjF;AAED,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAyC1E;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,GAAG,IAAI,CAiBtE"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10 — Sentiment Analysis
|
|
3
|
+
*
|
|
4
|
+
* Wie audio-tap, aber statt Text-Transcript liefert es Sentiment-Scores.
|
|
5
|
+
* Audio-Features (Tonhöhe, Sprechgeschwindigkeit, Pausen) → Emotion.
|
|
6
|
+
*
|
|
7
|
+
* Interface first — Sentiment-Inference kann LLM-Prompt oder spezialisiertes Modell sein.
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from 'node:crypto';
|
|
10
|
+
/** Wandelt SentimentScore in einen Entry für HOT Memory */
|
|
11
|
+
export function sentimentToEntry(score, sessionId) {
|
|
12
|
+
return {
|
|
13
|
+
id: randomUUID(),
|
|
14
|
+
text: `[${score.emotion}] valence:${score.valence.toFixed(2)} arousal:${score.arousal.toFixed(2)}`,
|
|
15
|
+
source: score.speakerId,
|
|
16
|
+
category: 'context',
|
|
17
|
+
sessionId,
|
|
18
|
+
ts: score.ts,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
/** Berechnet Meeting-Dynamik aus Sentiment-History */
|
|
22
|
+
export function computeDynamics(scores) {
|
|
23
|
+
if (scores.length === 0) {
|
|
24
|
+
return {
|
|
25
|
+
ts: Date.now(),
|
|
26
|
+
speakingShare: new Map(),
|
|
27
|
+
avgValence: 0,
|
|
28
|
+
avgArousal: 0,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
// Sprechanteil berechnen
|
|
32
|
+
const speakerCounts = new Map();
|
|
33
|
+
for (const s of scores) {
|
|
34
|
+
speakerCounts.set(s.speakerId, (speakerCounts.get(s.speakerId) ?? 0) + 1);
|
|
35
|
+
}
|
|
36
|
+
const total = scores.length;
|
|
37
|
+
const speakingShare = new Map();
|
|
38
|
+
let maxShare = 0;
|
|
39
|
+
let minShare = 1;
|
|
40
|
+
let dominantSpeaker;
|
|
41
|
+
let quietestSpeaker;
|
|
42
|
+
for (const [speaker, count] of speakerCounts) {
|
|
43
|
+
const share = count / total;
|
|
44
|
+
speakingShare.set(speaker, share);
|
|
45
|
+
if (share > maxShare) {
|
|
46
|
+
maxShare = share;
|
|
47
|
+
dominantSpeaker = speaker;
|
|
48
|
+
}
|
|
49
|
+
if (share < minShare) {
|
|
50
|
+
minShare = share;
|
|
51
|
+
quietestSpeaker = speaker;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
const avgValence = scores.reduce((s, sc) => s + sc.valence, 0) / total;
|
|
55
|
+
const avgArousal = scores.reduce((s, sc) => s + sc.arousal, 0) / total;
|
|
56
|
+
return {
|
|
57
|
+
ts: Date.now(),
|
|
58
|
+
speakingShare,
|
|
59
|
+
dominantSpeaker,
|
|
60
|
+
quietestSpeaker: speakerCounts.size > 1 ? quietestSpeaker : undefined,
|
|
61
|
+
avgValence,
|
|
62
|
+
avgArousal,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Nudge-Vorschlag basierend auf Dynamik */
|
|
66
|
+
export function suggestNudge(dynamics) {
|
|
67
|
+
if (dynamics.quietestSpeaker && dynamics.speakingShare.size > 1) {
|
|
68
|
+
const share = dynamics.speakingShare.get(dynamics.quietestSpeaker) ?? 0;
|
|
69
|
+
if (share < 0.1) {
|
|
70
|
+
return `${dynamics.quietestSpeaker} hat bisher wenig beigetragen. Einbeziehen?`;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
if (dynamics.avgArousal > 0.8) {
|
|
74
|
+
return 'Hohe Anspannung im Meeting. Pause vorschlagen?';
|
|
75
|
+
}
|
|
76
|
+
if (dynamics.avgValence < -0.5) {
|
|
77
|
+
return 'Stimmung ist negativ. Thema wechseln oder Perspektive ändern?';
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sentiment-tap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sentiment-tap.js","sourceRoot":"","sources":["../../src/touches/sentiment-tap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10 — Keyword Detection
|
|
3
|
+
*
|
|
4
|
+
* Pure Function Pipeline. Kein stateful StichwortEngine.
|
|
5
|
+
* Zustand (wake window, recent context) lebt im Caller, nicht hier.
|
|
6
|
+
*
|
|
7
|
+
* TranscriptChunk[] → detect() → DetectedKeyword[]
|
|
8
|
+
*/
|
|
9
|
+
import type { TranscriptChunk } from './audio-tap.js';
|
|
10
|
+
export type DetectedKeyword = {
|
|
11
|
+
keyword: string;
|
|
12
|
+
speakerId: string;
|
|
13
|
+
context: string;
|
|
14
|
+
ts: number;
|
|
15
|
+
};
|
|
16
|
+
export type StichwortConfig = {
|
|
17
|
+
/** Erkannte Keywords. Case-insensitive. */
|
|
18
|
+
keywords: string[];
|
|
19
|
+
/** Wake Word — aktiviert intensives Listening für wakeWindowMs */
|
|
20
|
+
wakeWord?: string;
|
|
21
|
+
/** Wake Window Dauer in ms. Default: 15000 */
|
|
22
|
+
wakeWindowMs?: number;
|
|
23
|
+
};
|
|
24
|
+
export type WakeState = {
|
|
25
|
+
active: boolean;
|
|
26
|
+
activatedAt: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Erkennt Keywords in einem TranscriptChunk.
|
|
30
|
+
* Pure Function — kein State, kein Side Effect.
|
|
31
|
+
*/
|
|
32
|
+
export declare function detect(chunk: TranscriptChunk, config: StichwortConfig): DetectedKeyword[];
|
|
33
|
+
/**
|
|
34
|
+
* Prüft ob das Wake Word erkannt wurde und gibt neuen WakeState zurück.
|
|
35
|
+
* Pure Function.
|
|
36
|
+
*/
|
|
37
|
+
export declare function checkWake(chunk: TranscriptChunk, config: StichwortConfig, currentState: WakeState): WakeState;
|
|
38
|
+
/**
|
|
39
|
+
* Vollständige Pipeline: Chunk → Wake-Check → Keyword-Detection.
|
|
40
|
+
* Gibt Keywords nur zurück wenn Wake aktiv ist ODER das Wake Word selbst erkannt wird.
|
|
41
|
+
*/
|
|
42
|
+
export declare function pipeline(chunk: TranscriptChunk, config: StichwortConfig, wakeState: WakeState): {
|
|
43
|
+
keywords: DetectedKeyword[];
|
|
44
|
+
wake: WakeState;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=stichwort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stichwort.d.ts","sourceRoot":"","sources":["../../src/touches/stichwort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAA;IAClB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,OAAO,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;CACpB,CAAA;AAQD;;;GAGG;AACH,wBAAgB,MAAM,CACpB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,GACtB,eAAe,EAAE,CAiBnB;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,YAAY,EAAE,SAAS,GACtB,SAAS,CAgBX;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,SAAS,GACnB;IAAE,QAAQ,EAAE,eAAe,EAAE,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,CASlD"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10 — Keyword Detection
|
|
3
|
+
*
|
|
4
|
+
* Pure Function Pipeline. Kein stateful StichwortEngine.
|
|
5
|
+
* Zustand (wake window, recent context) lebt im Caller, nicht hier.
|
|
6
|
+
*
|
|
7
|
+
* TranscriptChunk[] → detect() → DetectedKeyword[]
|
|
8
|
+
*/
|
|
9
|
+
const DEFAULT_KEYWORDS = [
|
|
10
|
+
'sebastian', 'budget', 'deadline', 'entscheidung', 'beschluss',
|
|
11
|
+
'action item', 'aufgabe', 'recherche', 'zusammenfassung', 'frage',
|
|
12
|
+
'problem', 'risiko', 'meilenstein', 'timeline', 'quartal',
|
|
13
|
+
];
|
|
14
|
+
/**
|
|
15
|
+
* Erkennt Keywords in einem TranscriptChunk.
|
|
16
|
+
* Pure Function — kein State, kein Side Effect.
|
|
17
|
+
*/
|
|
18
|
+
export function detect(chunk, config) {
|
|
19
|
+
const text = chunk.text.toLowerCase();
|
|
20
|
+
const keywords = config.keywords.length > 0 ? config.keywords : DEFAULT_KEYWORDS;
|
|
21
|
+
const found = [];
|
|
22
|
+
for (const kw of keywords) {
|
|
23
|
+
if (text.includes(kw.toLowerCase())) {
|
|
24
|
+
found.push({
|
|
25
|
+
keyword: kw,
|
|
26
|
+
speakerId: chunk.speakerId,
|
|
27
|
+
context: chunk.text.slice(0, 200),
|
|
28
|
+
ts: chunk.startMs,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return found;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Prüft ob das Wake Word erkannt wurde und gibt neuen WakeState zurück.
|
|
36
|
+
* Pure Function.
|
|
37
|
+
*/
|
|
38
|
+
export function checkWake(chunk, config, currentState) {
|
|
39
|
+
const wakeWord = config.wakeWord ?? 'sebastian';
|
|
40
|
+
const windowMs = config.wakeWindowMs ?? 15_000;
|
|
41
|
+
const now = chunk.startMs;
|
|
42
|
+
// Wake Word im Text?
|
|
43
|
+
if (chunk.text.toLowerCase().includes(wakeWord.toLowerCase())) {
|
|
44
|
+
return { active: true, activatedAt: now };
|
|
45
|
+
}
|
|
46
|
+
// Aktives Window abgelaufen?
|
|
47
|
+
if (currentState.active && (now - currentState.activatedAt) > windowMs) {
|
|
48
|
+
return { active: false, activatedAt: 0 };
|
|
49
|
+
}
|
|
50
|
+
return currentState;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Vollständige Pipeline: Chunk → Wake-Check → Keyword-Detection.
|
|
54
|
+
* Gibt Keywords nur zurück wenn Wake aktiv ist ODER das Wake Word selbst erkannt wird.
|
|
55
|
+
*/
|
|
56
|
+
export function pipeline(chunk, config, wakeState) {
|
|
57
|
+
const wake = checkWake(chunk, config, wakeState);
|
|
58
|
+
if (!wake.active) {
|
|
59
|
+
return { keywords: [], wake };
|
|
60
|
+
}
|
|
61
|
+
const keywords = detect(chunk, config);
|
|
62
|
+
return { keywords, wake };
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=stichwort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stichwort.js","sourceRoot":"","sources":["../../src/touches/stichwort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAyBH,MAAM,gBAAgB,GAAG;IACvB,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW;IAC9D,aAAa,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO;IACjE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS;CAC1D,CAAA;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CACpB,KAAsB,EACtB,MAAuB;IAEvB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAA;IAChF,MAAM,KAAK,GAAsB,EAAE,CAAA;IAEnC,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,OAAO,EAAE,EAAE;gBACX,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;gBACjC,EAAE,EAAE,KAAK,CAAC,OAAO;aAClB,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAA;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,KAAsB,EACtB,MAAuB,EACvB,YAAuB;IAEvB,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,WAAW,CAAA;IAC/C,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,IAAI,MAAM,CAAA;IAC9C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAA;IAEzB,qBAAqB;IACrB,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAA;IAC3C,CAAC;IAED,6BAA6B;IAC7B,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,WAAW,CAAC,GAAG,QAAQ,EAAE,CAAC;QACvE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAA;IAC1C,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,KAAsB,EACtB,MAAuB,EACvB,SAAoB;IAEpB,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;IAEhD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAC/B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IACtC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAA;AAC3B,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S11
|
|
3
|
+
*
|
|
4
|
+
* Mappt S1 SignalingMessages auf S11 Transport Events.
|
|
5
|
+
* Handhabt:
|
|
6
|
+
* - Serialisierung (SignalingMessage → Event payload)
|
|
7
|
+
* - Trust Boundary (Server überschreibt source)
|
|
8
|
+
* - Room Routing (über RoomTransport)
|
|
9
|
+
*
|
|
10
|
+
* Type Guard: Importiert isSignalingMessage aus S1.
|
|
11
|
+
* Keine Duplikation — ein Guard, ein Set, eine Quelle.
|
|
12
|
+
*/
|
|
13
|
+
import type { Event } from '../types.js';
|
|
14
|
+
import { isSignalingMessage, type SignalingMessage } from '../s01-realtime/signaling.js';
|
|
15
|
+
export { isSignalingMessage as isValidSignalingMessage };
|
|
16
|
+
/** Wandelt ein Transport Event in eine SignalingMessage um (Deserialisierung) */
|
|
17
|
+
export declare function eventToSignaling(event: Event): SignalingMessage | null;
|
|
18
|
+
/** Wandelt eine SignalingMessage in ein Transport Event um (Serialisierung) */
|
|
19
|
+
export declare function signalingToEvent(msg: SignalingMessage, source: string, target?: string): Event<SignalingMessage>;
|
|
20
|
+
/**
|
|
21
|
+
* Trust Boundary: Überschreibt Source-Felder in eingehenden Messages.
|
|
22
|
+
* Agent-Messages (agentId) werden NICHT von Clients akzeptiert —
|
|
23
|
+
* nur der Server-Process darf Agent-Messages erzeugen.
|
|
24
|
+
*/
|
|
25
|
+
export declare function enforceSource<T extends SignalingMessage>(msg: T, trustedSource: string): T;
|
|
26
|
+
//# sourceMappingURL=transport-signal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport-signal.d.ts","sourceRoot":"","sources":["../../src/touches/transport-signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAGxF,OAAO,EAAE,kBAAkB,IAAI,uBAAuB,EAAE,CAAA;AAExD,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,gBAAgB,GAAG,IAAI,CAGtE;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,gBAAgB,EACrB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,GACd,KAAK,CAAC,gBAAgB,CAAC,CAQzB;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,gBAAgB,EAAE,GAAG,EAAE,CAAC,EAAE,aAAa,EAAE,MAAM,GAAG,CAAC,CAW1F"}
|