@jungjaehoon/mama-os 0.75.0 → 0.76.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 (237) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/README.md +1 -1
  3. package/dist/api/code-act-actions.d.ts +3 -1
  4. package/dist/api/code-act-actions.d.ts.map +1 -1
  5. package/dist/api/code-act-actions.js +16 -7
  6. package/dist/api/code-act-actions.js.map +1 -1
  7. package/dist/api/document-actions.d.ts +13 -0
  8. package/dist/api/document-actions.d.ts.map +1 -0
  9. package/dist/api/document-actions.js +55 -0
  10. package/dist/api/document-actions.js.map +1 -0
  11. package/dist/api/member-enrollment.d.ts +7 -3
  12. package/dist/api/member-enrollment.d.ts.map +1 -1
  13. package/dist/api/member-enrollment.js +64 -16
  14. package/dist/api/member-enrollment.js.map +1 -1
  15. package/dist/api/member-export.d.ts.map +1 -1
  16. package/dist/api/member-export.js +14 -6
  17. package/dist/api/member-export.js.map +1 -1
  18. package/dist/api/member-lifecycle.d.ts +23 -4
  19. package/dist/api/member-lifecycle.d.ts.map +1 -1
  20. package/dist/api/member-lifecycle.js +88 -21
  21. package/dist/api/member-lifecycle.js.map +1 -1
  22. package/dist/api/member-notice-actions.d.ts +18 -0
  23. package/dist/api/member-notice-actions.d.ts.map +1 -0
  24. package/dist/api/member-notice-actions.js +184 -0
  25. package/dist/api/member-notice-actions.js.map +1 -0
  26. package/dist/api/member-records.d.ts +17 -2
  27. package/dist/api/member-records.d.ts.map +1 -1
  28. package/dist/api/member-records.js +440 -82
  29. package/dist/api/member-records.js.map +1 -1
  30. package/dist/api/member-share-actions.d.ts +3 -3
  31. package/dist/api/member-share-actions.d.ts.map +1 -1
  32. package/dist/api/member-share-actions.js +47 -20
  33. package/dist/api/member-share-actions.js.map +1 -1
  34. package/dist/api/owner-policy-actions.d.ts +1 -0
  35. package/dist/api/owner-policy-actions.d.ts.map +1 -1
  36. package/dist/api/owner-policy-actions.js +8 -4
  37. package/dist/api/owner-policy-actions.js.map +1 -1
  38. package/dist/api/owner-timezone-actions.d.ts +3 -2
  39. package/dist/api/owner-timezone-actions.d.ts.map +1 -1
  40. package/dist/api/owner-timezone-actions.js +4 -6
  41. package/dist/api/owner-timezone-actions.js.map +1 -1
  42. package/dist/api/personal-job-actions.d.ts +6 -0
  43. package/dist/api/personal-job-actions.d.ts.map +1 -0
  44. package/dist/api/personal-job-actions.js +72 -0
  45. package/dist/api/personal-job-actions.js.map +1 -0
  46. package/dist/api/security-events.d.ts +6 -1
  47. package/dist/api/security-events.d.ts.map +1 -1
  48. package/dist/api/security-events.js +34 -15
  49. package/dist/api/security-events.js.map +1 -1
  50. package/dist/api/skill-actions.d.ts +5 -0
  51. package/dist/api/skill-actions.d.ts.map +1 -0
  52. package/dist/api/skill-actions.js +66 -0
  53. package/dist/api/skill-actions.js.map +1 -0
  54. package/dist/api/source-actions.d.ts.map +1 -1
  55. package/dist/api/source-actions.js +4 -2
  56. package/dist/api/source-actions.js.map +1 -1
  57. package/dist/api/stored-source-reader.d.ts.map +1 -1
  58. package/dist/api/stored-source-reader.js +9 -2
  59. package/dist/api/stored-source-reader.js.map +1 -1
  60. package/dist/api/trello-actions.d.ts.map +1 -1
  61. package/dist/api/trello-actions.js +8 -2
  62. package/dist/api/trello-actions.js.map +1 -1
  63. package/dist/api/work-actions.d.ts +12 -2
  64. package/dist/api/work-actions.d.ts.map +1 -1
  65. package/dist/api/work-actions.js +57 -10
  66. package/dist/api/work-actions.js.map +1 -1
  67. package/dist/cli/commands/daemon.d.ts +12 -2
  68. package/dist/cli/commands/daemon.d.ts.map +1 -1
  69. package/dist/cli/commands/daemon.js +76 -12
  70. package/dist/cli/commands/daemon.js.map +1 -1
  71. package/dist/cli/commands/init.d.ts +4 -0
  72. package/dist/cli/commands/init.d.ts.map +1 -1
  73. package/dist/cli/commands/init.js +23 -0
  74. package/dist/cli/commands/init.js.map +1 -1
  75. package/dist/cli/commands/tools.d.ts +12 -0
  76. package/dist/cli/commands/tools.d.ts.map +1 -0
  77. package/dist/cli/commands/tools.js +109 -0
  78. package/dist/cli/commands/tools.js.map +1 -0
  79. package/dist/cli/index.js +6 -1
  80. package/dist/cli/index.js.map +1 -1
  81. package/dist/connectors/framework/polling-scheduler.d.ts +6 -1
  82. package/dist/connectors/framework/polling-scheduler.d.ts.map +1 -1
  83. package/dist/connectors/framework/polling-scheduler.js +25 -3
  84. package/dist/connectors/framework/polling-scheduler.js.map +1 -1
  85. package/dist/connectors/framework/stored-index-read.d.ts +2 -2
  86. package/dist/connectors/framework/stored-index-read.d.ts.map +1 -1
  87. package/dist/connectors/framework/stored-index-read.js +10 -3
  88. package/dist/connectors/framework/stored-index-read.js.map +1 -1
  89. package/dist/gateways/base-gateway.d.ts +7 -0
  90. package/dist/gateways/base-gateway.d.ts.map +1 -1
  91. package/dist/gateways/base-gateway.js +24 -0
  92. package/dist/gateways/base-gateway.js.map +1 -1
  93. package/dist/gateways/discord.d.ts +4 -0
  94. package/dist/gateways/discord.d.ts.map +1 -1
  95. package/dist/gateways/discord.js +24 -6
  96. package/dist/gateways/discord.js.map +1 -1
  97. package/dist/gateways/slack.d.ts +3 -0
  98. package/dist/gateways/slack.d.ts.map +1 -1
  99. package/dist/gateways/slack.js +15 -2
  100. package/dist/gateways/slack.js.map +1 -1
  101. package/dist/gateways/telegram-errors.d.ts +3 -0
  102. package/dist/gateways/telegram-errors.d.ts.map +1 -1
  103. package/dist/gateways/telegram-errors.js +5 -0
  104. package/dist/gateways/telegram-errors.js.map +1 -1
  105. package/dist/gateways/telegram-message-ledger.d.ts +7 -0
  106. package/dist/gateways/telegram-message-ledger.d.ts.map +1 -1
  107. package/dist/gateways/telegram-message-ledger.js +27 -2
  108. package/dist/gateways/telegram-message-ledger.js.map +1 -1
  109. package/dist/gateways/telegram.d.ts +24 -6
  110. package/dist/gateways/telegram.d.ts.map +1 -1
  111. package/dist/gateways/telegram.js +258 -44
  112. package/dist/gateways/telegram.js.map +1 -1
  113. package/dist/gateways/turn-contract.d.ts +6 -0
  114. package/dist/gateways/turn-contract.d.ts.map +1 -1
  115. package/dist/runtime/action-surface.d.ts +28 -3
  116. package/dist/runtime/action-surface.d.ts.map +1 -1
  117. package/dist/runtime/action-surface.js +310 -34
  118. package/dist/runtime/action-surface.js.map +1 -1
  119. package/dist/runtime/backend-security.d.ts +4 -0
  120. package/dist/runtime/backend-security.d.ts.map +1 -1
  121. package/dist/runtime/backend-security.js +8 -1
  122. package/dist/runtime/backend-security.js.map +1 -1
  123. package/dist/runtime/config.d.ts +1 -0
  124. package/dist/runtime/config.d.ts.map +1 -1
  125. package/dist/runtime/config.js +11 -0
  126. package/dist/runtime/config.js.map +1 -1
  127. package/dist/runtime/connectors.js +1 -1
  128. package/dist/runtime/connectors.js.map +1 -1
  129. package/dist/runtime/egress-proxy.d.ts +3 -3
  130. package/dist/runtime/egress-proxy.d.ts.map +1 -1
  131. package/dist/runtime/egress-proxy.js +16 -3
  132. package/dist/runtime/egress-proxy.js.map +1 -1
  133. package/dist/runtime/member-paths.d.ts +9 -1
  134. package/dist/runtime/member-paths.d.ts.map +1 -1
  135. package/dist/runtime/member-paths.js +67 -5
  136. package/dist/runtime/member-paths.js.map +1 -1
  137. package/dist/runtime/member-session.d.ts +21 -21
  138. package/dist/runtime/member-session.d.ts.map +1 -1
  139. package/dist/runtime/member-session.js +289 -34
  140. package/dist/runtime/member-session.js.map +1 -1
  141. package/dist/runtime/member-system-prompt.d.ts +1 -0
  142. package/dist/runtime/member-system-prompt.d.ts.map +1 -1
  143. package/dist/runtime/member-system-prompt.js +22 -4
  144. package/dist/runtime/member-system-prompt.js.map +1 -1
  145. package/dist/runtime/native-session.d.ts +6 -0
  146. package/dist/runtime/native-session.d.ts.map +1 -1
  147. package/dist/runtime/native-session.js +80 -13
  148. package/dist/runtime/native-session.js.map +1 -1
  149. package/dist/runtime/outbound-attempts.d.ts +5 -2
  150. package/dist/runtime/outbound-attempts.d.ts.map +1 -1
  151. package/dist/runtime/outbound-attempts.js +3 -2
  152. package/dist/runtime/outbound-attempts.js.map +1 -1
  153. package/dist/runtime/owner-authority.d.ts +14 -14
  154. package/dist/runtime/owner-authority.d.ts.map +1 -1
  155. package/dist/runtime/owner-authority.js +159 -7
  156. package/dist/runtime/owner-authority.js.map +1 -1
  157. package/dist/runtime/owner-runtime.d.ts +16 -5
  158. package/dist/runtime/owner-runtime.d.ts.map +1 -1
  159. package/dist/runtime/owner-runtime.js +426 -43
  160. package/dist/runtime/owner-runtime.js.map +1 -1
  161. package/dist/runtime/owner-system-prompt.d.ts +3 -1
  162. package/dist/runtime/owner-system-prompt.d.ts.map +1 -1
  163. package/dist/runtime/owner-system-prompt.js +15 -5
  164. package/dist/runtime/owner-system-prompt.js.map +1 -1
  165. package/dist/runtime/personal-job-cron.d.ts +6 -0
  166. package/dist/runtime/personal-job-cron.d.ts.map +1 -0
  167. package/dist/runtime/personal-job-cron.js +154 -0
  168. package/dist/runtime/personal-job-cron.js.map +1 -0
  169. package/dist/runtime/personal-jobs.d.ts +107 -0
  170. package/dist/runtime/personal-jobs.d.ts.map +1 -0
  171. package/dist/runtime/personal-jobs.js +353 -0
  172. package/dist/runtime/personal-jobs.js.map +1 -0
  173. package/dist/runtime/personal-notices.d.ts +38 -0
  174. package/dist/runtime/personal-notices.d.ts.map +1 -0
  175. package/dist/runtime/personal-notices.js +137 -0
  176. package/dist/runtime/personal-notices.js.map +1 -0
  177. package/dist/runtime/personal-turns.d.ts +23 -0
  178. package/dist/runtime/personal-turns.d.ts.map +1 -0
  179. package/dist/runtime/personal-turns.js +51 -0
  180. package/dist/runtime/personal-turns.js.map +1 -0
  181. package/dist/runtime/principal-access.d.ts +8 -0
  182. package/dist/runtime/principal-access.d.ts.map +1 -1
  183. package/dist/runtime/principal-access.js +69 -2
  184. package/dist/runtime/principal-access.js.map +1 -1
  185. package/dist/runtime/principal-sessions.d.ts +16 -2
  186. package/dist/runtime/principal-sessions.d.ts.map +1 -1
  187. package/dist/runtime/principal-sessions.js +104 -21
  188. package/dist/runtime/principal-sessions.js.map +1 -1
  189. package/dist/runtime/skills.d.ts +86 -0
  190. package/dist/runtime/skills.d.ts.map +1 -0
  191. package/dist/runtime/skills.js +560 -0
  192. package/dist/runtime/skills.js.map +1 -0
  193. package/dist/runtime/stimulus-delivery.d.ts +21 -1
  194. package/dist/runtime/stimulus-delivery.d.ts.map +1 -1
  195. package/dist/runtime/stimulus-delivery.js +185 -18
  196. package/dist/runtime/stimulus-delivery.js.map +1 -1
  197. package/dist/runtime/tools-paths.d.ts +9 -0
  198. package/dist/runtime/tools-paths.d.ts.map +1 -0
  199. package/dist/runtime/tools-paths.js +98 -0
  200. package/dist/runtime/tools-paths.js.map +1 -0
  201. package/dist/runtime/turn-orders.d.ts +22 -2
  202. package/dist/runtime/turn-orders.d.ts.map +1 -1
  203. package/dist/runtime/turn-orders.js +60 -6
  204. package/dist/runtime/turn-orders.js.map +1 -1
  205. package/dist/storage/chat-sources.d.ts +21 -0
  206. package/dist/storage/chat-sources.d.ts.map +1 -1
  207. package/dist/storage/chat-sources.js +65 -3
  208. package/dist/storage/chat-sources.js.map +1 -1
  209. package/dist/tools/command-runner.d.ts +12 -0
  210. package/dist/tools/command-runner.d.ts.map +1 -0
  211. package/dist/tools/command-runner.js +65 -0
  212. package/dist/tools/command-runner.js.map +1 -0
  213. package/dist/tools/document-render.d.ts +24 -0
  214. package/dist/tools/document-render.d.ts.map +1 -0
  215. package/dist/tools/document-render.js +208 -0
  216. package/dist/tools/document-render.js.map +1 -0
  217. package/dist/tools/document-toolkit.d.ts +15 -0
  218. package/dist/tools/document-toolkit.d.ts.map +1 -0
  219. package/dist/tools/document-toolkit.js +501 -0
  220. package/dist/tools/document-toolkit.js.map +1 -0
  221. package/dist/tools/office-render.d.ts +28 -0
  222. package/dist/tools/office-render.d.ts.map +1 -0
  223. package/dist/tools/office-render.js +98 -0
  224. package/dist/tools/office-render.js.map +1 -0
  225. package/dist/tools/toolkit-process.d.ts +9 -0
  226. package/dist/tools/toolkit-process.d.ts.map +1 -0
  227. package/dist/tools/toolkit-process.js +148 -0
  228. package/dist/tools/toolkit-process.js.map +1 -0
  229. package/dist/tools/toolkit-state.d.ts +22 -0
  230. package/dist/tools/toolkit-state.d.ts.map +1 -0
  231. package/dist/tools/toolkit-state.js +116 -0
  232. package/dist/tools/toolkit-state.js.map +1 -0
  233. package/package.json +3 -2
  234. package/toolkit/inspect-office-zip.py +16 -0
  235. package/toolkit/rasterize.py +29 -0
  236. package/toolkit/requirements.lock +664 -0
  237. package/toolkit/smoke.py +32 -0
@@ -0,0 +1,353 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PersonalJobFinalFailure = exports.personalJobOccurrenceId = exports.personalJobSessionKey = void 0;
4
+ exports.personalJobPayload = personalJobPayload;
5
+ exports.createPersonalJobStore = createPersonalJobStore;
6
+ exports.createPersonalJobScheduler = createPersonalJobScheduler;
7
+ exports.deliverPersonalJobResult = deliverPersonalJobResult;
8
+ const node_crypto_1 = require("node:crypto");
9
+ const mama_core_1 = require("@jungjaehoon/mama-core");
10
+ const canonicalize_1 = require("@jungjaehoon/mama-core/canonicalize");
11
+ const personal_job_cron_js_1 = require("./personal-job-cron.js");
12
+ const timezone_js_1 = require("./timezone.js");
13
+ const invalid_input_js_1 = require("../utils/invalid-input.js");
14
+ const personal_turns_js_1 = require("./personal-turns.js");
15
+ Object.defineProperty(exports, "PersonalJobFinalFailure", { enumerable: true, get: function () { return personal_turns_js_1.PersonalTurnFinalFailure; } });
16
+ const personalJobSessionKey = (principalId, jobId) => `member:${principalId}:job:${jobId}`;
17
+ exports.personalJobSessionKey = personalJobSessionKey;
18
+ const personalJobOccurrenceId = (jobId, at) => `job:${jobId}:${at}`;
19
+ exports.personalJobOccurrenceId = personalJobOccurrenceId;
20
+ function personalJobPayload(row) {
21
+ if (row.kind !== 'scheduled' || !row.channelKey.startsWith('job:'))
22
+ return null;
23
+ const value = row.payload;
24
+ if (!value ||
25
+ typeof value !== 'object' ||
26
+ Array.isArray(value) ||
27
+ typeof value.jobId !== 'string' ||
28
+ typeof value.version !== 'string' ||
29
+ typeof value.instruction !== 'string' ||
30
+ typeof value.timeZone !== 'string' ||
31
+ row.channelKey !== `job:${value.jobId}`)
32
+ throw new Error('Invalid personal job input');
33
+ return value;
34
+ }
35
+ /** Host-owned scheduling records use the same sole personal binding as P9 records. */
36
+ function createPersonalJobStore(adapter, timeZone) {
37
+ const list = (principalId) => {
38
+ const rows = adapter
39
+ .prepare(`SELECT d.id, d.payload_json FROM decisions d
40
+ JOIN memory_scope_bindings b ON b.memory_id=d.id
41
+ JOIN memory_scopes s ON s.id=b.scope_id
42
+ WHERE d.status='active' AND json_extract(d.payload_json, '$.type')='personal-job'
43
+ AND s.kind='user' AND s.external_id=?
44
+ AND NOT EXISTS (SELECT 1 FROM memory_scope_bindings other WHERE other.memory_id=d.id AND other.scope_id<>b.scope_id)
45
+ ORDER BY d.created_at, d.rowid`)
46
+ .all(principalId);
47
+ return rows.map((row) => {
48
+ const { type: _type, operation: _operation, ...job } = JSON.parse(row.payload_json);
49
+ return { ...job, recordId: row.id };
50
+ });
51
+ };
52
+ const find = (principalId, id) => list(principalId).find((job) => job.jobId === id);
53
+ const personalAccess = (access) => ({
54
+ ...access,
55
+ scopes: [{ kind: 'user', id: access.principalId }],
56
+ defaultScopes: [{ kind: 'user', id: access.principalId }],
57
+ readScopes: [],
58
+ });
59
+ const write = async (job, access, commandId, previous, context, operation) => {
60
+ const { recordId: _recordId, ...payload } = job;
61
+ const receipt = await (0, mama_core_1.appendJudgment)({
62
+ commandId,
63
+ topic: `personal-job/${job.jobId}`,
64
+ recordKind: 'judgment',
65
+ summary: job.instruction,
66
+ payload: {
67
+ type: 'personal-job',
68
+ ...payload,
69
+ ...(operation ? { operation } : {}),
70
+ },
71
+ scopes: [{ kind: 'user', id: access.principalId }],
72
+ ...(previous
73
+ ? { replaces: [{ id: previous.recordId, reason: 'Personal job revision' }] }
74
+ : {}),
75
+ record: { kind: 'fact', status: 'active' },
76
+ provenance: {
77
+ tool_name: context?.session?.toolName ?? 'schedule.job',
78
+ source_message_ref: context?.session?.sourceMessageRef ?? null,
79
+ },
80
+ agentId: context ? access.agentId : 'host',
81
+ }, personalAccess(access), { adapter, embedder: null });
82
+ return { ...job, recordId: receipt.recordId };
83
+ };
84
+ const validate = (job, principalId, except) => {
85
+ (0, timezone_js_1.validateTimeZone)(job.timeZone);
86
+ (0, personal_job_cron_js_1.validateJobCron)(job.cron, job.timeZone, Date.now());
87
+ if (!job.instruction.trim())
88
+ throw (0, invalid_input_js_1.invalidInput)('A personal job requires an instruction');
89
+ if (job.enabled &&
90
+ list(principalId).filter((current) => current.enabled && current.jobId !== except).length >=
91
+ 10)
92
+ throw (0, invalid_input_js_1.invalidInput)('A person may have at most ten active jobs');
93
+ };
94
+ const view = (job) => ({
95
+ id: job.jobId,
96
+ cron: job.cron,
97
+ timeZone: job.timeZone,
98
+ instruction: job.instruction,
99
+ enabled: job.enabled,
100
+ nextOccurrence: job.enabled
101
+ ? `${(0, timezone_js_1.localNow)((0, personal_job_cron_js_1.cronOccurrences)(job.cron, job.timeZone, Date.now(), 1)[0], job.timeZone)} ${job.timeZone}`
102
+ : null,
103
+ lastCompletedOccurrence: job.lastCompletedAt === null
104
+ ? null
105
+ : `${(0, timezone_js_1.localNow)(job.lastCompletedAt, job.timeZone)} ${job.timeZone}`,
106
+ });
107
+ // Like work.link, recover the committed statement before reading mutable heads. The
108
+ // principal-bound command receipt selects the immutable revision, including its first reply.
109
+ const replay = (context, action, input) => {
110
+ const binding = adapter
111
+ .prepare('SELECT principal_id, action, receipt_key, erased_at FROM command_bindings WHERE command_id=?')
112
+ .get(context.operationId);
113
+ if (!binding)
114
+ return null;
115
+ if (binding.erased_at !== null)
116
+ throw new mama_core_1.JudgmentError('COMMAND_ERASED', 'The command belongs to an erased record');
117
+ const conflict = () => {
118
+ throw new mama_core_1.JudgmentError('COMMAND_CONFLICT', 'The command id is already bound to another request');
119
+ };
120
+ if (binding.principal_id !== context.access.principalId || binding.action !== 'judgment.append')
121
+ conflict();
122
+ const record = adapter
123
+ .prepare('SELECT payload_json FROM decisions WHERE id=?')
124
+ .get(binding.receipt_key);
125
+ const payload = JSON.parse(record.payload_json);
126
+ if (action === 'delete') {
127
+ if (typeof payload.amended !== 'string' ||
128
+ payload.status !== 'stale' ||
129
+ payload.reason !== 'The person deleted this job')
130
+ conflict();
131
+ const target = adapter
132
+ .prepare("SELECT json_extract(payload_json, '$.jobId') AS id FROM decisions WHERE id=? AND json_extract(payload_json, '$.type')='personal-job'")
133
+ .get(payload.amended);
134
+ if (!target || (0, canonicalize_1.canonicalizeJSON)(input) !== (0, canonicalize_1.canonicalizeJSON)({ id: target.id }))
135
+ conflict();
136
+ return { id: target.id, deleted: true };
137
+ }
138
+ if (payload.type !== 'personal-job' ||
139
+ payload.operation?.action !== action ||
140
+ (0, canonicalize_1.canonicalizeJSON)(payload.operation.input) !== (0, canonicalize_1.canonicalizeJSON)(input))
141
+ conflict();
142
+ return payload.operation.result;
143
+ };
144
+ const hostAccess = (principalId) => ({
145
+ principalId,
146
+ agentId: 'host',
147
+ scopes: [{ kind: 'user', id: principalId }],
148
+ actions: [],
149
+ });
150
+ const isClosed = (row) => adapter
151
+ .prepare('SELECT 1 FROM command_bindings WHERE command_id=? AND principal_id=? AND erased_at IS NULL')
152
+ .get(`job-close:${row.principalId}:${row.stimulusId}`, row.principalId) !== undefined;
153
+ const isSuperseded = (row) => {
154
+ const payload = personalJobPayload(row);
155
+ const job = find(row.principalId, payload.jobId);
156
+ return job?.version === payload.version && (job.lastClosedAt ?? 0) > row.occurredAt;
157
+ };
158
+ const finish = async (row, completed, access = hostAccess(row.principalId)) => {
159
+ const payload = personalJobPayload(row);
160
+ const job = find(row.principalId, payload.jobId);
161
+ if (!job || job.version !== payload.version || isClosed(row))
162
+ return;
163
+ await write({
164
+ ...job,
165
+ lastClosedAt: Math.max(job.lastClosedAt ?? 0, row.occurredAt),
166
+ ...(completed && (job.lastClosedAt ?? 0) < row.occurredAt
167
+ ? { lastCompletedAt: row.occurredAt }
168
+ : {}),
169
+ }, access, `job-close:${row.principalId}:${row.stimulusId}`, job);
170
+ };
171
+ return {
172
+ list,
173
+ find,
174
+ view,
175
+ isClosed,
176
+ isSuperseded,
177
+ isActive: (principalId) => (0, mama_core_1.createPrincipalRepository)(adapter).findById(principalId)?.status === 'active',
178
+ isOffboarded: (principalId) => (0, mama_core_1.createPrincipalRepository)(adapter).findById(principalId)?.status === 'offboarded',
179
+ close: (row) => finish(row, false),
180
+ resume: async (principalId, now) => {
181
+ for (const job of list(principalId))
182
+ await write({ ...job, scheduleFrom: now, version: (0, node_crypto_1.randomUUID)() }, hostAccess(principalId), `job-resume:${principalId}:${job.recordId}:${now}`, job);
183
+ },
184
+ create: async (body, context) => {
185
+ const committed = replay(context, 'create', body);
186
+ if (committed)
187
+ return committed;
188
+ const now = Date.now();
189
+ const job = {
190
+ jobId: (0, node_crypto_1.randomUUID)(),
191
+ cron: body.cron.trim(),
192
+ timeZone: body.timeZone ?? timeZone.get(),
193
+ instruction: body.instruction.trim(),
194
+ enabled: true,
195
+ createdAt: now,
196
+ scheduleFrom: now,
197
+ version: (0, node_crypto_1.randomUUID)(),
198
+ lastCompletedAt: null,
199
+ lastClosedAt: null,
200
+ };
201
+ validate(job, context.access.principalId);
202
+ const result = view(job);
203
+ await write(job, context.access, context.operationId, undefined, context, {
204
+ action: 'create',
205
+ input: body,
206
+ result,
207
+ });
208
+ return result;
209
+ },
210
+ update: async (body, context) => {
211
+ const committed = replay(context, 'update', body);
212
+ if (committed)
213
+ return committed;
214
+ const previous = find(context.access.principalId, body.id);
215
+ if (!previous)
216
+ throw (0, invalid_input_js_1.invalidInput)('This personal job does not exist');
217
+ const { id: _id, ...changes } = body;
218
+ const job = { ...previous, ...changes, scheduleFrom: Date.now(), version: (0, node_crypto_1.randomUUID)() };
219
+ validate(job, context.access.principalId, body.id);
220
+ const result = view(job);
221
+ await write(job, context.access, context.operationId, previous, context, {
222
+ action: 'update',
223
+ input: body,
224
+ result,
225
+ });
226
+ return result;
227
+ },
228
+ delete: async (id, context) => {
229
+ const committed = replay(context, 'delete', { id });
230
+ if (committed)
231
+ return committed;
232
+ const job = find(context.access.principalId, id);
233
+ if (!job)
234
+ throw (0, invalid_input_js_1.invalidInput)('This personal job does not exist');
235
+ await (0, mama_core_1.retireMemoryRecord)(adapter, { memoryId: job.recordId, status: 'stale', reason: 'The person deleted this job' }, personalAccess(context.access), context.operationId, context.session);
236
+ return { id, deleted: true };
237
+ },
238
+ complete: (row, access) => finish(row, true, access),
239
+ };
240
+ }
241
+ function createPersonalJobScheduler(ports) {
242
+ let timer;
243
+ let stopped = false;
244
+ const pending = new Set();
245
+ const tickOnce = async (now) => {
246
+ for (const person of (0, mama_core_1.createPrincipalRepository)(ports.adapter).listMembers()) {
247
+ if (stopped)
248
+ break;
249
+ try {
250
+ if (person.status !== 'active' || ports.blocked(person.principalId))
251
+ continue;
252
+ const due = ports.store.list(person.principalId).flatMap((job) => {
253
+ if (!job.enabled)
254
+ return [];
255
+ const at = (0, personal_job_cron_js_1.latestCronOccurrence)(job.cron, job.timeZone, now.getTime(), Math.max(job.scheduleFrom, job.lastClosedAt ?? job.createdAt));
256
+ return at === null ||
257
+ ports.mailbox.readInput((0, exports.personalJobOccurrenceId)(job.jobId, at), person.principalId)
258
+ ? []
259
+ : [{ job, at }];
260
+ });
261
+ if (due.length === 0)
262
+ continue;
263
+ // An unserved person is served through the member directory lane, which may wait for
264
+ // running member turns; the mailbox drops an occurrence an overlapping tick already took.
265
+ const intake = await ports.intake(person.principalId);
266
+ if (stopped)
267
+ return;
268
+ for (const { job, at } of due)
269
+ intake.acceptScheduled({
270
+ id: (0, exports.personalJobOccurrenceId)(job.jobId, at),
271
+ channelKey: `job:${job.jobId}`,
272
+ occurredAt: at,
273
+ payload: {
274
+ jobId: job.jobId,
275
+ version: job.version,
276
+ instruction: job.instruction,
277
+ timeZone: job.timeZone,
278
+ },
279
+ });
280
+ }
281
+ catch (error) {
282
+ ports.onError(new Error(`Personal job scheduling failed for ${person.principalId}`, { cause: error }));
283
+ }
284
+ }
285
+ };
286
+ const tick = (now = new Date()) => {
287
+ if (stopped)
288
+ return Promise.resolve();
289
+ const work = tickOnce(now);
290
+ pending.add(work);
291
+ void work.then(() => pending.delete(work), () => pending.delete(work));
292
+ return work;
293
+ };
294
+ return {
295
+ tick,
296
+ start: () => {
297
+ if (stopped)
298
+ throw new Error('Cannot start a stopped personal scheduler');
299
+ if (timer)
300
+ return;
301
+ timer = setInterval(() => {
302
+ tick().catch((error) => ports.onError(error));
303
+ }, 60_000);
304
+ },
305
+ stop: async () => {
306
+ stopped = true;
307
+ if (timer)
308
+ clearInterval(timer);
309
+ timer = undefined;
310
+ await Promise.allSettled([...pending]);
311
+ },
312
+ };
313
+ }
314
+ /** Durable native result + outbound receipt recover delivery and chat independently of model context. */
315
+ async function deliverPersonalJobResult(row, result, ports) {
316
+ const payload = personalJobPayload(row);
317
+ if (ports.store.isClosed(row))
318
+ return;
319
+ const completeIfCurrent = async () => {
320
+ const job = ports.store.find(row.principalId, payload.jobId);
321
+ if (job?.enabled &&
322
+ job.version === payload.version &&
323
+ !ports.store.isSuperseded(row) &&
324
+ ports.store.isActive(row.principalId))
325
+ await ports.store.complete(row, ports.access());
326
+ };
327
+ await (0, personal_turns_js_1.deliverPersonalTurnResult)(result, {
328
+ ...ports,
329
+ label: 'Personal job',
330
+ key: (0, exports.personalJobOccurrenceId)(payload.jobId, row.occurredAt),
331
+ isClosed: () => ports.store.isClosed(row),
332
+ isActive: () => ports.store.isActive(row.principalId),
333
+ isOffboarded: () => ports.store.isOffboarded(row.principalId),
334
+ hasExchange: () => ports.chat.hasJobExchange(payload.jobId, row.occurredAt),
335
+ archive: (text) => ports.chat.saveJobExchange({
336
+ jobId: payload.jobId,
337
+ occurrenceAt: row.occurredAt,
338
+ instruction: payload.instruction,
339
+ text,
340
+ timeZone: payload.timeZone,
341
+ }),
342
+ completeIfCurrent,
343
+ complete: (access) => ports.store.complete(row, access),
344
+ assertCurrent: () => {
345
+ const job = ports.store.find(row.principalId, payload.jobId);
346
+ if (!job || !job.enabled || job.version !== payload.version)
347
+ throw new personal_turns_js_1.PersonalTurnFinalFailure('Personal job changed or deleted');
348
+ if (result.response.trim() !== '[ack]' && ports.store.isSuperseded(row))
349
+ throw new personal_turns_js_1.PersonalTurnFinalFailure('Personal job occurrence superseded by a later occurrence');
350
+ },
351
+ });
352
+ }
353
+ //# sourceMappingURL=personal-jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-jobs.js","sourceRoot":"","sources":["../../src/runtime/personal-jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { type DatabaseInstance, type JudgmentAccess } from '@jungjaehoon/mama-core';
2
+ import type { MailboxRow } from '@jungjaehoon/mama-core/runtime/mailbox';
3
+ import type { NativeTurnResult } from '@jungjaehoon/mama-core/runtime/native-turn';
4
+ import type { ChatSources } from '../storage/chat-sources.js';
5
+ /** Exact inputs to source.read and memory.read:record; no common-session text. */
6
+ export type NoticeRef = {
7
+ observationRef: string;
8
+ source?: string;
9
+ } | {
10
+ memory_id: string;
11
+ };
12
+ export interface PersonalNoticePayload {
13
+ refs: NoticeRef[];
14
+ timeZone: string;
15
+ lifecycleVersion: number;
16
+ }
17
+ export declare function personalNoticePayload(row: MailboxRow): PersonalNoticePayload | null;
18
+ export declare const personalNoticeSessionKey: (row: MailboxRow) => string;
19
+ /** Personal close receipts follow the job close pattern and are exported/erased by P9. */
20
+ export declare function createPersonalNoticeStore(adapter: DatabaseInstance): {
21
+ isClosed: (row: MailboxRow) => boolean;
22
+ isActive: (id: string) => boolean;
23
+ isOffboarded: (id: string) => boolean;
24
+ isCurrent: (row: MailboxRow) => boolean;
25
+ prepare: (row: MailboxRow, refs: NoticeRef[]) => Promise<void>;
26
+ turnRefs: (row: MailboxRow) => NoticeRef[];
27
+ close: (row: MailboxRow) => Promise<void>;
28
+ };
29
+ export type PersonalNoticeStore = ReturnType<typeof createPersonalNoticeStore>;
30
+ export declare function deliverPersonalNoticeResult(row: MailboxRow, result: NativeTurnResult, ports: {
31
+ store: PersonalNoticeStore;
32
+ chat: Pick<ChatSources, 'hasPersonalExchange' | 'savePersonalExchange'>;
33
+ access(): JudgmentAccess;
34
+ send(access: JudgmentAccess, text: string, key: string): Promise<boolean>;
35
+ delivered(key: string): boolean;
36
+ read(ref: NoticeRef, access: JudgmentAccess): Promise<boolean>;
37
+ }): Promise<void>;
38
+ //# sourceMappingURL=personal-notices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-notices.d.ts","sourceRoot":"","sources":["../../src/runtime/personal-notices.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,kFAAkF;AAClF,MAAM,MAAM,SAAS,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5F,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,SAAS,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AACD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,UAAU,GAAG,qBAAqB,GAAG,IAAI,CAsBnF;AACD,eAAO,MAAM,wBAAwB,GAAI,KAAK,UAAU,WACF,CAAC;AAEvD,0FAA0F;AAC1F,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB;oBAS1C,UAAU;mBAmBhB,MAAM;uBACF,MAAM;qBACR,UAAU;mBAMN,UAAU,QAAQ,SAAS,EAAE;oBAkBlC,UAAU,KAAG,SAAS,EAAE;iBAcrB,UAAU;EAkBhC;AACD,MAAM,MAAM,mBAAmB,GAAG,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE/E,wBAAsB,2BAA2B,CAC/C,GAAG,EAAE,UAAU,EACf,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE;IACL,KAAK,EAAE,mBAAmB,CAAC;IAC3B,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,qBAAqB,GAAG,sBAAsB,CAAC,CAAC;IACxE,MAAM,IAAI,cAAc,CAAC;IACzB,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1E,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAChE,iBAkCF"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.personalNoticeSessionKey = void 0;
4
+ exports.personalNoticePayload = personalNoticePayload;
5
+ exports.createPersonalNoticeStore = createPersonalNoticeStore;
6
+ exports.deliverPersonalNoticeResult = deliverPersonalNoticeResult;
7
+ const mama_core_1 = require("@jungjaehoon/mama-core");
8
+ const personal_turns_js_1 = require("./personal-turns.js");
9
+ function personalNoticePayload(row) {
10
+ if (row.kind !== 'scheduled' || row.channelKey !== 'notice')
11
+ return null;
12
+ const value = row.payload;
13
+ if (!value ||
14
+ typeof value !== 'object' ||
15
+ Array.isArray(value) ||
16
+ typeof value.timeZone !== 'string' ||
17
+ !Number.isSafeInteger(value.lifecycleVersion) ||
18
+ Number(value.lifecycleVersion) < 0 ||
19
+ !Array.isArray(value.refs) ||
20
+ value.refs.length === 0 ||
21
+ !value.refs.every((ref) => ref &&
22
+ typeof ref === 'object' &&
23
+ !Array.isArray(ref) &&
24
+ (typeof ref.observationRef === 'string' || typeof ref.memory_id === 'string')))
25
+ throw new Error('Invalid personal notice input');
26
+ return value;
27
+ }
28
+ const personalNoticeSessionKey = (row) => `member:${row.principalId}:notice:${row.stimulusId}`;
29
+ exports.personalNoticeSessionKey = personalNoticeSessionKey;
30
+ /** Personal close receipts follow the job close pattern and are exported/erased by P9. */
31
+ function createPersonalNoticeStore(adapter) {
32
+ const principals = () => (0, mama_core_1.createPrincipalRepository)(adapter);
33
+ const access = (row) => ({
34
+ principalId: row.principalId,
35
+ agentId: 'host',
36
+ scopes: [{ kind: 'user', id: row.principalId }],
37
+ actions: [],
38
+ });
39
+ const commandId = (row) => `notice-close:${row.stimulusId}`;
40
+ const isClosed = (row) =>
41
+ // P9 retains uncertain native inputs until settlement; their earlier notice results must
42
+ // never restore a DM or archive after the person's erasure.
43
+ adapter
44
+ .prepare('SELECT 1 FROM principal_erasure_receipts WHERE principal_id=? AND erased_at>=?')
45
+ .get(row.principalId, row.createdAt) !== undefined ||
46
+ adapter
47
+ .prepare(`SELECT 1 FROM mailbox_inputs m WHERE stimulus_id=? AND principal_id=? AND status IN ('acked','dead')
48
+ AND NOT EXISTS (SELECT 1 FROM native_input_deliveries n WHERE n.input_id=m.id AND n.state<>'settled')`)
49
+ .get(row.stimulusId, row.principalId) !== undefined ||
50
+ adapter
51
+ .prepare('SELECT 1 FROM command_bindings WHERE command_id=? AND principal_id=? AND erased_at IS NULL')
52
+ .get(commandId(row), row.principalId) !== undefined;
53
+ return {
54
+ isClosed,
55
+ isActive: (id) => principals().findById(id)?.status === 'active',
56
+ isOffboarded: (id) => principals().findById(id)?.status === 'offboarded',
57
+ isCurrent: (row) => principals().findById(row.principalId)?.status === 'active' &&
58
+ principals().lifecycleVersion(row.principalId) ===
59
+ personalNoticePayload(row).lifecycleVersion,
60
+ // Retain exactly what this native input was given, including pre-turn access filtering.
61
+ // A later reconciliation must not substitute the enqueue candidates for the turn's refs.
62
+ prepare: async (row, refs) => {
63
+ const nativeInputId = row.nativeDelivery?.invocationId;
64
+ if (!nativeInputId)
65
+ throw new Error('Personal notice has no native input identity');
66
+ await (0, mama_core_1.appendJudgment)({
67
+ commandId: `notice-input:${nativeInputId}:${row.attempts}`,
68
+ topic: 'personal-notice/input',
69
+ recordKind: 'judgment',
70
+ summary: 'Personal notice input refs',
71
+ payload: { type: 'personal-notice-input', nativeInputId, refs },
72
+ scopes: [...access(row).scopes],
73
+ record: { kind: 'fact', status: 'stale' },
74
+ agentId: 'host',
75
+ }, access(row), { adapter, embedder: null });
76
+ },
77
+ turnRefs: (row) => {
78
+ const record = adapter
79
+ .prepare(`SELECT d.payload_json FROM decisions d JOIN command_bindings b ON b.receipt_key=d.id
80
+ WHERE b.principal_id=? AND b.erased_at IS NULL AND d.erased_at IS NULL
81
+ AND json_extract(d.payload_json, '$.type')='personal-notice-input'
82
+ AND json_extract(d.payload_json, '$.nativeInputId')=? ORDER BY d.rowid DESC LIMIT 1`)
83
+ .get(row.principalId, row.nativeDelivery?.invocationId);
84
+ if (!record)
85
+ throw new Error('Personal notice native input refs are missing');
86
+ return JSON.parse(record.payload_json).refs;
87
+ },
88
+ close: async (row) => {
89
+ if (isClosed(row))
90
+ return;
91
+ await (0, mama_core_1.appendJudgment)({
92
+ commandId: commandId(row),
93
+ topic: 'personal-notice/closed',
94
+ recordKind: 'judgment',
95
+ summary: 'Personal notice closed',
96
+ payload: { type: 'personal-notice-close', noticeId: row.stimulusId },
97
+ scopes: [{ kind: 'user', id: row.principalId }],
98
+ record: { kind: 'fact', status: 'stale' },
99
+ agentId: 'host',
100
+ }, access(row), { adapter, embedder: null });
101
+ },
102
+ };
103
+ }
104
+ async function deliverPersonalNoticeResult(row, result, ports) {
105
+ const payload = personalNoticePayload(row);
106
+ const complete = () => ports.store.close(row);
107
+ await (0, personal_turns_js_1.deliverPersonalTurnResult)(result, {
108
+ ...ports,
109
+ label: 'Personal notice',
110
+ key: row.stimulusId,
111
+ isClosed: () => ports.store.isClosed(row),
112
+ isActive: () => ports.store.isActive(row.principalId),
113
+ isOffboarded: () => ports.store.isOffboarded(row.principalId),
114
+ assertCurrent: async () => {
115
+ if (!ports.store.isCurrent(row))
116
+ throw new personal_turns_js_1.PersonalTurnFinalFailure('Personal notice person lifecycle changed');
117
+ const access = ports.access();
118
+ for (const ref of ports.store.turnRefs(row))
119
+ if (!(await ports.read(ref, access)))
120
+ throw new personal_turns_js_1.PersonalTurnFinalFailure('Personal notice ref is no longer readable');
121
+ if (!ports.store.isCurrent(row))
122
+ throw new personal_turns_js_1.PersonalTurnFinalFailure('Personal notice person lifecycle changed');
123
+ },
124
+ complete,
125
+ completeIfCurrent: complete,
126
+ hasExchange: () => ports.chat.hasPersonalExchange('notice', row.stimulusId),
127
+ archive: (text) => ports.chat.savePersonalExchange({
128
+ kind: 'notice',
129
+ ref: row.stimulusId,
130
+ occurrenceAt: row.occurredAt,
131
+ hostText: JSON.stringify(ports.store.turnRefs(row)),
132
+ text,
133
+ metadata: { refs: ports.store.turnRefs(row), timeZone: payload.timeZone },
134
+ }),
135
+ });
136
+ }
137
+ //# sourceMappingURL=personal-notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-notices.js","sourceRoot":"","sources":["../../src/runtime/personal-notices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { JudgmentAccess } from '@jungjaehoon/mama-core';
2
+ import type { NativeTurnResult } from '@jungjaehoon/mama-core/runtime/native-turn';
3
+ /** Final product failures settle an autonomous input without a successful completion. */
4
+ export declare class PersonalTurnFinalFailure extends Error {
5
+ }
6
+ export declare const isPersonalTurnTextKey: (key: string) => boolean;
7
+ /** Native results, DM receipts and chat are independently durable for jobs and notices. */
8
+ export declare function deliverPersonalTurnResult(result: NativeTurnResult, ports: {
9
+ label: string;
10
+ key: string;
11
+ isClosed(): boolean;
12
+ isActive(): boolean;
13
+ isOffboarded(): boolean;
14
+ assertCurrent(): void | Promise<void>;
15
+ completeIfCurrent(): Promise<void>;
16
+ complete(access: JudgmentAccess): Promise<void>;
17
+ hasExchange(): boolean;
18
+ archive(text: string): void;
19
+ access(): JudgmentAccess;
20
+ delivered(key: string): boolean;
21
+ send(access: JudgmentAccess, text: string, key: string): Promise<boolean>;
22
+ }): Promise<void>;
23
+ //# sourceMappingURL=personal-turns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"personal-turns.d.ts","sourceRoot":"","sources":["../../src/runtime/personal-turns.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAMnF,yFAAyF;AACzF,qBAAa,wBAAyB,SAAQ,KAAK;CAAG;AAEtD,eAAO,MAAM,qBAAqB,GAAI,KAAK,MAAM,YACI,CAAC;AAEtD,2FAA2F;AAC3F,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE;IACL,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,IAAI,OAAO,CAAC;IACpB,QAAQ,IAAI,OAAO,CAAC;IACpB,YAAY,IAAI,OAAO,CAAC;IACxB,aAAa,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,WAAW,IAAI,OAAO,CAAC;IACvB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,MAAM,IAAI,cAAc,CAAC;IACzB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E,iBAsCF"}