@modelprofile.com/flexharness 10.24.0 → 11.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 (135) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.codesandbox.js +1 -1
  3. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  4. package/dist_ts/classes.flexharness.admission.js +263 -0
  5. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  6. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  7. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  8. package/dist_ts/classes.flexharness.compaction.js +87 -0
  9. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  10. package/dist_ts/classes.flexharness.configurations.js +137 -0
  11. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  12. package/dist_ts/classes.flexharness.core.js +1538 -0
  13. package/dist_ts/classes.flexharness.d.ts +2 -437
  14. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  15. package/dist_ts/classes.flexharness.deletion.js +396 -0
  16. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  17. package/dist_ts/classes.flexharness.imports.js +345 -0
  18. package/dist_ts/classes.flexharness.js +119 -9776
  19. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  20. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  21. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  22. package/dist_ts/classes.flexharness.permissions.js +450 -0
  23. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  24. package/dist_ts/classes.flexharness.projects.js +575 -0
  25. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  26. package/dist_ts/classes.flexharness.prompts.js +659 -0
  27. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  28. package/dist_ts/classes.flexharness.providers.js +267 -0
  29. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  30. package/dist_ts/classes.flexharness.results.js +89 -0
  31. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  32. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  33. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  34. package/dist_ts/classes.flexharness.runs.js +1058 -0
  35. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  36. package/dist_ts/classes.flexharness.sessions.js +381 -0
  37. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  38. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  39. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  40. package/dist_ts/classes.flexharness.subagents.js +690 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  42. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  43. package/dist_ts/classes.stores.js +1 -1
  44. package/dist_ts/classes.toolcatalog.js +1 -1
  45. package/dist_ts/errors.js +1 -1
  46. package/dist_ts/functions.toolpermissions.js +1 -1
  47. package/dist_ts/interfaces.d.ts +3 -3
  48. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  49. package/dist_ts/interfaces.flexharness.js +2 -0
  50. package/dist_ts/utils.flexharness.d.ts +19 -0
  51. package/dist_ts/utils.flexharness.js +83 -0
  52. package/dist_ts/utils.harnessoptions.js +1 -1
  53. package/dist_ts/utils.json.js +1 -1
  54. package/dist_ts/utils.schemadeclarations.js +1 -1
  55. package/dist_ts/utils.sessionimport.js +1 -1
  56. package/dist_ts/utils.sessionmetrics.d.ts +1 -1
  57. package/dist_ts_chat/classes.chatsession.js +1 -1
  58. package/dist_ts_chat_harness/classes.transcript.js +1 -1
  59. package/dist_ts_chat_harness/functions.intents.js +1 -1
  60. package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
  61. package/dist_ts_chat_harness/functions.mapping.js +1 -1
  62. package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
  63. package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
  64. package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
  65. package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
  66. package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
  67. package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
  68. package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
  69. package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
  70. package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
  71. package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
  72. package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
  73. package/dist_ts_chat_harness_server/index.d.ts +3 -2
  74. package/dist_ts_chat_harness_server/index.js +3 -2
  75. package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
  76. package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
  77. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
  78. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
  79. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
  80. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
  81. package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
  82. package/dist_ts_chat_harness_typedsocket/index.js +1 -1
  83. package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
  84. package/dist_ts_chat_web/flexchat-input.js +1 -1
  85. package/dist_ts_chat_web/flexchat-message.js +1 -1
  86. package/dist_ts_chat_web/flexchat-window.js +1 -1
  87. package/dist_ts_compaction/smartagent.compaction.js +1 -1
  88. package/dist_ts_kvm/ocr.js +1 -1
  89. package/dist_ts_ocr/classes.imageocr.js +1 -1
  90. package/dist_ts_ocr/ocr.mistral.js +1 -1
  91. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
  92. package/dist_ts_tools/tool.browser.js +1 -1
  93. package/dist_ts_tools/tool.filesystem.js +1 -1
  94. package/dist_ts_tools/tool.shell.js +1 -1
  95. package/dist_ts_tools_node/tool.context.js +1 -1
  96. package/dist_ts_typedrequest/catalog.d.ts +2 -2
  97. package/dist_ts_typedrequest/catalog.js +1 -1
  98. package/package.json +3 -3
  99. package/ts/00_commitinfo_data.ts +1 -1
  100. package/ts/classes.flexharness.admission.ts +331 -0
  101. package/ts/classes.flexharness.callbacks.ts +352 -0
  102. package/ts/classes.flexharness.compaction.ts +167 -0
  103. package/ts/classes.flexharness.configurations.ts +167 -0
  104. package/ts/classes.flexharness.core.ts +1830 -0
  105. package/ts/classes.flexharness.deletion.ts +616 -0
  106. package/ts/classes.flexharness.imports.ts +414 -0
  107. package/ts/classes.flexharness.lifecycle.ts +786 -0
  108. package/ts/classes.flexharness.permissions.ts +535 -0
  109. package/ts/classes.flexharness.projects.ts +1006 -0
  110. package/ts/classes.flexharness.prompts.ts +857 -0
  111. package/ts/classes.flexharness.providers.ts +322 -0
  112. package/ts/classes.flexharness.results.ts +98 -0
  113. package/ts/classes.flexharness.reversions.ts +1684 -0
  114. package/ts/classes.flexharness.runs.ts +1204 -0
  115. package/ts/classes.flexharness.sessions.ts +483 -0
  116. package/ts/classes.flexharness.slashcommands.ts +705 -0
  117. package/ts/classes.flexharness.subagents.ts +860 -0
  118. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  119. package/ts/classes.flexharness.ts +147 -12567
  120. package/ts/interfaces.flexharness.ts +517 -0
  121. package/ts/utils.flexharness.ts +121 -0
  122. package/ts_chat_harness_server/classes.chathub.ts +68 -61
  123. package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
  124. package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
  125. package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
  126. package/ts_chat_harness_server/classes.turngate.ts +28 -21
  127. package/ts_chat_harness_server/index.ts +4 -5
  128. package/ts_chat_harness_server/interfaces.ts +35 -2
  129. package/ts_chat_harness_server/plugins.ts +0 -3
  130. package/ts_chat_harness_server/readme.md +6 -4
  131. package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
  132. package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
  133. package/ts_chat_harness_typedsocket/index.ts +4 -2
  134. package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
  135. package/ts_chat_harness_typedsocket/readme.md +7 -3
@@ -2,6 +2,11 @@ import * as plugins from './plugins.js';
2
2
  import type { IFlexHarnessChatCaller, IFlexHarnessChatLimits, IFlexHarnessChatTurn } from './interfaces.js';
3
3
  /** The harness calls the gate makes. */
4
4
  export type TFlexHarnessChatGateHarness = Pick<plugins.FlexHarness<unknown>, 'enqueuePrompt' | 'steerPrompt' | 'getPromptQueueEntry' | 'cancelPrompt'>;
5
+ /** A conversation as the gate reaches it: the harness scope it runs in, and its session. */
6
+ interface ITarget {
7
+ scopeId: string;
8
+ sessionId: string;
9
+ }
5
10
  /**
6
11
  * Admits messages: one turn per conversation, bound to the tab that started it and the context it
7
12
  * was sent with, since FlexHarness carries no per-prompt context. A message sent while a turn runs
@@ -22,8 +27,8 @@ export declare class FlexHarnessChatTurnGate<TContext> {
22
27
  hasTurnOf(tabArg: IFlexHarnessChatCaller): boolean;
23
28
  /** Takes one harness event: a prompt that runs now takes steers. */
24
29
  takeEvent(eventArg: plugins.TFlexHarnessEvent): void;
25
- /** Admits a message under the conversation's lock; every wait ends at the deadline. */
26
- admit(callerArg: IFlexHarnessChatCaller, sessionIdArg: string, sendArg: plugins.IHarnessComposerSendDetail, contextArg: TContext, deadlineArg: number): Promise<plugins.TFlexHarnessChatResponse<'flexHarnessChatSend'>>;
30
+ /** Admits a message of the caller's tab under the conversation's lock; every wait ends at the deadline. */
31
+ admit(callerArg: IFlexHarnessChatCaller, targetArg: ITarget, sendArg: plugins.IHarnessComposerSendDetail, contextArg: TContext, deadlineArg: number): Promise<plugins.TFlexHarnessChatResponse<'flexHarnessChatSend'>>;
27
32
  /**
28
33
  * Refuses new messages, stops every turn this gate started, also those admitted while it stops,
29
34
  * and waits until the admissions under way were refused and every turn ended.
@@ -36,3 +41,4 @@ export declare class FlexHarnessChatTurnGate<TContext> {
36
41
  private admitLocked;
37
42
  private startTurn;
38
43
  }
44
+ export {};
@@ -1,6 +1,6 @@
1
1
  import * as plugins from './plugins.js';
2
2
  import { FlexHarnessChatRequestError } from './errors.js';
3
- import { STOPPED_MESSAGE } from './functions.validation.js';
3
+ import { STOPPED_MESSAGE, isSameTab } from './functions.validation.js';
4
4
  const STILL_FINISHING_MESSAGE = 'The assistant is still finishing its previous reply. Send your message again in a moment.';
5
5
  const bindingKey = (scopeIdArg, sessionIdArg) => `${scopeIdArg}\n${sessionIdArg}`;
6
6
  /** Whether the promise settled before the deadline (a time in ms since the epoch). */
@@ -37,13 +37,13 @@ export class FlexHarnessChatTurnGate {
37
37
  turnOf(scopeIdArg, sessionIdArg) {
38
38
  const binding = this.bindings.get(bindingKey(scopeIdArg, sessionIdArg));
39
39
  return binding
40
- ? { scopeId: binding.scopeId, sessionId: binding.sessionId, tabId: binding.tabId, context: binding.context }
40
+ ? { scopeId: binding.scopeId, sessionId: binding.sessionId, tab: binding.tab, context: binding.context }
41
41
  : undefined;
42
42
  }
43
43
  /** Whether a turn the tab started still runs. */
44
44
  hasTurnOf(tabArg) {
45
45
  for (const binding of this.bindings.values()) {
46
- if (binding.tabId === tabArg.tabId && binding.scopeId === tabArg.scopeId)
46
+ if (isSameTab(binding.tab, tabArg))
47
47
  return true;
48
48
  }
49
49
  return false;
@@ -56,11 +56,12 @@ export class FlexHarnessChatTurnGate {
56
56
  if (binding && binding.queueId === eventArg.queueId)
57
57
  binding.markRunning();
58
58
  }
59
- /** Admits a message under the conversation's lock; every wait ends at the deadline. */
60
- admit(callerArg, sessionIdArg, sendArg, contextArg, deadlineArg) {
59
+ /** Admits a message of the caller's tab under the conversation's lock; every wait ends at the deadline. */
60
+ admit(callerArg, targetArg, sendArg, contextArg, deadlineArg) {
61
61
  if (this.stopped)
62
62
  return Promise.reject(new FlexHarnessChatRequestError(STOPPED_MESSAGE));
63
- const admission = this.withLock(bindingKey(callerArg.scopeId, sessionIdArg), () => this.admitLocked(callerArg, sessionIdArg, sendArg, contextArg, deadlineArg));
63
+ const target = { scopeId: targetArg.scopeId, sessionId: targetArg.sessionId };
64
+ const admission = this.withLock(bindingKey(target.scopeId, target.sessionId), () => this.admitLocked(callerArg, target, sendArg, contextArg, deadlineArg));
64
65
  const settled = admission.then(() => undefined, () => undefined);
65
66
  this.admissions.add(settled);
66
67
  void settled.then(() => this.admissions.delete(settled));
@@ -108,13 +109,12 @@ export class FlexHarnessChatTurnGate {
108
109
  this.locks.delete(keyArg);
109
110
  }
110
111
  }
111
- async admitLocked(callerArg, sessionIdArg, sendArg, contextArg, deadlineArg) {
112
+ async admitLocked(callerArg, target, sendArg, contextArg, deadlineArg) {
112
113
  const waitFor = async (promiseArg) => {
113
114
  if (!(await settlesBefore(promiseArg, deadlineArg)))
114
115
  throw new FlexHarnessChatRequestError(STILL_FINISHING_MESSAGE);
115
116
  };
116
117
  this.assertOpen();
117
- const target = { scopeId: callerArg.scopeId, sessionId: sessionIdArg };
118
118
  const binding = this.bindings.get(bindingKey(target.scopeId, target.sessionId));
119
119
  if (binding?.queueId) {
120
120
  for (let attempt = 0; attempt < 2; attempt++) {
@@ -127,7 +127,7 @@ export class FlexHarnessChatTurnGate {
127
127
  steerId: intent.steerId,
128
128
  prompt: intent.prompt,
129
129
  });
130
- return { sessionId: sessionIdArg, steerId: intent.steerId };
130
+ return { sessionId: target.sessionId, steerId: intent.steerId };
131
131
  }
132
132
  catch (error) {
133
133
  if (!(error instanceof plugins.FlexHarnessSteerRejectedError) || error.reason !== 'not-running')
@@ -147,19 +147,20 @@ export class FlexHarnessChatTurnGate {
147
147
  await waitFor(binding.settled);
148
148
  }
149
149
  this.assertOpen();
150
- return this.startTurn(callerArg, sessionIdArg, sendArg, contextArg);
150
+ return this.startTurn(callerArg, target, sendArg, contextArg);
151
151
  }
152
- async startTurn(callerArg, sessionIdArg, sendArg, contextArg) {
153
- const key = bindingKey(callerArg.scopeId, sessionIdArg);
154
- const intent = intentOf({ scopeId: callerArg.scopeId, sessionId: sessionIdArg }, { ...sendArg, delivery: 'turn' });
152
+ async startTurn(callerArg, target, sendArg, contextArg) {
153
+ const { scopeId, sessionId } = target;
154
+ const key = bindingKey(scopeId, sessionId);
155
+ const intent = intentOf(target, { ...sendArg, delivery: 'turn' });
155
156
  if (intent.type !== 'enqueuePrompt')
156
157
  throw new Error('A new turn must be queued.');
157
158
  let markSettled;
158
159
  let markRunning;
159
160
  const binding = {
160
- scopeId: callerArg.scopeId,
161
- sessionId: sessionIdArg,
162
- tabId: callerArg.tabId,
161
+ scopeId,
162
+ sessionId,
163
+ tab: { tabId: callerArg.tabId, scopeId: callerArg.scopeId },
163
164
  context: contextArg,
164
165
  running: new Promise((resolve) => (markRunning = resolve)),
165
166
  markRunning: () => markRunning(),
@@ -176,7 +177,7 @@ export class FlexHarnessChatTurnGate {
176
177
  this.bindings.set(key, binding);
177
178
  let queued;
178
179
  try {
179
- queued = await this.harness.enqueuePrompt(callerArg.scopeId, sessionIdArg, intent.prompt);
180
+ queued = await this.harness.enqueuePrompt(scopeId, sessionId, intent.prompt);
180
181
  }
181
182
  catch (error) {
182
183
  end();
@@ -187,12 +188,12 @@ export class FlexHarnessChatTurnGate {
187
188
  void queued.completion.then(() => undefined, () => undefined).finally(end);
188
189
  if (this.stopped) {
189
190
  // the gate stopped while the prompt was being queued: the turn never runs on
190
- this.cancel(callerArg.scopeId, sessionIdArg, queued.queueId);
191
+ this.cancel(scopeId, sessionId, queued.queueId);
191
192
  throw new FlexHarnessChatRequestError(STOPPED_MESSAGE);
192
193
  }
193
- binding.timer = setTimeout(() => this.cancel(callerArg.scopeId, sessionIdArg, queued.queueId), this.limits.turnTimeoutMs);
194
+ binding.timer = setTimeout(() => this.cancel(scopeId, sessionId, queued.queueId), this.limits.turnTimeoutMs);
194
195
  binding.timer.unref?.();
195
- return { sessionId: sessionIdArg, queueId: queued.queueId };
196
+ return { sessionId, queueId: queued.queueId };
196
197
  }
197
198
  }
198
199
  /** The harness call a composer message becomes; an attachment the composer could not read whole is refused. */
@@ -204,4 +205,4 @@ const intentOf = (targetArg, sendArg, activeQueueIdArg) => {
204
205
  throw new FlexHarnessChatRequestError(error?.message || 'The message could not be read.');
205
206
  }
206
207
  };
207
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dXJuZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfaGFybmVzc19zZXJ2ZXIvY2xhc3Nlcy50dXJuZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRzVELE1BQU0sdUJBQXVCLEdBQzNCLDJGQUEyRixDQUFDO0FBb0I5RixNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQWtCLEVBQUUsWUFBb0IsRUFBRSxFQUFFLENBQUMsR0FBRyxVQUFVLEtBQUssWUFBWSxFQUFFLENBQUM7QUFFbEcsc0ZBQXNGO0FBQ3RGLE1BQU0sYUFBYSxHQUFHLEtBQUssRUFBRSxVQUE0QixFQUFFLFdBQW1CLEVBQW9CLEVBQUU7SUFDbEcsSUFBSSxLQUFnRCxDQUFDO0lBQ3JELE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFRLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDN0MsS0FBSyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbEYsQ0FBQyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBYSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQWEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbEcsQ0FBQztZQUFTLENBQUM7UUFDVCxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7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
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50dXJuZ2F0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NoYXRfaGFybmVzc19zZXJ2ZXIvY2xhc3Nlcy50dXJuZ2F0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUd2RSxNQUFNLHVCQUF1QixHQUMzQiwyRkFBMkYsQ0FBQztBQTBCOUYsTUFBTSxVQUFVLEdBQUcsQ0FBQyxVQUFrQixFQUFFLFlBQW9CLEVBQUUsRUFBRSxDQUFDLEdBQUcsVUFBVSxLQUFLLFlBQVksRUFBRSxDQUFDO0FBRWxHLHNGQUFzRjtBQUN0RixNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQUUsVUFBNEIsRUFBRSxXQUFtQixFQUFvQixFQUFFO0lBQ2xHLElBQUksS0FBZ0QsQ0FBQztJQUNyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBUSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzdDLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFhLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2xHLENBQUM7WUFBUyxDQUFDO1FBQ1QsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxPQUFPLHVCQUF1QjtJQUNqQixPQUFPLENBQThCO0lBQ3JDLE1BQU0sQ0FBeUI7SUFDL0IsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFrQyxDQUFDO0lBQ3RFLDREQUE0RDtJQUMzQyxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUM7SUFDMUQsdUZBQXVGO0lBQ3RFLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBaUIsQ0FBQztJQUMvQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBRXhCLFlBQVksVUFBdUMsRUFBRSxTQUFpQztRQUNwRixJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztRQUMxQixJQUFJLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQWtCLEVBQUUsWUFBb0I7UUFDcEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sT0FBTztZQUNaLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ3hHLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQztJQUVELGlEQUFpRDtJQUMxQyxTQUFTLENBQUMsTUFBOEI7UUFDN0MsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDN0MsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDbEQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELG9FQUFvRTtJQUM3RCxTQUFTLENBQUMsUUFBbUM7UUFDbEQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLGdCQUFnQixJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssaUJBQWlCO1lBQUUsT0FBTztRQUN0RixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNwRixJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxLQUFLLFFBQVEsQ0FBQyxPQUFPO1lBQUUsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdFLENBQUM7SUFFRCwyR0FBMkc7SUFDcEcsS0FBSyxDQUNWLFNBQWlDLEVBQ2pDLFNBQWtCLEVBQ2xCLE9BQTJDLEVBQzNDLFVBQW9CLEVBQ3BCLFdBQW1CO1FBRW5CLElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSwyQkFBMkIsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQzFGLE1BQU0sTUFBTSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUM5RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FDakYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQ3RFLENBQUM7UUFDRixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUN4Qyw0RkFBNEY7UUFDNUYsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLFdBQVc7UUFDakIsS0FBSyxNQUFNLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDN0MsWUFBWSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM1QixJQUFJLE9BQU8sQ0FBQyxPQUFPO2dCQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RixDQUFDO0lBQ0gsQ0FBQztJQUVPLE1BQU0sQ0FBQyxVQUFrQixFQUFFLFlBQW9CLEVBQUUsVUFBa0I7UUFDekUsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxPQUFPO1lBQUUsTUFBTSxJQUFJLDJCQUEyQixDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFTyxLQUFLLENBQUMsUUFBUSxDQUFJLE1BQWMsRUFBRSxLQUF1QjtRQUMvRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDN0QsSUFBSSxPQUFvQixDQUFDO1FBQ3pCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sUUFBUSxDQUFDO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLEtBQUssRUFBRSxDQUFDO1FBQ3ZCLENBQUM7Z0JBQVMsQ0FBQztZQUNULE9BQU8sRUFBRSxDQUFDO1lBQ1YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxPQUFPO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BFLENBQUM7SUFDSCxDQUFDO0lBRU8sS0FBSyxDQUFDLFdBQVcsQ0FDdkIsU0FBaUMsRUFDakMsTUFBZSxFQUNmLE9BQTJDLEVBQzNDLFVBQW9CLEVBQ3BCLFdBQW1CO1FBRW5CLE1BQU0sT0FBTyxHQUFHLEtBQUssRUFBRSxVQUF5QixFQUFFLEVBQUU7WUFDbEQsSUFBSSxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUFFLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBQ3RILENBQUMsQ0FBQztRQUNGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUNoRixJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQztZQUNyQixLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUM7Z0JBQzdDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUNwRixJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssYUFBYTtvQkFBRSxNQUFNO2dCQUN6QyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQztvQkFDSCxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFO3dCQUMvRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87d0JBQ3ZCLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtxQkFDdEIsQ0FBQyxDQUFDO29CQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsRSxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssYUFBYTt3QkFBRSxNQUFNLEtBQUssQ0FBQztnQkFDL0csQ0FBQztnQkFDRCwrREFBK0Q7Z0JBQy9ELE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU87cUJBQzdCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDO3FCQUN0RSxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQUUsTUFBTTtnQkFDakYsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBQ0QsTUFBTSxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUM7YUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE1BQU0sT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FDckIsU0FBaUMsRUFDakMsTUFBZSxFQUNmLE9BQTJDLEVBQzNDLFVBQW9CO1FBRXBCLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsTUFBTSxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xFLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxlQUFlO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ25GLElBQUksV0FBd0IsQ0FBQztRQUM3QixJQUFJLFdBQXdCLENBQUM7UUFDN0IsTUFBTSxPQUFPLEdBQTJCO1lBQ3RDLE9BQU87WUFDUCxTQUFTO1lBQ1QsR0FBRyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxPQUFPLEVBQUU7WUFDM0QsT0FBTyxFQUFFLFVBQVU7WUFDbkIsT0FBTyxFQUFFLElBQUksT0FBTyxDQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsQ0FBQztZQUNoRSxXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsV0FBVyxFQUFFO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLENBQUM7U0FDakUsQ0FBQztRQUNGLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRTtZQUNmLFlBQVksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUIsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxPQUFPO2dCQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xFLFdBQVcsRUFBRSxDQUFDO1lBQ2QsV0FBVyxFQUFFLENBQUM7UUFDaEIsQ0FBQyxDQUFDO1FBQ0Ysd0VBQXdFO1FBQ3hFLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNoQyxJQUFJLE1BQXlDLENBQUM7UUFDOUMsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixHQUFHLEVBQUUsQ0FBQztZQUNOLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUNqQyw4RkFBOEY7UUFDOUYsS0FBSyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNFLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLDZFQUE2RTtZQUM3RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6RCxDQUFDO1FBQ0QsT0FBTyxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdHLE9BQU8sQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztRQUN4QixPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBRUQsK0dBQStHO0FBQy9HLE1BQU0sUUFBUSxHQUFHLENBQ2YsU0FBaUQsRUFDakQsT0FBMkMsRUFDM0MsZ0JBQXlCLEVBQ3pCLEVBQUU7SUFDRixJQUFJLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4SCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSwyQkFBMkIsQ0FBRSxLQUFlLEVBQUUsT0FBTyxJQUFJLGdDQUFnQyxDQUFDLENBQUM7SUFDdkcsQ0FBQztBQUNILENBQUMsQ0FBQyJ9
@@ -29,4 +29,4 @@ export function createFlexHarnessChatErrorProjector(options = {}) {
29
29
  return { name: 'AssistantError', message: 'The assistant could not complete that request.', code: 'FLEX_CHAT_FAILED' };
30
30
  };
31
31
  }
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmVycm9ycHJvamVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9oYXJuZXNzX3NlcnZlci9mdW5jdGlvbnMuZXJyb3Jwcm9qZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVWpFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELFVBQWlELEVBQUU7SUFFbkQsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3BELElBQUksU0FBUztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ2hDLElBQUksS0FBSyxZQUFZLGtDQUFrQyxFQUFFLENBQUM7WUFDeEQsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQztRQUMvRixDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3hCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxjQUFjLEVBQUUsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzlDLE9BQU87b0JBQ0wsSUFBSSxFQUFFLG9CQUFvQjtvQkFDMUIsT0FBTyxFQUFFLHlDQUF5QyxPQUFPLENBQUMsTUFBTSxHQUFHO29CQUNuRSxJQUFJLEVBQUUsNEJBQTRCO2lCQUNuQyxDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxnREFBZ0QsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQztJQUN6SCxDQUFDLENBQUM7QUFDSixDQUFDIn0=
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmVycm9ycHJvamVjdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY2hhdF9oYXJuZXNzX3NlcnZlci9mdW5jdGlvbnMuZXJyb3Jwcm9qZWN0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVWpFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsbUNBQW1DLENBQ2pELE9BQU8sR0FBMEMsRUFBRTtJQUVuRCxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFO1FBQ3hCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDcEQsSUFBSSxTQUFTO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDaEMsSUFBSSxLQUFLLFlBQVksa0NBQWtDLEVBQUUsQ0FBQztZQUN4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSwyQkFBMkIsRUFBRSxDQUFDO1FBQy9GLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsSUFBSSxLQUFLO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDeEIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUMsT0FBTztvQkFDTCxJQUFJLEVBQUUsb0JBQW9CO29CQUMxQixPQUFPLEVBQUUseUNBQXlDLE9BQU8sQ0FBQyxNQUFNLEdBQUc7b0JBQ25FLElBQUksRUFBRSw0QkFBNEI7aUJBQ25DLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLGdEQUFnRCxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxDQUFDO0lBQ3pILENBQUMsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,4 +1,5 @@
1
- export { FlexHarnessChatHub, defaultFlexHarnessChatLimits, flexHarnessChatSessionMeta, } from './classes.chathub.js';
1
+ export { FlexHarnessChatHub, defaultFlexHarnessChatLimits } from './classes.chathub.js';
2
+ export { flexHarnessChatSessionMeta } from './classes.scopedirectory.js';
2
3
  export { FlexHarnessChatRequestError, FlexHarnessChatTabUnavailableError } from './errors.js';
3
4
  export { createFlexHarnessChatErrorProjector, type IFlexHarnessChatErrorProjectorOptions, } from './functions.errorprojector.js';
4
- export type { IFlexHarnessChatCaller, IFlexHarnessChatHubOptions, IFlexHarnessChatLimits, IFlexHarnessChatPeer, IFlexHarnessChatPeers, IFlexHarnessChatTurn, TFlexHarnessChatHubHarness, } from './interfaces.js';
5
+ export type { IFlexHarnessChatCaller, IFlexHarnessChatConversation, IFlexHarnessChatDirectory, IFlexHarnessChatHubOptions, IFlexHarnessChatLimits, IFlexHarnessChatPeer, IFlexHarnessChatPeers, IFlexHarnessChatTurn, TFlexHarnessChatHubHarness, } from './interfaces.js';
@@ -1,4 +1,5 @@
1
- export { FlexHarnessChatHub, defaultFlexHarnessChatLimits, flexHarnessChatSessionMeta, } from './classes.chathub.js';
1
+ export { FlexHarnessChatHub, defaultFlexHarnessChatLimits } from './classes.chathub.js';
2
+ export { flexHarnessChatSessionMeta } from './classes.scopedirectory.js';
2
3
  export { FlexHarnessChatRequestError, FlexHarnessChatTabUnavailableError } from './errors.js';
3
4
  export { createFlexHarnessChatErrorProjector, } from './functions.errorprojector.js';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2hhcm5lc3Nfc2VydmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQ0wsbUNBQW1DLEdBRXBDLE1BQU0sK0JBQStCLENBQUMifQ==
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2hhcm5lc3Nfc2VydmVyL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3hGLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM5RixPQUFPLEVBQ0wsbUNBQW1DLEdBRXBDLE1BQU0sK0JBQStCLENBQUMifQ==
@@ -1,7 +1,8 @@
1
1
  import type * as plugins from './plugins.js';
2
2
  /**
3
3
  * Who a request is from, as the host established it: the tab, and the scope whose conversations it
4
- * may reach. A tab is named by both: the same tab id in two scopes names two tabs.
4
+ * may reach. A tab is named by both: the same tab id in two scopes names two tabs. The scope names
5
+ * the tab's reach; with a directory, the conversations it reaches may run in scopes of their own.
5
6
  */
6
7
  export interface IFlexHarnessChatCaller {
7
8
  /** the browser tab, a per-page secret; pushes and tool calls of its turns go to it */
@@ -25,11 +26,41 @@ export interface IFlexHarnessChatPeers {
25
26
  }
26
27
  /** The running turn of a conversation: the tab that started it and the context it was sent with. */
27
28
  export interface IFlexHarnessChatTurn<TContext> {
29
+ /** the harness scope of the conversation */
28
30
  readonly scopeId: string;
29
31
  readonly sessionId: string;
30
- readonly tabId: string;
32
+ /** the tab that started the turn; its tool calls go to it */
33
+ readonly tab: IFlexHarnessChatCaller;
31
34
  readonly context: TContext;
32
35
  }
36
+ /** A conversation a tab reaches: where its session runs, and how its list shows it. */
37
+ export interface IFlexHarnessChatConversation {
38
+ /** the harness scope of the conversation's session */
39
+ scopeId: string;
40
+ sessionId: string;
41
+ meta: plugins.IHarnessSessionMeta;
42
+ /** an imported conversation can only be read */
43
+ readOnly: boolean;
44
+ }
45
+ /**
46
+ * The conversations of the tabs: which a tab lists and reaches, and how they are created, renamed
47
+ * and deleted. Without one, a tab's conversations are the root sessions of its scope. A host whose
48
+ * conversations run in scopes of their own, or that keeps records of its own, gives the hub one and
49
+ * tells the tabs of every change of their lists with `hub.publishSessions()`.
50
+ */
51
+ export interface IFlexHarnessChatDirectory {
52
+ /** The conversations the tab lists, most recent first. */
53
+ list(tab: IFlexHarnessChatCaller): Promise<plugins.IHarnessSessionMeta[]>;
54
+ /** A conversation the tab reaches, or null: one it does not reach reads as not found. */
55
+ find(tab: IFlexHarnessChatCaller, sessionId: string): Promise<IFlexHarnessChatConversation | null>;
56
+ /** Creates a conversation for the tab's first message; throw `FlexHarnessChatRequestError` to refuse. */
57
+ create(tab: IFlexHarnessChatCaller, init: {
58
+ title: string;
59
+ }): Promise<IFlexHarnessChatConversation>;
60
+ rename(tab: IFlexHarnessChatCaller, conversation: IFlexHarnessChatConversation, title: string): Promise<plugins.IHarnessSessionMeta>;
61
+ /** Deletes a conversation; also one created for a message that was then refused. */
62
+ delete(tab: IFlexHarnessChatCaller, conversation: IFlexHarnessChatConversation): Promise<void>;
63
+ }
33
64
  export interface IFlexHarnessChatLimits {
34
65
  /** A turn that runs longer is stopped. Default: 10 minutes. */
35
66
  turnTimeoutMs: number;
@@ -63,5 +94,7 @@ export interface IFlexHarnessChatHubOptions<TContext> {
63
94
  readContext(value: plugins.TJsonValue): TContext;
64
95
  /** The title of a conversation a message starts. Defaults to the message's first line. */
65
96
  titleOf?(send: plugins.IHarnessComposerSendDetail): string;
97
+ /** Where the tabs' conversations are. Defaults to the root sessions of the tab's scope. */
98
+ directory?: IFlexHarnessChatDirectory;
66
99
  limits?: Partial<IFlexHarnessChatLimits>;
67
100
  }
@@ -2,6 +2,6 @@ import { FlexHarnessClosedError, FlexHarnessError, FlexHarnessNotFoundError, Fle
2
2
  import { FlexHarnessChatRequestError, FlexHarnessTranscript, flexHarnessSendIntent, flexSessionToHarnessMeta } from '@modelprofile.com/flexharness/chat/harness';
3
3
  import { describeModelFailure } from '@modelprofile.com/flexharness-models';
4
4
  export { FlexHarnessChatRequestError, FlexHarnessClosedError, FlexHarnessError, FlexHarnessNotFoundError, FlexHarnessSteerRejectedError, FlexHarnessTranscript, FlexHarnessValidationError, describeModelFailure, flexHarnessSendIntent, flexSessionToHarnessMeta, modelLimitErrorInfo, };
5
- export type { FlexHarness, IFlexErrorInfo, IFlexExternalErrorContext, IFlexPromptQueueAdmission, IFlexSession, IFlexSessionCreatedEvent, IFlexSessionDeletedEvent, IFlexSessionUpdatedEvent, TFlexExternalErrorProjector, TFlexHarnessEvent, TJsonValue, } from '@modelprofile.com/flexharness';
5
+ export type { FlexHarness, IFlexErrorInfo, IFlexExternalErrorContext, IFlexPromptQueueAdmission, IFlexSession, TFlexExternalErrorProjector, TFlexHarnessEvent, TJsonValue, } from '@modelprofile.com/flexharness';
6
6
  export type { IFlexHarnessChatHistoryState, IFlexHarnessChatMethods, IFlexHarnessChatSessionsPush, IFlexHarnessChatSteerOutcome, IFlexHarnessChatToolRequest, IFlexHarnessChatUpdate, TFlexHarnessChatRequest, TFlexHarnessChatResponse, } from '@modelprofile.com/flexharness/chat/harness';
7
7
  export type { IHarnessAttachment, IHarnessComposerSendDetail, IHarnessMessage, IHarnessSessionMeta, THarnessStreamDelta, } from '@design.estate/dees-catalog';
@@ -1,15 +1,39 @@
1
1
  import * as plugins from './plugins.js';
2
+ /**
3
+ * What the transport uses of the tab's TypedSocket client. A `TypedSocket` client is one; a host
4
+ * whose own connection object carries the client can hand that object instead.
5
+ */
6
+ export interface IFlexHarnessChatTypedSocketClient {
7
+ createTypedRequest<T extends plugins.typedrequestInterfaces.ITypedRequest>(method: T['method']): {
8
+ fire(request: T['request']): Promise<T['response']>;
9
+ };
10
+ onEvent<TEvent extends plugins.typedsocket.ITypedSocketEvent>(name: TEvent['name'], handler: (payload: TEvent['payload']) => void | Promise<void>): () => void;
11
+ readonly eventResyncSubject: {
12
+ subscribe(observer: (resync: plugins.typedsocket.ITypedSocketEventResync) => void): {
13
+ unsubscribe(): void;
14
+ };
15
+ };
16
+ readonly statusSubject: {
17
+ subscribe(observer: (status: plugins.typedsocket.TConnectionStatus) => void): {
18
+ unsubscribe(): void;
19
+ };
20
+ };
21
+ }
2
22
  export interface IFlexHarnessChatTypedSocketTransportOptions {
3
23
  /** The tab's TypedSocket client. */
4
- typedsocket: plugins.typedsocket.TypedSocket;
5
- /** The router the client was created with; the transport adds its push handlers to it. */
24
+ typedsocket: IFlexHarnessChatTypedSocketClient;
25
+ /** The router the client was created with; the transport adds its tool handler to it. */
6
26
  typedrouter: plugins.typedrequest.TypedRouter;
7
27
  /** The tab: 16 random bytes in hex. Defaults to a new random id for this transport's lifetime. */
8
28
  tabId?: string;
9
29
  /** The opaque credential the server's `resolve` reads, read for every request. */
10
30
  callerToken?: () => string | undefined;
11
31
  }
12
- /** A `FlexHarnessChatClient` transport over the tab's TypedSocket client. */
32
+ /**
33
+ * A `FlexHarnessChatClient` transport over the tab's TypedSocket client. The hub's pushes wait on
34
+ * the server; an event says so, and the transport pulls them, one pull at a time. It also pulls
35
+ * whenever TypedSocket says events may have been missed: after every (re)connect, and after a gap.
36
+ */
13
37
  export declare class FlexHarnessChatTypedSocketTransport implements plugins.IFlexHarnessChatClientTransport {
14
38
  readonly tabId: string;
15
39
  private readonly socket;
@@ -19,4 +43,5 @@ export declare class FlexHarnessChatTypedSocketTransport implements plugins.IFle
19
43
  request<TMethod extends plugins.TFlexHarnessChatMethod>(methodArg: TMethod, requestArg: plugins.TFlexHarnessChatRequest<TMethod>): Promise<plugins.TFlexHarnessChatResponse<TMethod>>;
20
44
  listen(handlersArg: plugins.IFlexHarnessChatPushHandlers): () => void;
21
45
  onReconnect(callbackArg: () => void): () => void;
46
+ private caller;
22
47
  }
@@ -1,7 +1,14 @@
1
1
  import * as plugins from './plugins.js';
2
+ const PENDING_EVENT = 'flexHarnessChatPending';
2
3
  /** 128 random bits as hex; `getRandomValues` works on plain http too, unlike `randomUUID`. */
3
4
  const randomTabId = () => Array.from(globalThis.crypto.getRandomValues(new Uint8Array(16)), (byte) => byte.toString(16).padStart(2, '0')).join('');
4
- /** A `FlexHarnessChatClient` transport over the tab's TypedSocket client. */
5
+ /** A push the tab's handler failed on is reported; the server counts it as delivered all the same. */
6
+ const reportHandlerError = (error) => console.warn('FLEXHARNESS_CHAT_PUSH_HANDLER_ERROR', error);
7
+ /**
8
+ * A `FlexHarnessChatClient` transport over the tab's TypedSocket client. The hub's pushes wait on
9
+ * the server; an event says so, and the transport pulls them, one pull at a time. It also pulls
10
+ * whenever TypedSocket says events may have been missed: after every (re)connect, and after a gap.
11
+ */
5
12
  export class FlexHarnessChatTypedSocketTransport {
6
13
  tabId;
7
14
  socket;
@@ -14,28 +21,73 @@ export class FlexHarnessChatTypedSocketTransport {
14
21
  this.callerToken = optionsArg.callerToken ?? (() => undefined);
15
22
  }
16
23
  async request(methodArg, requestArg) {
17
- const token = this.callerToken();
18
24
  return this.socket.createTypedRequest(methodArg).fire({
19
25
  ...requestArg,
20
- caller: { tabId: this.tabId, ...(token === undefined ? {} : { token }) },
26
+ caller: this.caller(),
21
27
  });
22
28
  }
23
29
  listen(handlersArg) {
24
- const pushes = new plugins.typedrequest.TypedRouter();
25
- pushes.addTypedHandler(new plugins.typedrequest.TypedHandler('flexHarnessChatUpdate', async (pushArg) => {
26
- handlersArg.update(pushArg);
27
- return {};
28
- }));
29
- pushes.addTypedHandler(new plugins.typedrequest.TypedHandler('flexHarnessChatSessions', async (pushArg) => {
30
- handlersArg.sessions(pushArg);
31
- return {};
32
- }));
33
- pushes.addTypedHandler(new plugins.typedrequest.TypedHandler('flexHarnessChatTool', async (requestArg, toolsArg) => ({
30
+ let listening = true;
31
+ let pulling = false;
32
+ let pullAgain = false;
33
+ // one pull at a time; a signal that comes in meanwhile makes it pull once more
34
+ const pull = async () => {
35
+ if (pulling) {
36
+ pullAgain = true;
37
+ return;
38
+ }
39
+ pulling = true;
40
+ try {
41
+ do {
42
+ pullAgain = false;
43
+ let pushes;
44
+ try {
45
+ ({ pushes } = await this.socket
46
+ .createTypedRequest('flexHarnessChatPull')
47
+ .fire({ caller: this.caller() }));
48
+ }
49
+ catch {
50
+ // the pushes keep waiting for the next pull; one the server gives up on makes the hub start over
51
+ return;
52
+ }
53
+ for (const push of pushes) {
54
+ if (!listening)
55
+ return;
56
+ // a handler that throws takes nothing from the pushes after it
57
+ try {
58
+ if ('update' in push)
59
+ handlersArg.update(push.update);
60
+ else
61
+ handlersArg.sessions(push.sessions);
62
+ }
63
+ catch (error) {
64
+ reportHandlerError(error);
65
+ }
66
+ }
67
+ } while (pullAgain && listening);
68
+ }
69
+ finally {
70
+ pulling = false;
71
+ }
72
+ };
73
+ const tools = new plugins.typedrequest.TypedRouter();
74
+ tools.addTypedHandler(new plugins.typedrequest.TypedHandler('flexHarnessChatTool', async (requestArg, toolsArg) => ({
34
75
  // the server cancels the request when the turn stops or the call times out; the handler then
35
76
  // settles at once, since TypedSocket fails a connection whose handlers outlive their requests
36
77
  output: await handlersArg.tool(requestArg, toolsArg?.abortSignal),
37
78
  })));
38
- return this.router.addTypedRouter(pushes);
79
+ const removeTools = this.router.addTypedRouter(tools);
80
+ const removeEvent = this.socket.onEvent(PENDING_EVENT, () => pull());
81
+ const resyncs = this.socket.eventResyncSubject.subscribe((resyncArg) => {
82
+ if (resyncArg.names.includes(PENDING_EVENT))
83
+ void pull();
84
+ });
85
+ return () => {
86
+ listening = false;
87
+ resyncs.unsubscribe();
88
+ removeEvent();
89
+ removeTools();
90
+ };
39
91
  }
40
92
  onReconnect(callbackArg) {
41
93
  let wasConnected = true;
@@ -51,5 +103,9 @@ export class FlexHarnessChatTypedSocketTransport {
51
103
  });
52
104
  return () => subscription.unsubscribe();
53
105
  }
106
+ caller() {
107
+ const token = this.callerToken();
108
+ return { tabId: this.tabId, ...(token === undefined ? {} : { token }) };
109
+ }
54
110
  }
55
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGllbnR0cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2hhcm5lc3NfdHlwZWRzb2NrZXQvY2xhc3Nlcy5jbGllbnR0cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFtQnhDLDhGQUE4RjtBQUM5RixNQUFNLFdBQVcsR0FBRyxHQUFXLEVBQUUsQ0FDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFFM0gsNkVBQTZFO0FBQzdFLE1BQU0sT0FBTyxtQ0FBbUM7SUFDOUIsS0FBSyxDQUFTO0lBRWIsTUFBTSxDQUFrQztJQUN4QyxNQUFNLENBQW1DO0lBQ3pDLFdBQVcsQ0FBMkI7SUFFdkQsWUFBWSxVQUF1RDtRQUNqRSxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssSUFBSSxXQUFXLEVBQUUsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRSxDQUFDO0lBRU0sS0FBSyxDQUFDLE9BQU8sQ0FDbEIsU0FBa0IsRUFDbEIsVUFBb0Q7UUFFcEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBZ0MsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ25GLEdBQUcsVUFBVTtZQUNiLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRTtTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sTUFBTSxDQUFDLFdBQWlEO1FBQzdELE1BQU0sTUFBTSxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN0RCxNQUFNLENBQUMsZUFBZSxDQUNwQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUE2Qix1QkFBdUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDM0csV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM1QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLENBQUMsZUFBZSxDQUNwQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUErQix5QkFBeUIsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDL0csV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUM5QixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUNILENBQUM7UUFDRixNQUFNLENBQUMsZUFBZSxDQUNwQixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUEyQixxQkFBcUIsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0SCw2RkFBNkY7WUFDN0YsOEZBQThGO1lBQzlGLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUM7U0FDbEUsQ0FBQyxDQUFDLENBQ0osQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxXQUF1QjtRQUN4QyxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDeEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUU7WUFDckUsSUFBSSxTQUFTLEtBQUssV0FBVyxFQUFFLENBQUM7Z0JBQzlCLFlBQVksR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxZQUFZO2dCQUFFLE9BQU87WUFDekIsWUFBWSxHQUFHLElBQUksQ0FBQztZQUNwQixXQUFXLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFDLENBQUM7Q0FDRiJ9
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jbGllbnR0cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19jaGF0X2hhcm5lc3NfdHlwZWRzb2NrZXQvY2xhc3Nlcy5jbGllbnR0cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUF3Q3hDLE1BQU0sYUFBYSxHQUEwQyx3QkFBd0IsQ0FBQztBQUV0Riw4RkFBOEY7QUFDOUYsTUFBTSxXQUFXLEdBQUcsR0FBVyxFQUFFLENBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBRTNILHNHQUFzRztBQUN0RyxNQUFNLGtCQUFrQixHQUFHLENBQUMsS0FBYyxFQUFRLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFDQUFxQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBRWhIOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sbUNBQW1DO0lBQzlCLEtBQUssQ0FBUztJQUViLE1BQU0sQ0FBb0M7SUFDMUMsTUFBTSxDQUFtQztJQUN6QyxXQUFXLENBQTJCO0lBRXZELFlBQVksVUFBdUQ7UUFDakUsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQztRQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLElBQUksV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFV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
@@ -15,19 +15,21 @@ export interface IFlexHarnessChatTypedSocketBindingOptions {
15
15
  resolve(caller: IFlexHarnessChatCallerPayload, context: plugins.typedsocket.ITypedSocketRequestContext | undefined): Promise<IFlexHarnessChatResolvedCaller>;
16
16
  /** The server-owned connection tag that names a tab. Default: `flexHarnessChatTab`. */
17
17
  tag?: string;
18
- /** How long an update or a session-list push may wait for the tab. Default: 30 seconds. */
18
+ /** How long an update or a session-list push may wait for the tab to pull it. Default: 30 seconds. */
19
19
  pushTimeoutMs?: number;
20
20
  }
21
21
  /**
22
22
  * Serves a `FlexHarnessChatHub` over TypedSocket. Add `typedrouter` to the server's router, hand
23
23
  * the server's TypedSocket to `setTypedSocket()` once it runs, and give the hub `peers`. A tab's
24
- * connection carries the server-owned tag with its tab id; every request claims it again.
24
+ * connection carries the server-owned tag with its tab id; every request claims it again. The
25
+ * hub's pushes wait for the tab, which an event tells to pull them: TypedSocket events are
26
+ * signals, the pushes themselves travel in the answer of an authenticated request.
25
27
  */
26
28
  export declare class FlexHarnessChatTypedSocketBinding implements plugins.IFlexHarnessChatPeers {
27
29
  readonly typedrouter: plugins.typedrequest.TypedRouter<plugins.typedrequestInterfaces.ITypedRequest>;
28
30
  private readonly resolveCaller;
29
31
  private readonly tag;
30
- private readonly pushTimeoutMs;
32
+ private readonly mailboxes;
31
33
  private socket;
32
34
  constructor(optionsArg: IFlexHarnessChatTypedSocketBindingOptions);
33
35
  /** The server's TypedSocket; it exists once the server runs. */