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.
Files changed (306) hide show
  1. package/README.md +338 -0
  2. package/dist/compat/butler-cloud.d.ts +33 -0
  3. package/dist/compat/butler-cloud.d.ts.map +1 -0
  4. package/dist/compat/butler-cloud.js +69 -0
  5. package/dist/compat/butler-cloud.js.map +1 -0
  6. package/dist/compat/butler-edge.d.ts +34 -0
  7. package/dist/compat/butler-edge.d.ts.map +1 -0
  8. package/dist/compat/butler-edge.js +62 -0
  9. package/dist/compat/butler-edge.js.map +1 -0
  10. package/dist/compat/butler-pair.d.ts +27 -0
  11. package/dist/compat/butler-pair.d.ts.map +1 -0
  12. package/dist/compat/butler-pair.js +23 -0
  13. package/dist/compat/butler-pair.js.map +1 -0
  14. package/dist/compat/entry.d.ts +26 -0
  15. package/dist/compat/entry.d.ts.map +1 -0
  16. package/dist/compat/entry.js +35 -0
  17. package/dist/compat/entry.js.map +1 -0
  18. package/dist/compat/index.d.ts +12 -0
  19. package/dist/compat/index.d.ts.map +1 -0
  20. package/dist/compat/index.js +12 -0
  21. package/dist/compat/index.js.map +1 -0
  22. package/dist/compat/queue.d.ts +31 -0
  23. package/dist/compat/queue.d.ts.map +1 -0
  24. package/dist/compat/queue.js +54 -0
  25. package/dist/compat/queue.js.map +1 -0
  26. package/dist/index.d.ts +37 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +53 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/ledger.d.ts +28 -0
  31. package/dist/ledger.d.ts.map +1 -0
  32. package/dist/ledger.js +62 -0
  33. package/dist/ledger.js.map +1 -0
  34. package/dist/observability/index.d.ts +4 -0
  35. package/dist/observability/index.d.ts.map +1 -0
  36. package/dist/observability/index.js +2 -0
  37. package/dist/observability/index.js.map +1 -0
  38. package/dist/observability/observer.d.ts +37 -0
  39. package/dist/observability/observer.d.ts.map +1 -0
  40. package/dist/observability/observer.js +53 -0
  41. package/dist/observability/observer.js.map +1 -0
  42. package/dist/observability/types.d.ts +92 -0
  43. package/dist/observability/types.d.ts.map +1 -0
  44. package/dist/observability/types.js +9 -0
  45. package/dist/observability/types.js.map +1 -0
  46. package/dist/s01-realtime/index.d.ts +3 -0
  47. package/dist/s01-realtime/index.d.ts.map +1 -0
  48. package/dist/s01-realtime/index.js +2 -0
  49. package/dist/s01-realtime/index.js.map +1 -0
  50. package/dist/s01-realtime/signaling.d.ts +78 -0
  51. package/dist/s01-realtime/signaling.d.ts.map +1 -0
  52. package/dist/s01-realtime/signaling.js +20 -0
  53. package/dist/s01-realtime/signaling.js.map +1 -0
  54. package/dist/s01-realtime/types.d.ts +40 -0
  55. package/dist/s01-realtime/types.d.ts.map +1 -0
  56. package/dist/s01-realtime/types.js +8 -0
  57. package/dist/s01-realtime/types.js.map +1 -0
  58. package/dist/s02-crdt/index.d.ts +3 -0
  59. package/dist/s02-crdt/index.d.ts.map +1 -0
  60. package/dist/s02-crdt/index.js +2 -0
  61. package/dist/s02-crdt/index.js.map +1 -0
  62. package/dist/s02-crdt/types.d.ts +45 -0
  63. package/dist/s02-crdt/types.d.ts.map +1 -0
  64. package/dist/s02-crdt/types.js +10 -0
  65. package/dist/s02-crdt/types.js.map +1 -0
  66. package/dist/s02-crdt/yjs.d.ts +9 -0
  67. package/dist/s02-crdt/yjs.d.ts.map +1 -0
  68. package/dist/s02-crdt/yjs.js +67 -0
  69. package/dist/s02-crdt/yjs.js.map +1 -0
  70. package/dist/s03-streaming/index.d.ts +3 -0
  71. package/dist/s03-streaming/index.d.ts.map +1 -0
  72. package/dist/s03-streaming/index.js +2 -0
  73. package/dist/s03-streaming/index.js.map +1 -0
  74. package/dist/s03-streaming/playlist.d.ts +8 -0
  75. package/dist/s03-streaming/playlist.d.ts.map +1 -0
  76. package/dist/s03-streaming/playlist.js +49 -0
  77. package/dist/s03-streaming/playlist.js.map +1 -0
  78. package/dist/s03-streaming/types.d.ts +69 -0
  79. package/dist/s03-streaming/types.d.ts.map +1 -0
  80. package/dist/s03-streaming/types.js +8 -0
  81. package/dist/s03-streaming/types.js.map +1 -0
  82. package/dist/s04-messaging/index.d.ts +3 -0
  83. package/dist/s04-messaging/index.d.ts.map +1 -0
  84. package/dist/s04-messaging/index.js +2 -0
  85. package/dist/s04-messaging/index.js.map +1 -0
  86. package/dist/s04-messaging/serializer.d.ts +11 -0
  87. package/dist/s04-messaging/serializer.d.ts.map +1 -0
  88. package/dist/s04-messaging/serializer.js +45 -0
  89. package/dist/s04-messaging/serializer.js.map +1 -0
  90. package/dist/s04-messaging/types.d.ts +54 -0
  91. package/dist/s04-messaging/types.d.ts.map +1 -0
  92. package/dist/s04-messaging/types.js +8 -0
  93. package/dist/s04-messaging/types.js.map +1 -0
  94. package/dist/s05-rendering/index.d.ts +3 -0
  95. package/dist/s05-rendering/index.d.ts.map +1 -0
  96. package/dist/s05-rendering/index.js +3 -0
  97. package/dist/s05-rendering/index.js.map +1 -0
  98. package/dist/s05-rendering/state-machine.d.ts +20 -0
  99. package/dist/s05-rendering/state-machine.d.ts.map +1 -0
  100. package/dist/s05-rendering/state-machine.js +47 -0
  101. package/dist/s05-rendering/state-machine.js.map +1 -0
  102. package/dist/s05-rendering/types.d.ts +13 -0
  103. package/dist/s05-rendering/types.d.ts.map +1 -0
  104. package/dist/s05-rendering/types.js +16 -0
  105. package/dist/s05-rendering/types.js.map +1 -0
  106. package/dist/s06-payments/billing.d.ts +9 -0
  107. package/dist/s06-payments/billing.d.ts.map +1 -0
  108. package/dist/s06-payments/billing.js +79 -0
  109. package/dist/s06-payments/billing.js.map +1 -0
  110. package/dist/s06-payments/index.d.ts +4 -0
  111. package/dist/s06-payments/index.d.ts.map +1 -0
  112. package/dist/s06-payments/index.js +3 -0
  113. package/dist/s06-payments/index.js.map +1 -0
  114. package/dist/s06-payments/stripe.d.ts +52 -0
  115. package/dist/s06-payments/stripe.d.ts.map +1 -0
  116. package/dist/s06-payments/stripe.js +103 -0
  117. package/dist/s06-payments/stripe.js.map +1 -0
  118. package/dist/s06-payments/types.d.ts +80 -0
  119. package/dist/s06-payments/types.d.ts.map +1 -0
  120. package/dist/s06-payments/types.js +13 -0
  121. package/dist/s06-payments/types.js.map +1 -0
  122. package/dist/s07-identity/index.d.ts +2 -0
  123. package/dist/s07-identity/index.d.ts.map +1 -0
  124. package/dist/s07-identity/index.js +2 -0
  125. package/dist/s07-identity/index.js.map +1 -0
  126. package/dist/s07-identity/session.d.ts +53 -0
  127. package/dist/s07-identity/session.d.ts.map +1 -0
  128. package/dist/s07-identity/session.js +114 -0
  129. package/dist/s07-identity/session.js.map +1 -0
  130. package/dist/s08-containers/docker.d.ts +39 -0
  131. package/dist/s08-containers/docker.d.ts.map +1 -0
  132. package/dist/s08-containers/docker.js +72 -0
  133. package/dist/s08-containers/docker.js.map +1 -0
  134. package/dist/s08-containers/index.d.ts +4 -0
  135. package/dist/s08-containers/index.d.ts.map +1 -0
  136. package/dist/s08-containers/index.js +3 -0
  137. package/dist/s08-containers/index.js.map +1 -0
  138. package/dist/s08-containers/sandbox.d.ts +10 -0
  139. package/dist/s08-containers/sandbox.d.ts.map +1 -0
  140. package/dist/s08-containers/sandbox.js +68 -0
  141. package/dist/s08-containers/sandbox.js.map +1 -0
  142. package/dist/s08-containers/types.d.ts +66 -0
  143. package/dist/s08-containers/types.d.ts.map +1 -0
  144. package/dist/s08-containers/types.js +8 -0
  145. package/dist/s08-containers/types.js.map +1 -0
  146. package/dist/s09-persistence/cold.d.ts +43 -0
  147. package/dist/s09-persistence/cold.d.ts.map +1 -0
  148. package/dist/s09-persistence/cold.js +135 -0
  149. package/dist/s09-persistence/cold.js.map +1 -0
  150. package/dist/s09-persistence/hot.d.ts +32 -0
  151. package/dist/s09-persistence/hot.d.ts.map +1 -0
  152. package/dist/s09-persistence/hot.js +63 -0
  153. package/dist/s09-persistence/hot.js.map +1 -0
  154. package/dist/s09-persistence/index.d.ts +6 -0
  155. package/dist/s09-persistence/index.d.ts.map +1 -0
  156. package/dist/s09-persistence/index.js +6 -0
  157. package/dist/s09-persistence/index.js.map +1 -0
  158. package/dist/s09-persistence/pg-warm.d.ts +30 -0
  159. package/dist/s09-persistence/pg-warm.d.ts.map +1 -0
  160. package/dist/s09-persistence/pg-warm.js +139 -0
  161. package/dist/s09-persistence/pg-warm.js.map +1 -0
  162. package/dist/s09-persistence/s3-cold.d.ts +39 -0
  163. package/dist/s09-persistence/s3-cold.d.ts.map +1 -0
  164. package/dist/s09-persistence/s3-cold.js +102 -0
  165. package/dist/s09-persistence/s3-cold.js.map +1 -0
  166. package/dist/s09-persistence/warm.d.ts +33 -0
  167. package/dist/s09-persistence/warm.d.ts.map +1 -0
  168. package/dist/s09-persistence/warm.js +169 -0
  169. package/dist/s09-persistence/warm.js.map +1 -0
  170. package/dist/s10-inference/action.d.ts +39 -0
  171. package/dist/s10-inference/action.d.ts.map +1 -0
  172. package/dist/s10-inference/action.js +73 -0
  173. package/dist/s10-inference/action.js.map +1 -0
  174. package/dist/s10-inference/agents/index.d.ts +3 -0
  175. package/dist/s10-inference/agents/index.d.ts.map +1 -0
  176. package/dist/s10-inference/agents/index.js +3 -0
  177. package/dist/s10-inference/agents/index.js.map +1 -0
  178. package/dist/s10-inference/agents/mirror.d.ts +73 -0
  179. package/dist/s10-inference/agents/mirror.d.ts.map +1 -0
  180. package/dist/s10-inference/agents/mirror.js +106 -0
  181. package/dist/s10-inference/agents/mirror.js.map +1 -0
  182. package/dist/s10-inference/agents/registry.d.ts +64 -0
  183. package/dist/s10-inference/agents/registry.d.ts.map +1 -0
  184. package/dist/s10-inference/agents/registry.js +92 -0
  185. package/dist/s10-inference/agents/registry.js.map +1 -0
  186. package/dist/s10-inference/context.d.ts +39 -0
  187. package/dist/s10-inference/context.d.ts.map +1 -0
  188. package/dist/s10-inference/context.js +36 -0
  189. package/dist/s10-inference/context.js.map +1 -0
  190. package/dist/s10-inference/index.d.ts +7 -0
  191. package/dist/s10-inference/index.d.ts.map +1 -0
  192. package/dist/s10-inference/index.js +6 -0
  193. package/dist/s10-inference/index.js.map +1 -0
  194. package/dist/s10-inference/loop.d.ts +42 -0
  195. package/dist/s10-inference/loop.d.ts.map +1 -0
  196. package/dist/s10-inference/loop.js +104 -0
  197. package/dist/s10-inference/loop.js.map +1 -0
  198. package/dist/s10-inference/provider.d.ts +43 -0
  199. package/dist/s10-inference/provider.d.ts.map +1 -0
  200. package/dist/s10-inference/provider.js +9 -0
  201. package/dist/s10-inference/provider.js.map +1 -0
  202. package/dist/s10-inference/providers/anthropic.d.ts +13 -0
  203. package/dist/s10-inference/providers/anthropic.d.ts.map +1 -0
  204. package/dist/s10-inference/providers/anthropic.js +168 -0
  205. package/dist/s10-inference/providers/anthropic.js.map +1 -0
  206. package/dist/s10-inference/providers/ollama.d.ts +9 -0
  207. package/dist/s10-inference/providers/ollama.d.ts.map +1 -0
  208. package/dist/s10-inference/providers/ollama.js +102 -0
  209. package/dist/s10-inference/providers/ollama.js.map +1 -0
  210. package/dist/s10-inference/providers/openai.d.ts +14 -0
  211. package/dist/s10-inference/providers/openai.d.ts.map +1 -0
  212. package/dist/s10-inference/providers/openai.js +172 -0
  213. package/dist/s10-inference/providers/openai.js.map +1 -0
  214. package/dist/s11-transport/index.d.ts +4 -0
  215. package/dist/s11-transport/index.d.ts.map +1 -0
  216. package/dist/s11-transport/index.js +4 -0
  217. package/dist/s11-transport/index.js.map +1 -0
  218. package/dist/s11-transport/room.d.ts +28 -0
  219. package/dist/s11-transport/room.d.ts.map +1 -0
  220. package/dist/s11-transport/room.js +69 -0
  221. package/dist/s11-transport/room.js.map +1 -0
  222. package/dist/s11-transport/transport.d.ts +20 -0
  223. package/dist/s11-transport/transport.d.ts.map +1 -0
  224. package/dist/s11-transport/transport.js +39 -0
  225. package/dist/s11-transport/transport.js.map +1 -0
  226. package/dist/s11-transport/ws.d.ts +15 -0
  227. package/dist/s11-transport/ws.d.ts.map +1 -0
  228. package/dist/s11-transport/ws.js +71 -0
  229. package/dist/s11-transport/ws.js.map +1 -0
  230. package/dist/s12-versioncontrol/index.d.ts +4 -0
  231. package/dist/s12-versioncontrol/index.d.ts.map +1 -0
  232. package/dist/s12-versioncontrol/index.js +3 -0
  233. package/dist/s12-versioncontrol/index.js.map +1 -0
  234. package/dist/s12-versioncontrol/ledger-dag.d.ts +25 -0
  235. package/dist/s12-versioncontrol/ledger-dag.d.ts.map +1 -0
  236. package/dist/s12-versioncontrol/ledger-dag.js +84 -0
  237. package/dist/s12-versioncontrol/ledger-dag.js.map +1 -0
  238. package/dist/s12-versioncontrol/merkle.d.ts +16 -0
  239. package/dist/s12-versioncontrol/merkle.d.ts.map +1 -0
  240. package/dist/s12-versioncontrol/merkle.js +81 -0
  241. package/dist/s12-versioncontrol/merkle.js.map +1 -0
  242. package/dist/s12-versioncontrol/types.d.ts +50 -0
  243. package/dist/s12-versioncontrol/types.d.ts.map +1 -0
  244. package/dist/s12-versioncontrol/types.js +8 -0
  245. package/dist/s12-versioncontrol/types.js.map +1 -0
  246. package/dist/touches/audio-tap.d.ts +32 -0
  247. package/dist/touches/audio-tap.d.ts.map +1 -0
  248. package/dist/touches/audio-tap.js +54 -0
  249. package/dist/touches/audio-tap.js.map +1 -0
  250. package/dist/touches/avatar-state.d.ts +22 -0
  251. package/dist/touches/avatar-state.d.ts.map +1 -0
  252. package/dist/touches/avatar-state.js +35 -0
  253. package/dist/touches/avatar-state.js.map +1 -0
  254. package/dist/touches/container-room.d.ts +17 -0
  255. package/dist/touches/container-room.d.ts.map +1 -0
  256. package/dist/touches/container-room.js +34 -0
  257. package/dist/touches/container-room.js.map +1 -0
  258. package/dist/touches/cost-billing.d.ts +20 -0
  259. package/dist/touches/cost-billing.d.ts.map +1 -0
  260. package/dist/touches/cost-billing.js +26 -0
  261. package/dist/touches/cost-billing.js.map +1 -0
  262. package/dist/touches/cost-track.d.ts +19 -0
  263. package/dist/touches/cost-track.d.ts.map +1 -0
  264. package/dist/touches/cost-track.js +20 -0
  265. package/dist/touches/cost-track.js.map +1 -0
  266. package/dist/touches/crdt-sync.d.ts +14 -0
  267. package/dist/touches/crdt-sync.d.ts.map +1 -0
  268. package/dist/touches/crdt-sync.js +49 -0
  269. package/dist/touches/crdt-sync.js.map +1 -0
  270. package/dist/touches/identity-gate.d.ts +22 -0
  271. package/dist/touches/identity-gate.d.ts.map +1 -0
  272. package/dist/touches/identity-gate.js +24 -0
  273. package/dist/touches/identity-gate.js.map +1 -0
  274. package/dist/touches/index.d.ts +14 -0
  275. package/dist/touches/index.d.ts.map +1 -0
  276. package/dist/touches/index.js +14 -0
  277. package/dist/touches/index.js.map +1 -0
  278. package/dist/touches/memory-persist.d.ts +29 -0
  279. package/dist/touches/memory-persist.d.ts.map +1 -0
  280. package/dist/touches/memory-persist.js +49 -0
  281. package/dist/touches/memory-persist.js.map +1 -0
  282. package/dist/touches/messenger-bridge.d.ts +19 -0
  283. package/dist/touches/messenger-bridge.d.ts.map +1 -0
  284. package/dist/touches/messenger-bridge.js +49 -0
  285. package/dist/touches/messenger-bridge.js.map +1 -0
  286. package/dist/touches/sentiment-tap.d.ts +43 -0
  287. package/dist/touches/sentiment-tap.d.ts.map +1 -0
  288. package/dist/touches/sentiment-tap.js +81 -0
  289. package/dist/touches/sentiment-tap.js.map +1 -0
  290. package/dist/touches/stichwort.d.ts +46 -0
  291. package/dist/touches/stichwort.d.ts.map +1 -0
  292. package/dist/touches/stichwort.js +64 -0
  293. package/dist/touches/stichwort.js.map +1 -0
  294. package/dist/touches/transport-signal.d.ts +26 -0
  295. package/dist/touches/transport-signal.d.ts.map +1 -0
  296. package/dist/touches/transport-signal.js +49 -0
  297. package/dist/touches/transport-signal.js.map +1 -0
  298. package/dist/touches/version-persist.d.ts +18 -0
  299. package/dist/touches/version-persist.d.ts.map +1 -0
  300. package/dist/touches/version-persist.js +38 -0
  301. package/dist/touches/version-persist.js.map +1 -0
  302. package/dist/types.d.ts +61 -0
  303. package/dist/types.d.ts.map +1 -0
  304. package/dist/types.js +13 -0
  305. package/dist/types.js.map +1 -0
  306. package/package.json +117 -0
@@ -0,0 +1,53 @@
1
+ /**
2
+ * S7 — Identity & Consent
3
+ *
4
+ * Consent ist nicht ein Subsystem. Consent IST Autorisierung.
5
+ * observe/assist/act sind OAuth2-Scopes in Verkleidung.
6
+ *
7
+ * Session = Wer bist du + Was darfst du.
8
+ * Kein Auth0. Kein Clerk. UUID-Tokens in V1, Passkeys in V2.
9
+ *
10
+ * K4: Gate bleibt rein consent-basiert. Quality-Checks (Confidence,
11
+ * Type-Validation) gehören in validate() der Action, nicht hierhin.
12
+ */
13
+ import type { Result } from '../types.js';
14
+ export type ConsentLevel = 'observe' | 'assist' | 'act';
15
+ /** Bekannte Features. Offen für Erweiterung wie EntryCategory. */
16
+ export type Feature = 'listening' | 'keyword_detection' | 'material_search' | 'ghost_drafting' | 'queue_suggest' | 'chat_private' | 'chat_room' | 'phantom_presence' | 'mirror_mode' | 'messenger_briefing' | 'file_access' | (string & {});
17
+ export type ConsentScope = {
18
+ feature: Feature;
19
+ level: ConsentLevel;
20
+ };
21
+ export type Session = {
22
+ id: string;
23
+ userId: string;
24
+ scopes: ConsentScope[];
25
+ createdAt: number;
26
+ };
27
+ export type AuditEntry = {
28
+ ts: number;
29
+ userId: string;
30
+ feature: string;
31
+ required: ConsentLevel;
32
+ granted: ConsentLevel;
33
+ allowed: boolean;
34
+ action: string;
35
+ /** Was passiert ist — z.B. 'queue_item_released', 'chat_sent' */
36
+ outcome?: string;
37
+ };
38
+ export type ConsentConfig = ReadonlyMap<Feature, ConsentLevel>;
39
+ export type Identity = {
40
+ createSession(userId: string, scopes?: ConsentScope[]): Session;
41
+ /** Initialisiert Session mit Default-Scopes für einen neuen User */
42
+ initDefaults(userId: string): Session;
43
+ checkConsent(session: Session, feature: Feature, required: ConsentLevel): Result<true, string>;
44
+ /** Loggt ein Audit-Ergebnis NACH einer Aktion (outcome-Feld) */
45
+ recordOutcome(session: Session, feature: Feature, outcome: string): void;
46
+ setScope(session: Session, feature: Feature, level: ConsentLevel): void;
47
+ /** Gibt die aktuelle Consent-Konfiguration eines Users zurück */
48
+ getConfig(session: Session): ConsentConfig;
49
+ getAudit(userId: string): readonly AuditEntry[];
50
+ };
51
+ export declare const DEFAULT_SCOPES: readonly ConsentScope[];
52
+ export declare function createIdentity(): Identity;
53
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/s07-identity/session.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKzC,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,CAAA;AAEvD,kEAAkE;AAClE,MAAM,MAAM,OAAO,GACf,WAAW,GACX,mBAAmB,GACnB,iBAAiB,GACjB,gBAAgB,GAChB,eAAe,GACf,cAAc,GACd,WAAW,GACX,kBAAkB,GAClB,aAAa,GACb,oBAAoB,GACpB,aAAa,GACb,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAQjB,MAAM,MAAM,YAAY,GAAG;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,OAAO,GAAG;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,YAAY,EAAE,CAAA;IACtB,SAAS,EAAE,MAAM,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,YAAY,CAAA;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;AAE9D,MAAM,MAAM,QAAQ,GAAG;IACrB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,GAAG,OAAO,CAAA;IAC/D,oEAAoE;IACpE,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACrC,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC9F,gEAAgE;IAChE,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACxE,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CAAA;IACvE,iEAAiE;IACjE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,CAAA;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,UAAU,EAAE,CAAA;CAChD,CAAA;AAID,eAAO,MAAM,cAAc,EAAE,SAAS,YAAY,EAYjD,CAAA;AAID,wBAAgB,cAAc,IAAI,QAAQ,CAsFzC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * S7 — Identity & Consent
3
+ *
4
+ * Consent ist nicht ein Subsystem. Consent IST Autorisierung.
5
+ * observe/assist/act sind OAuth2-Scopes in Verkleidung.
6
+ *
7
+ * Session = Wer bist du + Was darfst du.
8
+ * Kein Auth0. Kein Clerk. UUID-Tokens in V1, Passkeys in V2.
9
+ *
10
+ * K4: Gate bleibt rein consent-basiert. Quality-Checks (Confidence,
11
+ * Type-Validation) gehören in validate() der Action, nicht hierhin.
12
+ */
13
+ import { randomUUID } from 'node:crypto';
14
+ import { ok, err } from '../types.js';
15
+ const LEVEL_RANK = {
16
+ observe: 0,
17
+ assist: 1,
18
+ act: 2,
19
+ };
20
+ // ── Defaults ────────────────────────────────────────────────
21
+ export const DEFAULT_SCOPES = [
22
+ { feature: 'listening', level: 'observe' },
23
+ { feature: 'keyword_detection', level: 'observe' },
24
+ { feature: 'material_search', level: 'assist' },
25
+ { feature: 'queue_suggest', level: 'assist' },
26
+ { feature: 'chat_private', level: 'assist' },
27
+ { feature: 'chat_room', level: 'observe' },
28
+ { feature: 'messenger_briefing', level: 'assist' },
29
+ { feature: 'file_access', level: 'observe' },
30
+ { feature: 'ghost_drafting', level: 'observe' },
31
+ { feature: 'phantom_presence', level: 'observe' },
32
+ { feature: 'mirror_mode', level: 'observe' },
33
+ ];
34
+ // ── Implementation ──────────────────────────────────────────
35
+ export function createIdentity() {
36
+ const audit = [];
37
+ return {
38
+ createSession(userId, scopes) {
39
+ return {
40
+ id: randomUUID(),
41
+ userId,
42
+ scopes: scopes ?? DEFAULT_SCOPES.map(s => ({ ...s })),
43
+ createdAt: Date.now(),
44
+ };
45
+ },
46
+ initDefaults(userId) {
47
+ // Direkt statt this.createSession — sicher bei Destrukturierung
48
+ return {
49
+ id: randomUUID(),
50
+ userId,
51
+ scopes: DEFAULT_SCOPES.map(s => ({ ...s })),
52
+ createdAt: Date.now(),
53
+ };
54
+ },
55
+ checkConsent(session, feature, required) {
56
+ const scope = session.scopes.find(s => s.feature === feature);
57
+ const granted = scope?.level ?? 'observe';
58
+ const allowed = LEVEL_RANK[granted] >= LEVEL_RANK[required];
59
+ audit.push({
60
+ ts: Date.now(),
61
+ userId: session.userId,
62
+ feature,
63
+ required,
64
+ granted,
65
+ allowed,
66
+ action: allowed ? 'granted' : 'denied',
67
+ });
68
+ return allowed
69
+ ? ok(true)
70
+ : err(`Consent ${required} required for ${feature}, but only ${granted} granted`);
71
+ },
72
+ recordOutcome(session, feature, outcome) {
73
+ // Finde den letzten Audit-Eintrag für diesen User+Feature und ergänze outcome
74
+ for (let i = audit.length - 1; i >= 0; i--) {
75
+ const entry = audit[i];
76
+ if (entry.userId === session.userId && entry.feature === feature && !entry.outcome) {
77
+ entry.outcome = outcome;
78
+ return;
79
+ }
80
+ }
81
+ // Kein passender Eintrag → neuen anlegen (standalone outcome)
82
+ audit.push({
83
+ ts: Date.now(),
84
+ userId: session.userId,
85
+ feature,
86
+ required: 'observe',
87
+ granted: session.scopes.find(s => s.feature === feature)?.level ?? 'observe',
88
+ allowed: true,
89
+ action: 'outcome_recorded',
90
+ outcome,
91
+ });
92
+ },
93
+ setScope(session, feature, level) {
94
+ const existing = session.scopes.find(s => s.feature === feature);
95
+ if (existing) {
96
+ existing.level = level;
97
+ }
98
+ else {
99
+ session.scopes.push({ feature, level });
100
+ }
101
+ },
102
+ getConfig(session) {
103
+ const config = new Map();
104
+ for (const scope of session.scopes) {
105
+ config.set(scope.feature, scope.level);
106
+ }
107
+ return config;
108
+ },
109
+ getAudit(userId) {
110
+ return audit.filter(a => a.userId === userId);
111
+ },
112
+ };
113
+ }
114
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/s07-identity/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * S8 — Docker Sandbox
3
+ *
4
+ * Zweite Sandbox-Implementierung. Production-fähig.
5
+ * Selbes Interface wie In-Memory. Austauschbar.
6
+ *
7
+ * Design: DockerClient als DI — kein Dockerode/Docker SDK Import.
8
+ * Consumer übergibt den Client. Foundation bleibt frei von Docker-Deps.
9
+ */
10
+ import type { Sandbox } from './types.js';
11
+ /** Docker-kompatibles Client-Interface */
12
+ export type DockerClient = {
13
+ createContainer(params: {
14
+ name: string;
15
+ image: string;
16
+ env?: Record<string, string>;
17
+ cpuLimit?: number;
18
+ memoryLimit?: number;
19
+ gpuDevices?: string[];
20
+ }): Promise<{
21
+ containerId: string;
22
+ }>;
23
+ startContainer(containerId: string): Promise<void>;
24
+ stopContainer(containerId: string): Promise<void>;
25
+ removeContainer(containerId: string): Promise<void>;
26
+ inspectContainer(containerId: string): Promise<{
27
+ status: 'running' | 'stopped' | 'created' | 'exited';
28
+ startedAt?: number;
29
+ stoppedAt?: number;
30
+ } | null>;
31
+ };
32
+ export type DockerSandboxConfig = {
33
+ /** Default Docker Image für Room-Container */
34
+ defaultImage?: string;
35
+ /** GPU Device IDs die verfügbar sind */
36
+ gpuDevices?: string[];
37
+ };
38
+ export declare function createDockerSandbox(docker: DockerClient, config?: DockerSandboxConfig): Sandbox;
39
+ //# sourceMappingURL=docker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/s08-containers/docker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAkC,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzE,0CAA0C;AAC1C,MAAM,MAAM,YAAY,GAAG;IACzB,eAAe,CAAC,MAAM,EAAE;QACtB,IAAI,EAAE,MAAM,CAAA;QACZ,KAAK,EAAE,MAAM,CAAA;QACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KACtB,GAAG,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAEpC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAClD,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACjD,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAEnD,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;QAC7C,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;QACpD,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,SAAS,CAAC,EAAE,MAAM,CAAA;KACnB,GAAG,IAAI,CAAC,CAAA;CACV,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,8CAA8C;IAC9C,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAgET"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * S8 — Docker Sandbox
3
+ *
4
+ * Zweite Sandbox-Implementierung. Production-fähig.
5
+ * Selbes Interface wie In-Memory. Austauschbar.
6
+ *
7
+ * Design: DockerClient als DI — kein Dockerode/Docker SDK Import.
8
+ * Consumer übergibt den Client. Foundation bleibt frei von Docker-Deps.
9
+ */
10
+ import { ok, err } from '../types.js';
11
+ export function createDockerSandbox(docker, config) {
12
+ const containers = new Map();
13
+ const defaultImage = config?.defaultImage ?? 'foundation-room:latest';
14
+ return {
15
+ async create(containerConfig) {
16
+ const result = await docker.createContainer({
17
+ name: `foundation-${containerConfig.id}`,
18
+ image: defaultImage,
19
+ env: containerConfig.env,
20
+ cpuLimit: containerConfig.limits.cpuMillicores,
21
+ memoryLimit: containerConfig.limits.memoryMb,
22
+ gpuDevices: containerConfig.limits.gpuMemoryMb ? config?.gpuDevices : undefined,
23
+ });
24
+ const info = { config: containerConfig, status: 'pending' };
25
+ containers.set(containerConfig.id, { dockerId: result.containerId, info });
26
+ return info;
27
+ },
28
+ async start(containerId) {
29
+ const entry = containers.get(containerId);
30
+ if (!entry)
31
+ return err(`Container ${containerId} not found`);
32
+ try {
33
+ await docker.startContainer(entry.dockerId);
34
+ entry.info.status = 'running';
35
+ entry.info.startedAt = Date.now();
36
+ return ok(undefined);
37
+ }
38
+ catch (e) {
39
+ entry.info.status = 'failed';
40
+ return err(`Docker start failed: ${e}`);
41
+ }
42
+ },
43
+ async stop(containerId) {
44
+ const entry = containers.get(containerId);
45
+ if (!entry)
46
+ return err(`Container ${containerId} not found`);
47
+ try {
48
+ await docker.stopContainer(entry.dockerId);
49
+ entry.info.status = 'stopped';
50
+ entry.info.stoppedAt = Date.now();
51
+ return ok(undefined);
52
+ }
53
+ catch (e) {
54
+ return err(`Docker stop failed: ${e}`);
55
+ }
56
+ },
57
+ async destroy(containerId) {
58
+ const entry = containers.get(containerId);
59
+ if (!entry)
60
+ return;
61
+ await docker.removeContainer(entry.dockerId).catch(() => { });
62
+ containers.delete(containerId);
63
+ },
64
+ status(containerId) {
65
+ return containers.get(containerId)?.info;
66
+ },
67
+ list() {
68
+ return Array.from(containers.values()).map(e => e.info);
69
+ },
70
+ };
71
+ }
72
+ //# sourceMappingURL=docker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker.js","sourceRoot":"","sources":["../../src/s08-containers/docker.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAgCrC,MAAM,UAAU,mBAAmB,CACjC,MAAoB,EACpB,MAA4B;IAE5B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAqD,CAAA;IAC/E,MAAM,YAAY,GAAG,MAAM,EAAE,YAAY,IAAI,wBAAwB,CAAA;IAErE,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,eAAe;YAC1B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC;gBAC1C,IAAI,EAAE,cAAc,eAAe,CAAC,EAAE,EAAE;gBACxC,KAAK,EAAE,YAAY;gBACnB,GAAG,EAAE,eAAe,CAAC,GAAG;gBACxB,QAAQ,EAAE,eAAe,CAAC,MAAM,CAAC,aAAa;gBAC9C,WAAW,EAAE,eAAe,CAAC,MAAM,CAAC,QAAQ;gBAC5C,UAAU,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS;aAChF,CAAC,CAAA;YAEF,MAAM,IAAI,GAAkB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;YAC1E,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAA;YAC1E,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,WAAW;YACrB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAO,GAAG,CAAC,aAAa,WAAW,YAAY,CAAC,CAAA;YAE5D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAC3C,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;gBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACjC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;YACtB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,QAAQ,CAAA;gBAC5B,OAAO,GAAG,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAA;YACzC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW;YACpB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAO,GAAG,CAAC,aAAa,WAAW,YAAY,CAAC,CAAA;YAE5D,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAC1C,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;gBAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACjC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;YACtB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,GAAG,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,WAAW;YACvB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACzC,IAAI,CAAC,KAAK;gBAAE,OAAM;YAClB,MAAM,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YAC5D,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,CAAC,WAAW;YAChB,OAAO,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,CAAA;QAC1C,CAAC;QAED,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACzD,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { type IsolationLevel, type ResourceLimit, type ContainerConfig, type ContainerStatus, type ContainerInfo, type Sandbox, type GpuScheduler, } from './types.js';
2
+ export { createSandbox, createGpuScheduler } from './sandbox.js';
3
+ export { type DockerClient, type DockerSandboxConfig, createDockerSandbox } from './docker.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/s08-containers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,YAAY,GAClB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { createSandbox, createGpuScheduler } from './sandbox.js';
2
+ export { createDockerSandbox } from './docker.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/s08-containers/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAChE,OAAO,EAA+C,mBAAmB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * S8 — In-Memory Sandbox + GPU Scheduler
3
+ *
4
+ * Erste Implementierung. OCI/Docker Runtime sind Alternativen.
5
+ * In-Memory Sandbox simuliert Container-Lifecycle für Tests und Single-Node.
6
+ */
7
+ import type { GpuScheduler, Sandbox } from './types.js';
8
+ export declare function createSandbox(): Sandbox;
9
+ export declare function createGpuScheduler(totalGpuMemoryMb: number): GpuScheduler;
10
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/s08-containers/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAGV,YAAY,EACZ,OAAO,EACR,MAAM,YAAY,CAAA;AAEnB,wBAAgB,aAAa,IAAI,OAAO,CAsCvC;AAED,wBAAgB,kBAAkB,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,CA2BzE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * S8 — In-Memory Sandbox + GPU Scheduler
3
+ *
4
+ * Erste Implementierung. OCI/Docker Runtime sind Alternativen.
5
+ * In-Memory Sandbox simuliert Container-Lifecycle für Tests und Single-Node.
6
+ */
7
+ import { ok, err } from '../types.js';
8
+ export function createSandbox() {
9
+ const containers = new Map();
10
+ return {
11
+ async create(config) {
12
+ const info = { config, status: 'pending' };
13
+ containers.set(config.id, info);
14
+ return info;
15
+ },
16
+ async start(containerId) {
17
+ const info = containers.get(containerId);
18
+ if (!info)
19
+ return err(`Container ${containerId} not found`);
20
+ info.status = 'running';
21
+ info.startedAt = Date.now();
22
+ return ok(undefined);
23
+ },
24
+ async stop(containerId) {
25
+ const info = containers.get(containerId);
26
+ if (!info)
27
+ return err(`Container ${containerId} not found`);
28
+ info.status = 'stopped';
29
+ info.stoppedAt = Date.now();
30
+ return ok(undefined);
31
+ },
32
+ async destroy(containerId) {
33
+ containers.delete(containerId);
34
+ },
35
+ status(containerId) {
36
+ return containers.get(containerId);
37
+ },
38
+ list() {
39
+ return Array.from(containers.values());
40
+ },
41
+ };
42
+ }
43
+ export function createGpuScheduler(totalGpuMemoryMb) {
44
+ const allocs = new Map();
45
+ return {
46
+ allocate(containerId, gpuMemoryMb) {
47
+ const used = Array.from(allocs.values()).reduce((s, m) => s + m, 0);
48
+ if (used + gpuMemoryMb > totalGpuMemoryMb)
49
+ return false;
50
+ allocs.set(containerId, gpuMemoryMb);
51
+ return true;
52
+ },
53
+ release(containerId) {
54
+ allocs.delete(containerId);
55
+ },
56
+ available() {
57
+ const used = Array.from(allocs.values()).reduce((s, m) => s + m, 0);
58
+ return totalGpuMemoryMb - used;
59
+ },
60
+ allocations() {
61
+ return Array.from(allocs.entries()).map(([containerId, gpuMemoryMb]) => ({
62
+ containerId,
63
+ gpuMemoryMb,
64
+ }));
65
+ },
66
+ };
67
+ }
68
+ //# sourceMappingURL=sandbox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/s08-containers/sandbox.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAQrC,MAAM,UAAU,aAAa;IAC3B,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAA;IAEnD,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,MAAM;YACjB,MAAM,IAAI,GAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;YACzD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC/B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,WAAW;YACrB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,aAAa,WAAW,YAAY,CAAC,CAAA;YAC3D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC3B,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,WAAW;YACpB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;YACxC,IAAI,CAAC,IAAI;gBAAE,OAAO,GAAG,CAAC,aAAa,WAAW,YAAY,CAAC,CAAA;YAC3D,IAAI,CAAC,MAAM,GAAG,SAAS,CAAA;YACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC3B,OAAO,EAAE,CAAC,SAAS,CAAC,CAAA;QACtB,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,WAAW;YACvB,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAChC,CAAC;QAED,MAAM,CAAC,WAAW;YAChB,OAAO,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,CAAC;QAED,IAAI;YACF,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACxC,CAAC;KACF,CAAA;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,gBAAwB;IACzD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAA;IAExC,OAAO;QACL,QAAQ,CAAC,WAAW,EAAE,WAAW;YAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACnE,IAAI,IAAI,GAAG,WAAW,GAAG,gBAAgB;gBAAE,OAAO,KAAK,CAAA;YACvD,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;YACpC,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,CAAC,WAAW;YACjB,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAA;QAC5B,CAAC;QAED,SAAS;YACP,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;YACnE,OAAO,gBAAgB,GAAG,IAAI,CAAA;QAChC,CAAC;QAED,WAAW;YACT,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;gBACvE,WAAW;gBACX,WAAW;aACZ,CAAC,CAAC,CAAA;QACL,CAAC;KACF,CAAA;AACH,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * S8 — Containers Types
3
+ *
4
+ * Prozess-Isolation, Resource Limits, GPU-Scheduling.
5
+ * Interface first — OCI/Docker ist eine Implementierung.
6
+ */
7
+ import type { Result } from '../types.js';
8
+ export type IsolationLevel = 'none' | 'process' | 'container' | 'vm';
9
+ export type ResourceLimit = {
10
+ /** Max CPU in Millicores (1000 = 1 Core) */
11
+ cpuMillicores?: number;
12
+ /** Max RAM in MB */
13
+ memoryMb?: number;
14
+ /** Max GPU Memory in MB (für Inference) */
15
+ gpuMemoryMb?: number;
16
+ /** Max Disk in MB */
17
+ diskMb?: number;
18
+ /** Max Netzwerk-Bandwidth in Mbps */
19
+ networkMbps?: number;
20
+ };
21
+ export type ContainerConfig = {
22
+ id: string;
23
+ /** Was läuft in diesem Container */
24
+ role: 'room' | 'inference' | 'worker' | (string & {});
25
+ isolation: IsolationLevel;
26
+ limits: ResourceLimit;
27
+ /** Umgebungsvariablen */
28
+ env: Record<string, string>;
29
+ };
30
+ export type ContainerStatus = 'pending' | 'running' | 'stopped' | 'failed';
31
+ export type ContainerInfo = {
32
+ config: ContainerConfig;
33
+ status: ContainerStatus;
34
+ startedAt?: number;
35
+ stoppedAt?: number;
36
+ /** Aktuelle Auslastung */
37
+ usage?: {
38
+ cpuPercent: number;
39
+ memoryMb: number;
40
+ gpuMemoryMb?: number;
41
+ };
42
+ };
43
+ /** Sandbox Interface — Container-Lifecycle */
44
+ export type Sandbox = {
45
+ create(config: ContainerConfig): Promise<ContainerInfo>;
46
+ start(containerId: string): Promise<Result<void, string>>;
47
+ stop(containerId: string): Promise<Result<void, string>>;
48
+ destroy(containerId: string): Promise<void>;
49
+ status(containerId: string): ContainerInfo | undefined;
50
+ list(): ContainerInfo[];
51
+ };
52
+ /** GPU-Scheduler — verteilt GPU-Ressourcen auf Container */
53
+ export type GpuScheduler = {
54
+ /** Fordere GPU-Memory an. Gibt Container-ID zurück oder null wenn voll. */
55
+ allocate(containerId: string, gpuMemoryMb: number): boolean;
56
+ /** Gib GPU-Memory frei */
57
+ release(containerId: string): void;
58
+ /** Verfügbare GPU-Memory in MB */
59
+ available(): number;
60
+ /** Alle Allocations */
61
+ allocations(): {
62
+ containerId: string;
63
+ gpuMemoryMb: number;
64
+ }[];
65
+ };
66
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/s08-containers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEzC,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,IAAI,CAAA;AAEpE,MAAM,MAAM,aAAa,GAAG;IAC1B,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qBAAqB;IACrB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,oCAAoC;IACpC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IACrD,SAAS,EAAE,cAAc,CAAA;IACzB,MAAM,EAAE,aAAa,CAAA;IACrB,yBAAyB;IACzB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC5B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE1E,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,eAAe,CAAA;IACvB,MAAM,EAAE,eAAe,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,0BAA0B;IAC1B,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,CAAA;CACF,CAAA;AAED,8CAA8C;AAC9C,MAAM,MAAM,OAAO,GAAG;IACpB,MAAM,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACvD,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACzD,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACxD,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAAA;IACtD,IAAI,IAAI,aAAa,EAAE,CAAA;CACxB,CAAA;AAED,4DAA4D;AAC5D,MAAM,MAAM,YAAY,GAAG;IACzB,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAA;IAC3D,0BAA0B;IAC1B,OAAO,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,kCAAkC;IAClC,SAAS,IAAI,MAAM,CAAA;IACnB,uBAAuB;IACvB,WAAW,IAAI;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAC9D,CAAA"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * S8 — Containers Types
3
+ *
4
+ * Prozess-Isolation, Resource Limits, GPU-Scheduling.
5
+ * Interface first — OCI/Docker ist eine Implementierung.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/s08-containers/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * S9 — COLD Memory
3
+ *
4
+ * Content-Addressed Artifact Storage.
5
+ * Interface first, Filesystem als erste Implementierung.
6
+ * Observer-Korrektur K3: Gleiche Strategie wie Provider und Transport.
7
+ *
8
+ * COLD speichert immutable Blobs: Transcripts, Dokumente, Medien, Snapshots.
9
+ * Adressierung via Content-Hash (SHA-256) — S12 Seed.
10
+ *
11
+ * Observer-Fixes nach M2:
12
+ * - Alle Methoden async (Promise<Result>)
13
+ * - ArtifactType offen wie EntryCategory
14
+ * - retrieve() akzeptiert optionalen sessionId zur O(1)-Lookup
15
+ * - store() destrukturiert type sicher raus, kein Spread-Override
16
+ */
17
+ import type { Result } from '../types.js';
18
+ /** Offen für Erweiterung — gleiche Strategie wie EntryCategory */
19
+ export type ArtifactType = 'transcript' | 'document' | 'media' | 'snapshot' | (string & {});
20
+ export type ArtifactMeta = {
21
+ id: string;
22
+ sessionId: string;
23
+ type: ArtifactType;
24
+ contentHash: string;
25
+ createdAt: number;
26
+ sizeBytes: number;
27
+ [key: string]: unknown;
28
+ };
29
+ export type StoreMeta = {
30
+ type: ArtifactType;
31
+ [key: string]: unknown;
32
+ };
33
+ export type ColdMemory = {
34
+ store(sessionId: string, data: Buffer | string, meta: StoreMeta): Promise<Result<ArtifactMeta, string>>;
35
+ retrieve(artifactId: string, sessionId?: string): Promise<Result<{
36
+ data: Buffer;
37
+ meta: ArtifactMeta;
38
+ }, string>>;
39
+ listBySession(sessionId: string): Promise<ArtifactMeta[]>;
40
+ exists(artifactId: string, sessionId?: string): Promise<boolean>;
41
+ };
42
+ export declare function createFsColdMemory(rootDir: string): ColdMemory;
43
+ //# sourceMappingURL=cold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cold.d.ts","sourceRoot":"","sources":["../../src/s09-persistence/cold.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAKzC,kEAAkE;AAClE,MAAM,MAAM,YAAY,GACpB,YAAY,GACZ,UAAU,GACV,OAAO,GACP,UAAU,GACV,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;AAEjB,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,YAAY,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,YAAY,CAAA;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG;IACvB,KAAK,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAA;IACvG,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,YAAY,CAAA;KAAE,EAAE,MAAM,CAAC,CAAC,CAAA;IAC/G,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAA;IACzD,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;CACjE,CAAA;AAQD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CA8G9D"}