@comput/pi-intercom 0.5.2 → 0.8.1

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 (52) hide show
  1. package/README.md +109 -15
  2. package/dist/config.d.ts +18 -1
  3. package/dist/config.js +141 -27
  4. package/dist/config.js.map +1 -1
  5. package/dist/handoff.d.ts +87 -0
  6. package/dist/handoff.js +327 -0
  7. package/dist/handoff.js.map +1 -0
  8. package/dist/index.js +92 -17
  9. package/dist/index.js.map +1 -1
  10. package/dist/launcher.js +11 -1
  11. package/dist/launcher.js.map +1 -1
  12. package/dist/monitor-view.d.ts +1 -1
  13. package/dist/monitor-view.js +31 -2
  14. package/dist/monitor-view.js.map +1 -1
  15. package/dist/observability.d.ts +1 -1
  16. package/dist/observability.js +1 -1
  17. package/dist/observability.js.map +1 -1
  18. package/dist/pane-close.d.ts +22 -0
  19. package/dist/pane-close.js +166 -0
  20. package/dist/pane-close.js.map +1 -0
  21. package/dist/reminders.d.ts +28 -0
  22. package/dist/reminders.js +81 -0
  23. package/dist/reminders.js.map +1 -0
  24. package/dist/runtime.d.ts +19 -2
  25. package/dist/runtime.js +163 -16
  26. package/dist/runtime.js.map +1 -1
  27. package/dist/snapshot.d.ts +9 -0
  28. package/dist/snapshot.js +23 -1
  29. package/dist/snapshot.js.map +1 -1
  30. package/dist/transport.d.ts +2 -1
  31. package/dist/transport.js +4 -1
  32. package/dist/transport.js.map +1 -1
  33. package/dist/worker-status.d.ts +1 -1
  34. package/dist/worker-status.js +9 -1
  35. package/dist/worker-status.js.map +1 -1
  36. package/package.json +12 -6
  37. package/references/implementation-blocker.md +1 -1
  38. package/references/observability.md +13 -3
  39. package/references/releasing.md +90 -0
  40. package/references/v1-specification.md +4 -4
  41. package/src/config.ts +107 -19
  42. package/src/handoff.ts +280 -0
  43. package/src/index.ts +75 -15
  44. package/src/launcher.ts +9 -1
  45. package/src/monitor-view.ts +30 -3
  46. package/src/observability.ts +1 -1
  47. package/src/pane-close.ts +138 -0
  48. package/src/reminders.ts +69 -0
  49. package/src/runtime.ts +138 -18
  50. package/src/snapshot.ts +22 -1
  51. package/src/transport.ts +4 -2
  52. package/src/worker-status.ts +9 -2
@@ -0,0 +1,87 @@
1
+ import type { Agent, Config } from './config.js';
2
+ export interface WorkerPaneIdentity {
3
+ workspaceId: string;
4
+ paneId: string;
5
+ terminalId: string;
6
+ sessionId: string;
7
+ sessionFile: string;
8
+ pid: number;
9
+ processStart: string;
10
+ }
11
+ export interface CloseProvider {
12
+ getIdentity(): Promise<WorkerPaneIdentity>;
13
+ inspect(identity: WorkerPaneIdentity, expectedSessionId: string, assertCurrent: () => void): Promise<void>;
14
+ close(identity: WorkerPaneIdentity, expectedSessionId: string, assertCurrent: () => void, beforeSubmit: () => Promise<void>): Promise<{
15
+ paneClosed: boolean;
16
+ workerExited: boolean;
17
+ }>;
18
+ }
19
+ export type CloseReason = 'timeout' | 'interrupted' | 'delivery_failed' | 'identity_failed' | 'save_failed' | 'worker_changed' | 'worker_busy' | 'commit_rejected' | 'close_unverified' | 'close_failed';
20
+ export type CloseState = 'requested' | 'awaiting_handoff' | 'awaiting_settlement' | 'ready' | 'closing' | 'closed' | 'failed' | 'timed_out' | 'interrupted' | 'uncertain';
21
+ export interface Handoff {
22
+ version: 1;
23
+ summary: string;
24
+ updatedAt: string;
25
+ jobId: string;
26
+ }
27
+ export interface CloseJob {
28
+ jobId: string;
29
+ state: CloseState;
30
+ createdAt: string;
31
+ updatedAt: string;
32
+ deadlineAt: string;
33
+ reason?: CloseReason;
34
+ }
35
+ export type HandoffKind = 'close_prepare' | 'close_identity' | 'close_request' | 'handoff_report' | 'close_ready' | 'close_commit';
36
+ export declare const HANDOFF_KINDS: readonly string[];
37
+ export declare const pendingClose: (job?: CloseJob) => boolean;
38
+ export declare const fencedClose: (job?: CloseJob) => boolean;
39
+ export declare function validateIdentity(value: unknown): asserts value is WorkerPaneIdentity;
40
+ export declare function validateHandoff(value: unknown): asserts value is Handoff;
41
+ export declare function validateCloseJob(value: unknown): asserts value is CloseJob;
42
+ export declare function validateHandoffPayload(kind: string, p: Record<string, unknown>): void;
43
+ interface Context {
44
+ state(): Promise<{
45
+ id: string;
46
+ config: Config;
47
+ me?: Agent;
48
+ }>;
49
+ assertCurrent(): void;
50
+ update(mutate: (config: Config) => void, guard?: () => void): Promise<void>;
51
+ send(sessionId: string, kind: HandoffKind, payload: Record<string, unknown>): Promise<void>;
52
+ deliver(message: string): void;
53
+ busy(): boolean;
54
+ provider?: CloseProvider;
55
+ timeoutMs?: number;
56
+ }
57
+ /** Extension-owned asynchronous protocol. No host abort, shutdown, automatic retries or guessed pane targets. */
58
+ export declare class HandoffWorkflow {
59
+ private readonly ctx;
60
+ private readonly instanceId;
61
+ private jobs;
62
+ private worker?;
63
+ private epoch;
64
+ private disposed;
65
+ private readonly timeout;
66
+ constructor(ctx: Context);
67
+ private valid;
68
+ private background;
69
+ dispose(): void;
70
+ recover(): Promise<void>;
71
+ private assertJob;
72
+ private target;
73
+ private transition;
74
+ private finish;
75
+ request(target: Agent): Promise<CloseJob>;
76
+ workerStarted(): void;
77
+ workerSettled(successfulToolCallIds: ReadonlySet<string>): void;
78
+ private assertWorker;
79
+ get workerClosing(): boolean;
80
+ isClosing(sessionId: string): boolean;
81
+ report(jobId: unknown, summary: unknown, toolCallId?: string): Promise<{
82
+ saved: true;
83
+ closure: 'awaiting_turn_settlement';
84
+ }>;
85
+ receive(kind: HandoffKind, from: string, payload: Record<string, unknown>): Promise<void>;
86
+ }
87
+ export {};
@@ -0,0 +1,327 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ export const HANDOFF_KINDS = ['close_prepare', 'close_identity', 'close_request', 'handoff_report', 'close_ready', 'close_commit'];
3
+ const states = ['requested', 'awaiting_handoff', 'awaiting_settlement', 'ready', 'closing', 'closed', 'failed', 'timed_out', 'interrupted', 'uncertain'];
4
+ const reasons = ['timeout', 'interrupted', 'delivery_failed', 'identity_failed', 'save_failed', 'worker_changed', 'worker_busy', 'commit_rejected', 'close_unverified', 'close_failed'];
5
+ export const pendingClose = (job) => !!job && ['requested', 'awaiting_handoff', 'awaiting_settlement', 'ready', 'closing'].includes(job.state);
6
+ export const fencedClose = (job) => pendingClose(job) || job?.state === 'uncertain';
7
+ function requireValue(ok) { if (!ok)
8
+ throw new Error('PiIntercom: invalid handoff protocol/state'); }
9
+ const string = (value, max) => typeof value === 'string' && !!value.trim() && value.length <= max && !value.includes('\0');
10
+ const token = (value) => typeof value === 'string' && /^[a-zA-Z0-9-]{1,128}$/.test(value);
11
+ const timestamp = (value) => typeof value === 'string' && value.length <= 32 && Number.isFinite(Date.parse(value));
12
+ export function validateIdentity(value) {
13
+ const v = value;
14
+ requireValue(v && ['workspaceId', 'paneId', 'terminalId', 'sessionId', 'processStart'].every(k => string(v[k], 256)) && string(v.sessionFile, 4096) && Number.isSafeInteger(v.pid) && v.pid > 0);
15
+ }
16
+ export function validateHandoff(value) {
17
+ const v = value;
18
+ requireValue(v && v.version === 1 && token(v.jobId) && string(v.summary, 4000) && timestamp(v.updatedAt));
19
+ requireValue(Object.keys(v).every(k => ['version', 'jobId', 'summary', 'updatedAt'].includes(k)));
20
+ }
21
+ export function validateCloseJob(value) {
22
+ const v = value;
23
+ requireValue(v && token(v.jobId) && states.includes(v.state) && timestamp(v.createdAt) && timestamp(v.updatedAt) && timestamp(v.deadlineAt) && (v.reason === undefined || reasons.includes(v.reason)));
24
+ requireValue(Object.keys(v).every(k => ['jobId', 'state', 'createdAt', 'updatedAt', 'deadlineAt', 'reason'].includes(k)));
25
+ }
26
+ export function validateHandoffPayload(kind, p) {
27
+ requireValue(token(p.jobId));
28
+ const keys = {
29
+ close_prepare: ['jobId', 'deadlineAt'], close_identity: ['jobId', 'instanceId', 'identity'],
30
+ close_request: ['jobId', 'instanceId'], handoff_report: ['jobId', 'instanceId', 'summary'],
31
+ close_ready: ['jobId', 'instanceId', 'readyNonce'], close_commit: ['jobId', 'instanceId', 'readyNonce'],
32
+ };
33
+ requireValue(!!keys[kind] && Object.keys(p).every(k => keys[kind].includes(k)));
34
+ if (kind === 'close_prepare')
35
+ requireValue(timestamp(p.deadlineAt));
36
+ else
37
+ requireValue(token(p.instanceId));
38
+ if (kind === 'close_identity')
39
+ validateIdentity(p.identity);
40
+ if (kind === 'handoff_report')
41
+ requireValue(string(p.summary, 4000));
42
+ if (kind === 'close_ready' || kind === 'close_commit')
43
+ requireValue(token(p.readyNonce));
44
+ }
45
+ /** Extension-owned asynchronous protocol. No host abort, shutdown, automatic retries or guessed pane targets. */
46
+ export class HandoffWorkflow {
47
+ ctx;
48
+ instanceId = randomUUID();
49
+ jobs = new Map();
50
+ worker;
51
+ epoch = 0;
52
+ disposed = false;
53
+ timeout;
54
+ constructor(ctx) {
55
+ this.ctx = ctx;
56
+ this.timeout = Number.isFinite(ctx.timeoutMs) ? Math.max(1, Math.min(120000, ctx.timeoutMs)) : 120000;
57
+ }
58
+ valid() { requireValue(!this.disposed); this.ctx.assertCurrent(); }
59
+ background(work) { setImmediate(() => { if (!this.disposed)
60
+ void work().catch(() => { }); }); }
61
+ dispose() {
62
+ this.disposed = true;
63
+ for (const p of this.jobs.values()) {
64
+ p.ended = true;
65
+ clearTimeout(p.timer);
66
+ }
67
+ this.jobs.clear();
68
+ if (this.worker)
69
+ clearTimeout(this.worker.timer);
70
+ this.worker = undefined;
71
+ }
72
+ async recover() {
73
+ const { me, config } = await this.ctx.state();
74
+ if (!me?.coordinator || !config.agents.some(a => pendingClose(a.closeJob)))
75
+ return;
76
+ await this.ctx.update(c => {
77
+ for (const a of c.agents)
78
+ if (pendingClose(a.closeJob)) {
79
+ a.closeJob = { ...a.closeJob, state: a.closeJob.state === 'closing' ? 'uncertain' : 'interrupted', reason: 'interrupted', updatedAt: new Date().toISOString() };
80
+ }
81
+ });
82
+ }
83
+ assertJob(p) {
84
+ this.valid();
85
+ requireValue(!p.ended && this.jobs.get(p.target.sessionId) === p && Date.now() < Date.parse(p.job.deadlineAt));
86
+ }
87
+ target(c, p) {
88
+ this.assertJob(p);
89
+ const a = c.agents.find(a => a.sessionId === p.target.sessionId && !a.coordinator);
90
+ requireValue(a && a.closeJob?.jobId === p.job.jobId && pendingClose(a.closeJob) && a.port === p.target.port && a.projectDirectory === p.target.projectDirectory);
91
+ return a;
92
+ }
93
+ async transition(p, state, reason) {
94
+ await this.ctx.update(c => {
95
+ const a = this.target(c, p);
96
+ a.closeJob = { ...a.closeJob, state, updatedAt: new Date().toISOString(), ...(reason ? { reason } : {}) };
97
+ p.job = { ...a.closeJob };
98
+ }, () => this.assertJob(p));
99
+ }
100
+ async finish(p, state, reason) {
101
+ if (p.ended)
102
+ return;
103
+ p.ended = true;
104
+ clearTimeout(p.timer);
105
+ // Keep the in-memory fence if persistence fails. Reload recovers durable intent.
106
+ try {
107
+ this.valid();
108
+ await this.ctx.update(c => {
109
+ const a = c.agents.find(a => a.sessionId === p.target.sessionId && !a.coordinator);
110
+ requireValue(a?.closeJob?.jobId === p.job.jobId);
111
+ a.closeJob = { ...a.closeJob, state, updatedAt: new Date().toISOString(), ...(reason ? { reason } : {}) };
112
+ });
113
+ this.jobs.delete(p.target.sessionId);
114
+ }
115
+ catch { /* Failure never authorizes pane closure or replay. */ }
116
+ }
117
+ async request(target) {
118
+ this.valid();
119
+ requireValue(this.ctx.provider);
120
+ const existing = this.jobs.get(target.sessionId);
121
+ if (existing) {
122
+ await existing.initialized;
123
+ return { ...existing.job };
124
+ }
125
+ requireValue(!fencedClose(target.closeJob) && this.jobs.size < 16);
126
+ const now = Date.now();
127
+ const job = { jobId: randomUUID(), state: 'requested', createdAt: new Date(now).toISOString(), updatedAt: new Date(now).toISOString(), deadlineAt: new Date(now + this.timeout).toISOString() };
128
+ const p = { target: { ...target }, job, timer: undefined, processing: false, closing: false, ended: false };
129
+ // Install the fence synchronously, before the first asynchronous config write.
130
+ this.jobs.set(target.sessionId, p);
131
+ try {
132
+ p.initialized = this.ctx.update(c => {
133
+ const a = c.agents.find(a => a.sessionId === target.sessionId && !a.coordinator);
134
+ requireValue(a && !fencedClose(a.closeJob) && a.port === target.port && a.projectDirectory === target.projectDirectory && c.multiplexer === 'herdr');
135
+ a.closeJob = { ...job };
136
+ }, () => this.assertJob(p));
137
+ await p.initialized;
138
+ }
139
+ catch (error) {
140
+ this.jobs.delete(target.sessionId);
141
+ throw error;
142
+ }
143
+ p.timer = setTimeout(() => { void this.finish(p, p.closing ? 'uncertain' : 'timed_out', 'timeout'); }, Math.max(0, Date.parse(job.deadlineAt) - Date.now()));
144
+ this.background(async () => {
145
+ try {
146
+ this.assertJob(p);
147
+ await this.ctx.send(target.sessionId, 'close_prepare', { jobId: job.jobId, deadlineAt: job.deadlineAt });
148
+ }
149
+ catch {
150
+ await this.finish(p, 'failed', 'delivery_failed');
151
+ }
152
+ });
153
+ return { ...job };
154
+ }
155
+ workerStarted() {
156
+ this.epoch++;
157
+ const w = this.worker;
158
+ if (w && (w.saved || w.reporting)) {
159
+ w.invalidated = true;
160
+ w.readyNonce = undefined;
161
+ }
162
+ }
163
+ workerSettled(successfulToolCallIds) {
164
+ const w = this.worker;
165
+ if (!w || !w.saved || w.reporting || w.invalidated || w.readyNonce || w.committed || this.ctx.busy() || w.epoch !== this.epoch || !w.toolCallId || !successfulToolCallIds.has(w.toolCallId))
166
+ return;
167
+ w.readyNonce = randomUUID();
168
+ this.background(async () => {
169
+ this.assertWorker(w);
170
+ requireValue(!this.ctx.busy() && w.epoch === this.epoch && !w.invalidated);
171
+ await this.ctx.send(w.coordinatorId, 'close_ready', { jobId: w.jobId, instanceId: this.instanceId, readyNonce: w.readyNonce });
172
+ });
173
+ }
174
+ assertWorker(w) {
175
+ this.valid();
176
+ requireValue(this.worker === w && Date.now() < w.deadline);
177
+ }
178
+ get workerClosing() { return !!this.worker; }
179
+ isClosing(sessionId) { return this.jobs.has(sessionId); }
180
+ async report(jobId, summary, toolCallId) {
181
+ requireValue(string(summary, 4000) && string(toolCallId, 256));
182
+ const w = this.worker;
183
+ requireValue(w && w.jobId === jobId && w.requested && !w.reporting && !w.saved && !w.invalidated);
184
+ this.assertWorker(w);
185
+ w.reporting = true;
186
+ w.toolCallId = toolCallId;
187
+ const reportEpoch = this.epoch;
188
+ try {
189
+ await this.ctx.send(w.coordinatorId, 'handoff_report', { jobId: w.jobId, instanceId: this.instanceId, summary });
190
+ this.assertWorker(w);
191
+ requireValue(!w.invalidated && this.epoch === reportEpoch);
192
+ w.saved = true;
193
+ w.epoch = reportEpoch;
194
+ return { saved: true, closure: 'awaiting_turn_settlement' };
195
+ }
196
+ finally {
197
+ w.reporting = false;
198
+ }
199
+ }
200
+ async receive(kind, from, payload) {
201
+ validateHandoffPayload(kind, payload);
202
+ const { config, me } = await this.ctx.state();
203
+ this.valid();
204
+ const sender = config.agents.find(a => a.sessionId === from);
205
+ const coordinatorMessage = ['close_prepare', 'close_request', 'close_commit'].includes(kind);
206
+ requireValue(me && sender && (coordinatorMessage ? sender.coordinator && !me.coordinator : me.coordinator && !sender.coordinator));
207
+ if (coordinatorMessage) {
208
+ requireValue(this.ctx.provider && me.closeJob?.jobId === payload.jobId && pendingClose(me.closeJob));
209
+ if (kind === 'close_prepare') {
210
+ requireValue(!this.worker);
211
+ const deadline = Date.parse(payload.deadlineAt);
212
+ requireValue(deadline > Date.now() && deadline <= Date.now() + 120000);
213
+ const w = { jobId: payload.jobId, coordinatorId: from, deadline, requested: false, saved: false, reporting: false, invalidated: false, epoch: this.epoch, committed: false, timer: undefined };
214
+ this.worker = w;
215
+ w.timer = setTimeout(() => { if (this.worker === w)
216
+ this.worker = undefined; }, deadline - Date.now());
217
+ this.background(async () => {
218
+ try {
219
+ const identity = await this.ctx.provider.getIdentity();
220
+ validateIdentity(identity);
221
+ this.assertWorker(w);
222
+ requireValue(identity.sessionId === me.sessionId);
223
+ await this.ctx.send(from, 'close_identity', { jobId: w.jobId, instanceId: this.instanceId, identity });
224
+ }
225
+ catch {
226
+ if (this.worker === w) {
227
+ clearTimeout(w.timer);
228
+ this.worker = undefined;
229
+ }
230
+ }
231
+ });
232
+ return;
233
+ }
234
+ const w = this.worker;
235
+ requireValue(w && w.jobId === payload.jobId && payload.instanceId === this.instanceId && from === w.coordinatorId);
236
+ this.assertWorker(w);
237
+ if (kind === 'close_request') {
238
+ requireValue(!w.requested);
239
+ w.requested = true;
240
+ this.ctx.deliver(`Coordinator requests a handoff for owned-pane closure. Job ID: ${w.jobId}. Stop taking new assignments, summarize completed work, remaining work, validation and important files in intercom_report_handoff({jobId:"${w.jobId}",summary:...}) (public summary, max 4000 characters; no credentials or private reasoning), then finish this turn and wait. Do not exit, shut down, close a pane or start further work. Pane closure is asynchronous and is not proof all child processes terminated.`);
241
+ return;
242
+ }
243
+ requireValue(w.saved && !w.reporting && !w.invalidated && !w.committed && !this.ctx.busy() && w.epoch === this.epoch && w.readyNonce === payload.readyNonce);
244
+ w.committed = true;
245
+ return;
246
+ }
247
+ const p = this.jobs.get(from);
248
+ requireValue(p && p.job.jobId === payload.jobId);
249
+ this.assertJob(p);
250
+ if (kind === 'close_identity') {
251
+ requireValue(!p.identity && !p.processing && p.job.state === 'requested');
252
+ const identity = payload.identity;
253
+ requireValue(identity.sessionId === from);
254
+ p.identity = { ...identity };
255
+ p.instanceId = payload.instanceId;
256
+ p.processing = true;
257
+ this.background(async () => {
258
+ try {
259
+ await this.ctx.provider.inspect(p.identity, from, () => this.assertJob(p));
260
+ this.assertJob(p);
261
+ await this.transition(p, 'awaiting_handoff');
262
+ await this.ctx.send(from, 'close_request', { jobId: p.job.jobId, instanceId: p.instanceId });
263
+ }
264
+ catch {
265
+ await this.finish(p, 'failed', 'identity_failed');
266
+ }
267
+ finally {
268
+ p.processing = false;
269
+ }
270
+ });
271
+ return;
272
+ }
273
+ requireValue(payload.instanceId === p.instanceId);
274
+ if (kind === 'handoff_report') {
275
+ requireValue(p.job.state === 'awaiting_handoff' || p.job.state === 'awaiting_settlement');
276
+ try {
277
+ await this.ctx.update(c => {
278
+ const a = this.target(c, p);
279
+ if (a.handoff?.jobId === p.job.jobId)
280
+ requireValue(a.handoff.summary === payload.summary);
281
+ else
282
+ a.handoff = { version: 1, jobId: p.job.jobId, summary: payload.summary, updatedAt: new Date().toISOString() };
283
+ a.closeJob = { ...a.closeJob, state: 'awaiting_settlement', updatedAt: new Date().toISOString() };
284
+ }, () => this.assertJob(p));
285
+ this.assertJob(p);
286
+ p.job = { ...p.job, state: 'awaiting_settlement' };
287
+ }
288
+ catch (error) {
289
+ await this.finish(p, 'failed', 'save_failed');
290
+ throw error;
291
+ }
292
+ return;
293
+ }
294
+ requireValue(kind === 'close_ready' && p.job.state === 'awaiting_settlement' && !p.closing && !p.processing);
295
+ p.processing = true;
296
+ this.background(async () => {
297
+ let failure = 'identity_failed';
298
+ try {
299
+ await this.transition(p, 'ready');
300
+ await this.ctx.provider.inspect(p.identity, from, () => this.assertJob(p));
301
+ this.assertJob(p);
302
+ failure = 'save_failed';
303
+ await this.transition(p, 'closing');
304
+ this.assertJob(p);
305
+ failure = 'close_failed';
306
+ let commitAttempted = false;
307
+ const result = await this.ctx.provider.close(p.identity, from, () => this.assertJob(p), async () => {
308
+ this.assertJob(p);
309
+ requireValue(!commitAttempted);
310
+ commitAttempted = true;
311
+ failure = 'commit_rejected';
312
+ await this.ctx.send(from, 'close_commit', { jobId: p.job.jobId, instanceId: p.instanceId, readyNonce: payload.readyNonce });
313
+ this.assertJob(p);
314
+ p.closing = true;
315
+ failure = 'close_failed';
316
+ });
317
+ this.assertJob(p);
318
+ requireValue(p.closing);
319
+ await this.finish(p, result.paneClosed && result.workerExited ? 'closed' : 'uncertain', result.paneClosed && result.workerExited ? undefined : 'close_unverified');
320
+ }
321
+ catch {
322
+ await this.finish(p, p.closing ? 'uncertain' : 'failed', failure);
323
+ }
324
+ });
325
+ }
326
+ }
327
+ //# sourceMappingURL=handoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handoff.js","sourceRoot":"","sources":["../src/handoff.ts"],"names":[],"mappings":"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"}