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,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S12 — Decision Ledger DAG
|
|
3
|
+
*
|
|
4
|
+
* Append-only DAG für Entscheidungshistorie.
|
|
5
|
+
* Jeder Knoten referenziert seine Eltern.
|
|
6
|
+
* Forks und Merges sind native Operationen.
|
|
7
|
+
*/
|
|
8
|
+
import type { Entry } from '../types.js';
|
|
9
|
+
import type { DAGEntry, DAGRef, HistoryRange } from './types.js';
|
|
10
|
+
export type LedgerDAG = {
|
|
11
|
+
/** Fügt einen Entry als neuen DAG-Knoten hinzu */
|
|
12
|
+
append(entry: Entry, parentIds?: string[]): DAGEntry;
|
|
13
|
+
/** Holt einen Knoten */
|
|
14
|
+
get(id: string): DAGEntry | undefined;
|
|
15
|
+
/** Alle Heads (Knoten ohne Kinder) */
|
|
16
|
+
heads(): DAGRef[];
|
|
17
|
+
/** History zwischen zwei Punkten */
|
|
18
|
+
history(range?: HistoryRange): DAGEntry[];
|
|
19
|
+
/** Merge: kombiniert mehrere Branches */
|
|
20
|
+
merge(headIds: string[], mergeContent: string, author: string): DAGEntry;
|
|
21
|
+
/** Alle Knoten */
|
|
22
|
+
size(): number;
|
|
23
|
+
};
|
|
24
|
+
export declare function createLedgerDAG(sessionId: string, hashFn: (entry: Entry) => string): LedgerDAG;
|
|
25
|
+
//# sourceMappingURL=ledger-dag.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-dag.d.ts","sourceRoot":"","sources":["../../src/s12-versioncontrol/ledger-dag.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEhE,MAAM,MAAM,SAAS,GAAG;IACtB,kDAAkD;IAClD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAA;IACpD,wBAAwB;IACxB,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAA;IACrC,sCAAsC;IACtC,KAAK,IAAI,MAAM,EAAE,CAAA;IACjB,oCAAoC;IACpC,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY,GAAG,QAAQ,EAAE,CAAA;IACzC,yCAAyC;IACzC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAA;IACxE,kBAAkB;IAClB,IAAI,IAAI,MAAM,CAAA;CACf,CAAA;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,GAAG,SAAS,CAwF9F"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S12 — Decision Ledger DAG
|
|
3
|
+
*
|
|
4
|
+
* Append-only DAG für Entscheidungshistorie.
|
|
5
|
+
* Jeder Knoten referenziert seine Eltern.
|
|
6
|
+
* Forks und Merges sind native Operationen.
|
|
7
|
+
*/
|
|
8
|
+
import { randomUUID } from 'node:crypto';
|
|
9
|
+
export function createLedgerDAG(sessionId, hashFn) {
|
|
10
|
+
const nodes = new Map();
|
|
11
|
+
const childMap = new Map(); // parentId → Set<childId>
|
|
12
|
+
function getHeadIds() {
|
|
13
|
+
return Array.from(nodes.keys()).filter(id => {
|
|
14
|
+
const children = childMap.get(id);
|
|
15
|
+
return !children || children.size === 0;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return {
|
|
19
|
+
append(entry, parentIds) {
|
|
20
|
+
const id = hashFn(entry);
|
|
21
|
+
const parents = parentIds ?? getHeadIds();
|
|
22
|
+
const dagEntry = {
|
|
23
|
+
id,
|
|
24
|
+
parentIds: parents,
|
|
25
|
+
sessionId,
|
|
26
|
+
ts: entry.ts,
|
|
27
|
+
type: entry.category ?? 'fact',
|
|
28
|
+
content: entry.text,
|
|
29
|
+
author: entry.source,
|
|
30
|
+
};
|
|
31
|
+
nodes.set(id, dagEntry);
|
|
32
|
+
// Register als Kind bei allen Eltern
|
|
33
|
+
for (const pid of parents) {
|
|
34
|
+
if (!childMap.has(pid))
|
|
35
|
+
childMap.set(pid, new Set());
|
|
36
|
+
childMap.get(pid).add(id);
|
|
37
|
+
}
|
|
38
|
+
return dagEntry;
|
|
39
|
+
},
|
|
40
|
+
get(id) {
|
|
41
|
+
return nodes.get(id);
|
|
42
|
+
},
|
|
43
|
+
heads() {
|
|
44
|
+
return getHeadIds().map(id => {
|
|
45
|
+
const node = nodes.get(id);
|
|
46
|
+
return { id, ts: node.ts, type: node.type };
|
|
47
|
+
});
|
|
48
|
+
},
|
|
49
|
+
history(range) {
|
|
50
|
+
let entries = Array.from(nodes.values());
|
|
51
|
+
if (range?.sessionId) {
|
|
52
|
+
entries = entries.filter(e => e.sessionId === range.sessionId);
|
|
53
|
+
}
|
|
54
|
+
if (range?.type) {
|
|
55
|
+
entries = entries.filter(e => e.type === range.type);
|
|
56
|
+
}
|
|
57
|
+
entries.sort((a, b) => a.ts - b.ts);
|
|
58
|
+
return entries;
|
|
59
|
+
},
|
|
60
|
+
merge(headIds, mergeContent, author) {
|
|
61
|
+
const id = randomUUID();
|
|
62
|
+
const dagEntry = {
|
|
63
|
+
id,
|
|
64
|
+
parentIds: headIds,
|
|
65
|
+
sessionId,
|
|
66
|
+
ts: Date.now(),
|
|
67
|
+
type: 'merge',
|
|
68
|
+
content: mergeContent,
|
|
69
|
+
author,
|
|
70
|
+
};
|
|
71
|
+
nodes.set(id, dagEntry);
|
|
72
|
+
for (const pid of headIds) {
|
|
73
|
+
if (!childMap.has(pid))
|
|
74
|
+
childMap.set(pid, new Set());
|
|
75
|
+
childMap.get(pid).add(id);
|
|
76
|
+
}
|
|
77
|
+
return dagEntry;
|
|
78
|
+
},
|
|
79
|
+
size() {
|
|
80
|
+
return nodes.size;
|
|
81
|
+
},
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=ledger-dag.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger-dag.js","sourceRoot":"","sources":["../../src/s12-versioncontrol/ledger-dag.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S12 — Merkle Tree
|
|
3
|
+
*
|
|
4
|
+
* Baut Merkle Trees aus Entry-Hashes. Erzeugt und verifiziert Proofs.
|
|
5
|
+
* Nutzt fullContentHash() aus S9 (der Seed aus Phase 0 wird zur Pflanze).
|
|
6
|
+
*/
|
|
7
|
+
import type { MerkleNode, MerkleProof } from './types.js';
|
|
8
|
+
/** Baut einen Merkle Tree aus einer Liste von Leaf-Hashes */
|
|
9
|
+
export declare function buildTree(leafHashes: string[]): MerkleNode | null;
|
|
10
|
+
/** Extrahiert den Root-Hash */
|
|
11
|
+
export declare function rootHash(tree: MerkleNode | null): string;
|
|
12
|
+
/** Erzeugt einen Proof für einen Leaf */
|
|
13
|
+
export declare function createProof(tree: MerkleNode | null, leafHash: string): MerkleProof | null;
|
|
14
|
+
/** Verifiziert einen Proof gegen einen Root-Hash */
|
|
15
|
+
export declare function verifyProof(proof: MerkleProof): boolean;
|
|
16
|
+
//# sourceMappingURL=merkle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../src/s12-versioncontrol/merkle.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAWzD,6DAA6D;AAC7D,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,UAAU,GAAG,IAAI,CAkBjE;AAED,+BAA+B;AAC/B,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,MAAM,CAExD;AAED,yCAAyC;AACzC,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiCzF;AAED,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAYvD"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S12 — Merkle Tree
|
|
3
|
+
*
|
|
4
|
+
* Baut Merkle Trees aus Entry-Hashes. Erzeugt und verifiziert Proofs.
|
|
5
|
+
* Nutzt fullContentHash() aus S9 (der Seed aus Phase 0 wird zur Pflanze).
|
|
6
|
+
*/
|
|
7
|
+
import { createHash } from 'node:crypto';
|
|
8
|
+
/**
|
|
9
|
+
* Hasht zwei Kinder-Hashes zu einem Eltern-Hash.
|
|
10
|
+
* Sicher solange Inputs fixe Länge haben (SHA-256 = 64 hex chars).
|
|
11
|
+
* Für variable Inputs: Length-Prefix nötig um hash("ab"+"cd") !== hash("abc"+"d") zu garantieren.
|
|
12
|
+
*/
|
|
13
|
+
function hashPair(a, b) {
|
|
14
|
+
return createHash('sha256').update(a + b).digest('hex');
|
|
15
|
+
}
|
|
16
|
+
/** Baut einen Merkle Tree aus einer Liste von Leaf-Hashes */
|
|
17
|
+
export function buildTree(leafHashes) {
|
|
18
|
+
if (leafHashes.length === 0)
|
|
19
|
+
return null;
|
|
20
|
+
let nodes = leafHashes.map(hash => ({ hash, data: hash }));
|
|
21
|
+
// Wenn ungerade Anzahl → letzten duplizieren
|
|
22
|
+
while (nodes.length > 1) {
|
|
23
|
+
const next = [];
|
|
24
|
+
for (let i = 0; i < nodes.length; i += 2) {
|
|
25
|
+
const left = nodes[i];
|
|
26
|
+
const right = nodes[i + 1] ?? left; // Duplikat bei ungerade
|
|
27
|
+
const parentHash = hashPair(left.hash, right.hash);
|
|
28
|
+
next.push({ hash: parentHash, left, right: nodes[i + 1] ? right : undefined });
|
|
29
|
+
}
|
|
30
|
+
nodes = next;
|
|
31
|
+
}
|
|
32
|
+
return nodes[0] ?? null;
|
|
33
|
+
}
|
|
34
|
+
/** Extrahiert den Root-Hash */
|
|
35
|
+
export function rootHash(tree) {
|
|
36
|
+
return tree?.hash ?? '';
|
|
37
|
+
}
|
|
38
|
+
/** Erzeugt einen Proof für einen Leaf */
|
|
39
|
+
export function createProof(tree, leafHash) {
|
|
40
|
+
if (!tree)
|
|
41
|
+
return null;
|
|
42
|
+
const path = [];
|
|
43
|
+
function find(node) {
|
|
44
|
+
// Leaf gefunden
|
|
45
|
+
if (!node.left && !node.right) {
|
|
46
|
+
return node.hash === leafHash;
|
|
47
|
+
}
|
|
48
|
+
// Links suchen
|
|
49
|
+
if (node.left && find(node.left)) {
|
|
50
|
+
if (node.right) {
|
|
51
|
+
path.push({ hash: node.right.hash, direction: 'right' });
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
// Rechts suchen
|
|
56
|
+
if (node.right && find(node.right)) {
|
|
57
|
+
if (node.left) {
|
|
58
|
+
path.push({ hash: node.left.hash, direction: 'left' });
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (!find(tree))
|
|
65
|
+
return null;
|
|
66
|
+
return { leafHash, path, root: tree.hash };
|
|
67
|
+
}
|
|
68
|
+
/** Verifiziert einen Proof gegen einen Root-Hash */
|
|
69
|
+
export function verifyProof(proof) {
|
|
70
|
+
let current = proof.leafHash;
|
|
71
|
+
for (const step of proof.path) {
|
|
72
|
+
if (step.direction === 'right') {
|
|
73
|
+
current = hashPair(current, step.hash);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
current = hashPair(step.hash, current);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return current === proof.root;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=merkle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle.js","sourceRoot":"","sources":["../../src/s12-versioncontrol/merkle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S12 — Version Control Types
|
|
3
|
+
*
|
|
4
|
+
* Git-ähnliche Content-Addressed Objekte für Decision Ledger.
|
|
5
|
+
* Merkle Trees für Audit-Integrität. DAG für kausale History.
|
|
6
|
+
*/
|
|
7
|
+
/** Merkle Tree Node */
|
|
8
|
+
export type MerkleNode = {
|
|
9
|
+
hash: string;
|
|
10
|
+
left?: MerkleNode;
|
|
11
|
+
right?: MerkleNode;
|
|
12
|
+
/** Leaf-Daten (nur bei Blättern) */
|
|
13
|
+
data?: string;
|
|
14
|
+
};
|
|
15
|
+
/** Proof-Pfad für einen Leaf im Merkle Tree */
|
|
16
|
+
export type MerkleProof = {
|
|
17
|
+
leafHash: string;
|
|
18
|
+
path: {
|
|
19
|
+
hash: string;
|
|
20
|
+
direction: 'left' | 'right';
|
|
21
|
+
}[];
|
|
22
|
+
root: string;
|
|
23
|
+
};
|
|
24
|
+
/** DAG-Eintrag — ein Knoten im Decision Graph */
|
|
25
|
+
export type DAGEntry = {
|
|
26
|
+
id: string;
|
|
27
|
+
parentIds: string[];
|
|
28
|
+
sessionId: string;
|
|
29
|
+
ts: number;
|
|
30
|
+
/** Typ des Eintrags */
|
|
31
|
+
type: 'decision' | 'fact' | 'action_item' | 'merge' | 'snapshot' | (string & {});
|
|
32
|
+
/** Der eigentliche Inhalt */
|
|
33
|
+
content: string;
|
|
34
|
+
/** Wer hat entschieden */
|
|
35
|
+
author: string;
|
|
36
|
+
};
|
|
37
|
+
/** DAG-Referenz — leichtgewichtiger Pointer */
|
|
38
|
+
export type DAGRef = {
|
|
39
|
+
id: string;
|
|
40
|
+
ts: number;
|
|
41
|
+
type: string;
|
|
42
|
+
};
|
|
43
|
+
/** History Query — was zwischen zwei Punkten passiert ist */
|
|
44
|
+
export type HistoryRange = {
|
|
45
|
+
from?: string;
|
|
46
|
+
to?: string;
|
|
47
|
+
sessionId?: string;
|
|
48
|
+
type?: string;
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/s12-versioncontrol/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,uBAAuB;AACvB,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,KAAK,CAAC,EAAE,UAAU,CAAA;IAClB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA;AAED,+CAA+C;AAC/C,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE,EAAE,CAAA;IACrD,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,iDAAiD;AACjD,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,EAAE,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,uBAAuB;IACvB,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,UAAU,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAChF,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,0BAA0B;IAC1B,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,+CAA+C;AAC/C,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,6DAA6D;AAC7D,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/s12-versioncontrol/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* RTP Audio Consumer → PCM Buffer → STT → Token-Sequenz → Inference Input
|
|
5
|
+
*
|
|
6
|
+
* Dieser Touch Point definiert das Interface. Die Implementierung
|
|
7
|
+
* hängt vom STT-Provider ab (Whisper, Groq, eigenes Modell).
|
|
8
|
+
* Phase 0: Interface only. Phase 1: mediasoup Consumer → Whisper.
|
|
9
|
+
*/
|
|
10
|
+
export type TranscriptChunk = {
|
|
11
|
+
text: string;
|
|
12
|
+
speakerId: string;
|
|
13
|
+
confidence: number;
|
|
14
|
+
language?: string;
|
|
15
|
+
startMs: number;
|
|
16
|
+
endMs: number;
|
|
17
|
+
};
|
|
18
|
+
export type AudioTapConfig = {
|
|
19
|
+
/** Minimale Confidence für Weiterverarbeitung */
|
|
20
|
+
minConfidence: number;
|
|
21
|
+
/** Max Buffer-Größe in Bytes bevor STT getriggert wird */
|
|
22
|
+
bufferSize: number;
|
|
23
|
+
/** STT Provider */
|
|
24
|
+
transcribe: (audio: ArrayBuffer, speakerId: string) => Promise<TranscriptChunk[]>;
|
|
25
|
+
};
|
|
26
|
+
export type AudioTap = {
|
|
27
|
+
feed(chunk: ArrayBuffer, speakerId: string): void;
|
|
28
|
+
onTranscript(handler: (chunk: TranscriptChunk) => void): void;
|
|
29
|
+
flush(): Promise<void>;
|
|
30
|
+
};
|
|
31
|
+
export declare function createAudioTap(config: AudioTapConfig): AudioTap;
|
|
32
|
+
//# sourceMappingURL=audio-tap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-tap.d.ts","sourceRoot":"","sources":["../../src/touches/audio-tap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,iDAAiD;IACjD,aAAa,EAAE,MAAM,CAAA;IACrB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAA;IAClB,mBAAmB;IACnB,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;CAClF,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACjD,YAAY,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,GAAG,IAAI,CAAA;IAC7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAA;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAgD/D"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S1 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* RTP Audio Consumer → PCM Buffer → STT → Token-Sequenz → Inference Input
|
|
5
|
+
*
|
|
6
|
+
* Dieser Touch Point definiert das Interface. Die Implementierung
|
|
7
|
+
* hängt vom STT-Provider ab (Whisper, Groq, eigenes Modell).
|
|
8
|
+
* Phase 0: Interface only. Phase 1: mediasoup Consumer → Whisper.
|
|
9
|
+
*/
|
|
10
|
+
export function createAudioTap(config) {
|
|
11
|
+
let buffer = [];
|
|
12
|
+
let bufferSize = 0;
|
|
13
|
+
let lastSpeakerId = '';
|
|
14
|
+
const handlers = [];
|
|
15
|
+
async function processBuffer() {
|
|
16
|
+
if (buffer.length === 0)
|
|
17
|
+
return;
|
|
18
|
+
const totalSize = buffer.reduce((s, b) => s + b.byteLength, 0);
|
|
19
|
+
const combined = new ArrayBuffer(totalSize);
|
|
20
|
+
const view = new Uint8Array(combined);
|
|
21
|
+
let offset = 0;
|
|
22
|
+
for (const buf of buffer) {
|
|
23
|
+
view.set(new Uint8Array(buf), offset);
|
|
24
|
+
offset += buf.byteLength;
|
|
25
|
+
}
|
|
26
|
+
const speaker = lastSpeakerId;
|
|
27
|
+
buffer = [];
|
|
28
|
+
bufferSize = 0;
|
|
29
|
+
const chunks = await config.transcribe(combined, speaker);
|
|
30
|
+
for (const chunk of chunks) {
|
|
31
|
+
if (chunk.confidence >= config.minConfidence) {
|
|
32
|
+
for (const handler of handlers)
|
|
33
|
+
handler(chunk);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
feed(chunk, speakerId) {
|
|
39
|
+
lastSpeakerId = speakerId;
|
|
40
|
+
buffer.push(chunk);
|
|
41
|
+
bufferSize += chunk.byteLength;
|
|
42
|
+
if (bufferSize >= config.bufferSize) {
|
|
43
|
+
void processBuffer();
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
onTranscript(handler) {
|
|
47
|
+
handlers.push(handler);
|
|
48
|
+
},
|
|
49
|
+
async flush() {
|
|
50
|
+
await processBuffer();
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=audio-tap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-tap.js","sourceRoot":"","sources":["../../src/touches/audio-tap.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0BH,MAAM,UAAU,cAAc,CAAC,MAAsB;IACnD,IAAI,MAAM,GAAkB,EAAE,CAAA;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,IAAI,aAAa,GAAG,EAAE,CAAA;IACtB,MAAM,QAAQ,GAAyC,EAAE,CAAA;IAEzD,KAAK,UAAU,aAAa;QAC1B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAA;QAC9D,MAAM,QAAQ,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAA;QAC3C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;YACrC,MAAM,IAAI,GAAG,CAAC,UAAU,CAAA;QAC1B,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAA;QAC7B,MAAM,GAAG,EAAE,CAAA;QACX,UAAU,GAAG,CAAC,CAAA;QAEd,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QACzD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YAC3B,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;gBAC7C,KAAK,MAAM,OAAO,IAAI,QAAQ;oBAAE,OAAO,CAAC,KAAK,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAK,EAAE,SAAS;YACnB,aAAa,GAAG,SAAS,CAAA;YACzB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAClB,UAAU,IAAI,KAAK,CAAC,UAAU,CAAA;YAC9B,IAAI,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACpC,KAAK,aAAa,EAAE,CAAA;YACtB,CAAC;QACH,CAAC;QAED,YAAY,CAAC,OAAO;YAClB,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACxB,CAAC;QAED,KAAK,CAAC,KAAK;YACT,MAAM,aAAa,EAAE,CAAA;QACvB,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S5 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Inference-Events → Avatar-Transitions.
|
|
5
|
+
* Der Loop erzeugt Zustände (working, done, error).
|
|
6
|
+
* Dieser Touch übersetzt sie in Avatar State Machine Events.
|
|
7
|
+
*/
|
|
8
|
+
import type { LoopResult } from '../s10-inference/loop.js';
|
|
9
|
+
import type { AvatarState, GestureType, GestureMapping } from '../s05-rendering/types.js';
|
|
10
|
+
type AvatarEvent = 'keyword_detected' | 'cloud_task_started' | 'material_ready' | 'material_released' | 'material_dismissed' | 'task_failed' | 'reset' | 'session_start' | 'greeting_done' | 'auto_reset';
|
|
11
|
+
/** Mapped einen LoopResult auf ein Avatar-Event */
|
|
12
|
+
export declare function loopResultToAvatarEvent(result: LoopResult): AvatarEvent | null;
|
|
13
|
+
/** Gibt die aktuelle Geste basierend auf Avatar-State zurück */
|
|
14
|
+
export declare function stateToGesture(state: AvatarState, mapping?: GestureMapping): GestureType;
|
|
15
|
+
/** Die 9 Standard-Transitions aus 0room0's Avatar State Machine */
|
|
16
|
+
export declare const AVATAR_TRANSITIONS: {
|
|
17
|
+
from: AvatarState;
|
|
18
|
+
event: AvatarEvent;
|
|
19
|
+
to: AvatarState;
|
|
20
|
+
}[];
|
|
21
|
+
export {};
|
|
22
|
+
//# sourceMappingURL=avatar-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-state.d.ts","sourceRoot":"","sources":["../../src/touches/avatar-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAE1D,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAGzF,KAAK,WAAW,GACZ,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAChB,mBAAmB,GACnB,oBAAoB,GACpB,aAAa,GACb,OAAO,GACP,eAAe,GACf,eAAe,GACf,YAAY,CAAA;AAEhB,mDAAmD;AACnD,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,CAO9E;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAC5B,KAAK,EAAE,WAAW,EAClB,OAAO,GAAE,cAAoC,GAC5C,WAAW,CAEb;AAED,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,EAAE;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,EAAE,EAAE,WAAW,CAAA;CAAE,EAW1F,CAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S5 ↔ S10
|
|
3
|
+
*
|
|
4
|
+
* Inference-Events → Avatar-Transitions.
|
|
5
|
+
* Der Loop erzeugt Zustände (working, done, error).
|
|
6
|
+
* Dieser Touch übersetzt sie in Avatar State Machine Events.
|
|
7
|
+
*/
|
|
8
|
+
import { DEFAULT_GESTURE_MAP } from '../s05-rendering/types.js';
|
|
9
|
+
/** Mapped einen LoopResult auf ein Avatar-Event */
|
|
10
|
+
export function loopResultToAvatarEvent(result) {
|
|
11
|
+
switch (result.reason) {
|
|
12
|
+
case 'done': return 'material_ready';
|
|
13
|
+
case 'error': return 'task_failed';
|
|
14
|
+
case 'aborted': return 'reset';
|
|
15
|
+
case 'budget': return 'material_ready'; // Budget erschöpft = was da ist, ist da
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Gibt die aktuelle Geste basierend auf Avatar-State zurück */
|
|
19
|
+
export function stateToGesture(state, mapping = DEFAULT_GESTURE_MAP) {
|
|
20
|
+
return mapping[state] ?? 'idle';
|
|
21
|
+
}
|
|
22
|
+
/** Die 9 Standard-Transitions aus 0room0's Avatar State Machine */
|
|
23
|
+
export const AVATAR_TRANSITIONS = [
|
|
24
|
+
{ from: 'idle', event: 'keyword_detected', to: 'listening' },
|
|
25
|
+
{ from: 'idle', event: 'session_start', to: 'greeting' },
|
|
26
|
+
{ from: 'listening', event: 'cloud_task_started', to: 'working' },
|
|
27
|
+
{ from: 'working', event: 'material_ready', to: 'ready' },
|
|
28
|
+
{ from: 'working', event: 'task_failed', to: 'failed' },
|
|
29
|
+
{ from: 'ready', event: 'material_released', to: 'success' }, // Observer Fix: ready → success (nicht direkt idle)
|
|
30
|
+
{ from: 'ready', event: 'material_dismissed', to: 'idle' },
|
|
31
|
+
{ from: 'failed', event: 'reset', to: 'idle' },
|
|
32
|
+
{ from: 'greeting', event: 'greeting_done', to: 'idle' },
|
|
33
|
+
{ from: 'success', event: 'auto_reset', to: 'idle' },
|
|
34
|
+
];
|
|
35
|
+
//# sourceMappingURL=avatar-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avatar-state.js","sourceRoot":"","sources":["../../src/touches/avatar-state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAc/D,mDAAmD;AACnD,MAAM,UAAU,uBAAuB,CAAC,MAAkB;IACxD,QAAQ,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,CAAC,OAAO,gBAAgB,CAAA;QACpC,KAAK,OAAO,CAAC,CAAC,OAAO,aAAa,CAAA;QAClC,KAAK,SAAS,CAAC,CAAC,OAAO,OAAO,CAAA;QAC9B,KAAK,QAAQ,CAAC,CAAC,OAAO,gBAAgB,CAAA,CAAC,wCAAwC;IACjF,CAAC;AACH,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAC5B,KAAkB,EAClB,UAA0B,mBAAmB;IAE7C,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,MAAM,CAAA;AACjC,CAAC;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,kBAAkB,GAAiE;IAC9F,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,EAAE,WAAW,EAAE;IAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,UAAU,EAAE;IACxD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,SAAS,EAAE;IACjE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE;IACzD,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE,QAAQ,EAAE;IACvD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,EAAE,SAAS,EAAE,EAAG,oDAAoD;IACnH,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,EAAE,EAAE,EAAE,MAAM,EAAE;IAC1D,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE;IAC9C,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,EAAE,MAAM,EAAE;IACxD,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE;CACrD,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S8 ↔ S11
|
|
3
|
+
*
|
|
4
|
+
* Jeder Room kann einen eigenen Container bekommen.
|
|
5
|
+
* GPU-Allocation pro Room für Inference.
|
|
6
|
+
*/
|
|
7
|
+
import type { Sandbox, GpuScheduler } from '../s08-containers/types.js';
|
|
8
|
+
export type RoomContainer = {
|
|
9
|
+
roomId: string;
|
|
10
|
+
containerId: string;
|
|
11
|
+
gpuAllocated: boolean;
|
|
12
|
+
};
|
|
13
|
+
/** Erstellt einen isolierten Container für einen Room */
|
|
14
|
+
export declare function createRoomContainer(sandbox: Sandbox, gpu: GpuScheduler, roomId: string, gpuMemoryMb?: number): Promise<RoomContainer>;
|
|
15
|
+
/** Räumt Container + GPU für einen Room auf */
|
|
16
|
+
export declare function destroyRoomContainer(sandbox: Sandbox, gpu: GpuScheduler, containerId: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=container-room.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-room.d.ts","sourceRoot":"","sources":["../../src/touches/container-room.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAmB,MAAM,4BAA4B,CAAA;AAExF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,OAAO,CAAA;CACtB,CAAA;AAED,yDAAyD;AACzD,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,YAAY,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAsBxB;AAED,+CAA+C;AAC/C,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S8 ↔ S11
|
|
3
|
+
*
|
|
4
|
+
* Jeder Room kann einen eigenen Container bekommen.
|
|
5
|
+
* GPU-Allocation pro Room für Inference.
|
|
6
|
+
*/
|
|
7
|
+
/** Erstellt einen isolierten Container für einen Room */
|
|
8
|
+
export async function createRoomContainer(sandbox, gpu, roomId, gpuMemoryMb) {
|
|
9
|
+
const config = {
|
|
10
|
+
id: `room-${roomId}`,
|
|
11
|
+
role: 'room',
|
|
12
|
+
isolation: 'process',
|
|
13
|
+
limits: {
|
|
14
|
+
cpuMillicores: 2000,
|
|
15
|
+
memoryMb: 512,
|
|
16
|
+
gpuMemoryMb,
|
|
17
|
+
},
|
|
18
|
+
env: { ROOM_ID: roomId },
|
|
19
|
+
};
|
|
20
|
+
await sandbox.create(config);
|
|
21
|
+
await sandbox.start(config.id);
|
|
22
|
+
let gpuAllocated = false;
|
|
23
|
+
if (gpuMemoryMb) {
|
|
24
|
+
gpuAllocated = gpu.allocate(config.id, gpuMemoryMb);
|
|
25
|
+
}
|
|
26
|
+
return { roomId, containerId: config.id, gpuAllocated };
|
|
27
|
+
}
|
|
28
|
+
/** Räumt Container + GPU für einen Room auf */
|
|
29
|
+
export async function destroyRoomContainer(sandbox, gpu, containerId) {
|
|
30
|
+
gpu.release(containerId);
|
|
31
|
+
await sandbox.stop(containerId);
|
|
32
|
+
await sandbox.destroy(containerId);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=container-room.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"container-room.js","sourceRoot":"","sources":["../../src/touches/container-room.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAUH,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAgB,EAChB,GAAiB,EACjB,MAAc,EACd,WAAoB;IAEpB,MAAM,MAAM,GAAoB;QAC9B,EAAE,EAAE,QAAQ,MAAM,EAAE;QACpB,IAAI,EAAE,MAAM;QACZ,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE;YACN,aAAa,EAAE,IAAI;YACnB,QAAQ,EAAE,GAAG;YACb,WAAW;SACZ;QACD,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;KACzB,CAAA;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC5B,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAE9B,IAAI,YAAY,GAAG,KAAK,CAAA;IACxB,IAAI,WAAW,EAAE,CAAC;QAChB,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,CAAC,CAAA;IACrD,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,EAAE,YAAY,EAAE,CAAA;AACzD,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAgB,EAChB,GAAiB,EACjB,WAAmB;IAEnB,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACxB,MAAM,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAC/B,MAAM,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;AACpC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S6 ↔ Ledger
|
|
3
|
+
*
|
|
4
|
+
* Ledger.total() → Invoice-Generierung.
|
|
5
|
+
* Die Brücke zwischen Kostenerfassung (Ledger) und Abrechnung (Payments).
|
|
6
|
+
*
|
|
7
|
+
* Emergenz: Consent-Levels werden zu Pricing-Tiers.
|
|
8
|
+
* observe → Free (Ledger trackt, aber keine Abrechnung)
|
|
9
|
+
* assist → Professional (Usage-basiert)
|
|
10
|
+
* act → Enterprise (Flat + Usage)
|
|
11
|
+
*/
|
|
12
|
+
import type { Ledger } from '../ledger.js';
|
|
13
|
+
import type { BillingService } from '../s06-payments/types.js';
|
|
14
|
+
import type { ConsentLevel } from '../s07-identity/session.js';
|
|
15
|
+
import type { PlanTier } from '../s06-payments/types.js';
|
|
16
|
+
/** Mappt Consent-Level auf Pricing-Tier */
|
|
17
|
+
export declare function consentToTier(level: ConsentLevel): PlanTier;
|
|
18
|
+
/** Synchronisiert Ledger-Kosten in den Billing-Service */
|
|
19
|
+
export declare function syncLedgerToBilling(ledger: Ledger, billing: BillingService, subscriptionId: string): void;
|
|
20
|
+
//# sourceMappingURL=cost-billing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-billing.d.ts","sourceRoot":"","sources":["../../src/touches/cost-billing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAC9D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAExD,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,QAAQ,CAM3D;AAED,0DAA0D;AAC1D,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,GACrB,IAAI,CAIN"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S6 ↔ Ledger
|
|
3
|
+
*
|
|
4
|
+
* Ledger.total() → Invoice-Generierung.
|
|
5
|
+
* Die Brücke zwischen Kostenerfassung (Ledger) und Abrechnung (Payments).
|
|
6
|
+
*
|
|
7
|
+
* Emergenz: Consent-Levels werden zu Pricing-Tiers.
|
|
8
|
+
* observe → Free (Ledger trackt, aber keine Abrechnung)
|
|
9
|
+
* assist → Professional (Usage-basiert)
|
|
10
|
+
* act → Enterprise (Flat + Usage)
|
|
11
|
+
*/
|
|
12
|
+
/** Mappt Consent-Level auf Pricing-Tier */
|
|
13
|
+
export function consentToTier(level) {
|
|
14
|
+
switch (level) {
|
|
15
|
+
case 'observe': return 'free';
|
|
16
|
+
case 'assist': return 'professional';
|
|
17
|
+
case 'act': return 'enterprise';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Synchronisiert Ledger-Kosten in den Billing-Service */
|
|
21
|
+
export function syncLedgerToBilling(ledger, billing, subscriptionId) {
|
|
22
|
+
const { cost, usage } = ledger.total();
|
|
23
|
+
const costCents = Math.round(cost * 100);
|
|
24
|
+
billing.recordUsage(subscriptionId, usage.input + usage.output, costCents);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=cost-billing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-billing.js","sourceRoot":"","sources":["../../src/touches/cost-billing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAOH,2CAA2C;AAC3C,MAAM,UAAU,aAAa,CAAC,KAAmB;IAC/C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS,CAAC,CAAC,OAAO,MAAM,CAAA;QAC7B,KAAK,QAAQ,CAAC,CAAC,OAAO,cAAc,CAAA;QACpC,KAAK,KAAK,CAAC,CAAC,OAAO,YAAY,CAAA;IACjC,CAAC;AACH,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,mBAAmB,CACjC,MAAc,EACd,OAAuB,EACvB,cAAsB;IAEtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,KAAK,EAAE,CAAA;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;IACxC,OAAO,CAAC,WAAW,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;AAC5E,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S10 ↔ Ledger
|
|
3
|
+
*
|
|
4
|
+
* Observer Blinder Fleck #1: Der Loop trackt ctx.usage aber ruft
|
|
5
|
+
* nie ledger.record() auf. Dieser Touch Point verbindet beide.
|
|
6
|
+
*
|
|
7
|
+
* Wird im Loop als Post-Stream-Hook aufgerufen: nach jedem Provider-Stream
|
|
8
|
+
* wird die Usage an den Ledger gemeldet.
|
|
9
|
+
*/
|
|
10
|
+
import type { Ledger } from '../ledger.js';
|
|
11
|
+
import type { TokenUsage } from '../types.js';
|
|
12
|
+
export type CostTrackHook = {
|
|
13
|
+
/** Nach jedem Provider-Stream aufrufen */
|
|
14
|
+
record(model: string, usage: TokenUsage): number;
|
|
15
|
+
/** Aktuelle Session-Kosten */
|
|
16
|
+
totalCost(): number;
|
|
17
|
+
};
|
|
18
|
+
export declare function createCostTrackHook(ledger: Ledger): CostTrackHook;
|
|
19
|
+
//# sourceMappingURL=cost-track.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-track.d.ts","sourceRoot":"","sources":["../../src/touches/cost-track.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,MAAM,MAAM,aAAa,GAAG;IAC1B,0CAA0C;IAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,MAAM,CAAA;IAChD,8BAA8B;IAC9B,SAAS,IAAI,MAAM,CAAA;CACpB,CAAA;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAUjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Touch: S10 ↔ Ledger
|
|
3
|
+
*
|
|
4
|
+
* Observer Blinder Fleck #1: Der Loop trackt ctx.usage aber ruft
|
|
5
|
+
* nie ledger.record() auf. Dieser Touch Point verbindet beide.
|
|
6
|
+
*
|
|
7
|
+
* Wird im Loop als Post-Stream-Hook aufgerufen: nach jedem Provider-Stream
|
|
8
|
+
* wird die Usage an den Ledger gemeldet.
|
|
9
|
+
*/
|
|
10
|
+
export function createCostTrackHook(ledger) {
|
|
11
|
+
return {
|
|
12
|
+
record(model, usage) {
|
|
13
|
+
return ledger.record(model, usage);
|
|
14
|
+
},
|
|
15
|
+
totalCost() {
|
|
16
|
+
return ledger.total().cost;
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=cost-track.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cost-track.js","sourceRoot":"","sources":["../../src/touches/cost-track.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAYH,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO;QACL,MAAM,CAAC,KAAK,EAAE,KAAK;YACjB,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,CAAA;QACpC,CAAC;QAED,SAAS;YACP,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAA;QAC5B,CAAC;KACF,CAAA;AACH,CAAC"}
|