@gaodefa/daocore 2026.5.84 → 2026.5.85

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 (92) hide show
  1. package/dist/acp/control-plane/manager.d.ts +1 -2
  2. package/dist/{agent-command-DQ1XgXqe.d.ts → agent-command-COFQwKxZ.d.ts} +38 -2
  3. package/dist/{agent-harness-Bt_1zRJ1.d.ts → agent-harness-WlBoSv-g.d.ts} +1 -1
  4. package/dist/build-info.json +3 -3
  5. package/dist/canvas-host/a2ui/.bundle.hash +1 -1
  6. package/dist/{channel-Czs81UUj.d.ts → channel-cGJKLfJe.d.ts} +2 -2
  7. package/dist/{channel-lifecycle-BXdiTu_h.d.ts → channel-lifecycle-C4NrMjdz.d.ts} +0 -1
  8. package/dist/{channel-pairing-qPwn6FAN.d.ts → channel-pairing-ndZVB-VX.d.ts} +1 -1
  9. package/dist/cli-startup-metadata.json +8 -8
  10. package/dist/control-ui/apple-touch-icon.png +0 -0
  11. package/dist/control-ui/assets/agents-DHLE0HFl.js +1008 -0
  12. package/dist/control-ui/assets/ar-DmY3OKJ7.js +2 -0
  13. package/dist/control-ui/assets/channel-config-extras-CxFOBh-V.js +2 -0
  14. package/dist/control-ui/assets/channels-C6FcgeKY.js +367 -0
  15. package/dist/control-ui/assets/cron-SXiWM7mY.js +1013 -0
  16. package/dist/control-ui/assets/de-nNWCMyC9.js +2 -0
  17. package/dist/control-ui/assets/debug-B0jMeZzd.js +97 -0
  18. package/dist/control-ui/assets/es-BcdhLNdf.js +2 -0
  19. package/dist/control-ui/assets/fa-DbS2z7VZ.js +2 -0
  20. package/dist/control-ui/assets/fr-CBqvw0rY.js +2 -0
  21. package/dist/control-ui/assets/id-DXES9f6X.js +2 -0
  22. package/dist/control-ui/assets/index-BimYwq-S.css +1 -0
  23. package/dist/control-ui/assets/index-DL8I3w4m.js +7373 -0
  24. package/dist/control-ui/assets/instances-CzcXlcf6.js +57 -0
  25. package/dist/control-ui/assets/it-DpT4ZVOU.js +2 -0
  26. package/dist/control-ui/assets/ja-JP-D8RXA_04.js +2 -0
  27. package/dist/control-ui/assets/ko-5en8VO8w.js +2 -0
  28. package/dist/control-ui/assets/logs-UowLBcx5.js +74 -0
  29. package/dist/control-ui/assets/nl-Bb10QoRg.js +2 -0
  30. package/dist/control-ui/assets/nodes-elwKg1C7.js +436 -0
  31. package/dist/control-ui/assets/pl-Y8UIOEIm.js +2 -0
  32. package/dist/control-ui/assets/preview-BBw3vauN.js +2 -0
  33. package/dist/control-ui/assets/pt-BR-DDsy5M68.js +2 -0
  34. package/dist/control-ui/assets/push-subscription-TTvs1whj.js +2 -0
  35. package/dist/control-ui/assets/sessions-zRBKS883.js +399 -0
  36. package/dist/control-ui/assets/skills-Bdaz7HoH.js +314 -0
  37. package/dist/control-ui/assets/skills-shared-DMTrs8i3.js +11 -0
  38. package/dist/control-ui/assets/th-D_2DtFn6.js +2 -0
  39. package/dist/control-ui/assets/tr-DBsYZTmE.js +2 -0
  40. package/dist/control-ui/assets/uk-BUxHBc05.js +2 -0
  41. package/dist/control-ui/assets/vi-B67Eos5b.js +2 -0
  42. package/dist/control-ui/assets/zh-CN-1-UH_6gQ.js +2 -0
  43. package/dist/control-ui/assets/zh-TW-CA4YEnf2.js +2 -0
  44. package/dist/control-ui/favicon-32.png +0 -0
  45. package/dist/control-ui/favicon-512.png +0 -0
  46. package/dist/control-ui/favicon.ico +0 -0
  47. package/dist/control-ui/favicon.svg +12 -0
  48. package/dist/control-ui/index.html +322 -0
  49. package/dist/control-ui/manifest.webmanifest +40 -0
  50. package/dist/control-ui/sw.js +133 -0
  51. package/dist/extensions/anthropic/doctor-contract-api.d.ts +1 -1
  52. package/dist/extensions/browser/test-support.d.ts +1 -1
  53. package/dist/extensions/google/doctor-contract-api.d.ts +1 -1
  54. package/dist/extensions/image-generation-core/api.d.ts +1 -1
  55. package/dist/extensions/imessage/message-tool-api.d.ts +1 -1
  56. package/dist/extensions/imessage/runtime-api.d.ts +1 -1
  57. package/dist/extensions/mattermost/runtime-api.d.ts +7 -7
  58. package/dist/extensions/signal/api.d.ts +1 -1
  59. package/dist/extensions/signal/runtime-api.d.ts +2 -2
  60. package/dist/extensions/telegram/api.d.ts +1 -1
  61. package/dist/extensions/video-generation-core/api.d.ts +1 -1
  62. package/dist/extensions/webhooks/runtime-api.d.ts +2 -2
  63. package/dist/{hook-runtime-BBONf8H3.d.ts → hook-runtime-Cms52qXe.d.ts} +0 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/{manager.core-BRd2_lqA.d.ts → manager-CuzV3XAs.d.ts} +8 -1
  66. package/dist/{pairing-store-Cfy_zHzi.d.ts → pairing-challenge-EwSQYSud.d.ts} +34 -34
  67. package/dist/plugin-sdk/.boundary-entry-shims.stamp +1 -1
  68. package/dist/plugin-sdk/scripts/lib/plugin-sdk-doc-metadata.d.ts +107 -0
  69. package/dist/plugin-sdk/src/commands/doctor.types.d.ts +1 -0
  70. package/dist/plugin-sdk/src/compat/legacy-names.d.ts +1 -1
  71. package/dist/plugin-sdk/src/plugins/manifest.d.ts +1 -1
  72. package/dist/{runtime-D21vC5Bd.d.ts → runtime-C3k-ZByi.d.ts} +1 -1
  73. package/dist/{runtime-api.actions-CClxRuYx.d.ts → runtime-api.actions-CzDO06T7.d.ts} +1 -1
  74. package/dist/{runtime-api.send-wXeDllRu.d.ts → runtime-api.send-C_MjuzGA.d.ts} +1 -1
  75. package/dist/{runtime-doctor-DVYwKwIT.d.ts → runtime-doctor-_yVIDUi3.d.ts} +1 -0
  76. package/dist/{send-DZ4YhPHH.d.ts → send-CTDEXMPp.d.ts} +1 -1
  77. package/dist/{send-D95RJNJM.d.ts → send-DaFuA5cD.d.ts} +1 -0
  78. package/dist/{send.types-_f4omMzG.d.ts → send.types-DU1uiiR9.d.ts} +1 -0
  79. package/dist/task-registry-control.runtime.d.ts +1 -1
  80. package/dist/{test-fixtures-xgg7UsEw.d.ts → test-fixtures-HY6a4nTW.d.ts} +0 -1
  81. package/dist/{typed-cases-v8PtmO3g.d.ts → typed-cases-BYRVKA1F.d.ts} +1 -1
  82. package/dist/{webhook-targets-C9cJD_kB.d.ts → webhook-targets-DqetRJVn.d.ts} +1 -1
  83. package/npm-shrinkwrap.json +2 -2
  84. package/package.json +1 -1
  85. package/dist/manager-DWN3qo90.d.ts +0 -10
  86. package/dist/reply-runtime-DUv2dRp3.d.ts +0 -34
  87. package/dist/server-plugins-BVVgDSdq.d.ts +0 -1
  88. package/dist/subagent-registry-BVVgDSdq.d.ts +0 -1
  89. package/dist/subagent-registry-read-BVVgDSdq.d.ts +0 -1
  90. package/dist/test-support-BVVgDSdq.d.ts +0 -1
  91. /package/dist/{models-D6WT5XG82.d.ts → models-D6WT5XG8.d.ts} +0 -0
  92. /package/dist/{runtime-api-C7ToEUFX.d.ts → runtime-api-C7ToEUFX2.d.ts} +0 -0
@@ -0,0 +1,322 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
+ <title>DaoCore Control</title>
7
+ <meta name="color-scheme" content="dark light" />
8
+ <link rel="icon" type="image/svg+xml" href="./favicon.svg" />
9
+ <link rel="icon" type="image/png" sizes="32x32" href="./favicon-32.png" />
10
+ <link rel="apple-touch-icon" sizes="180x180" href="./apple-touch-icon.png" />
11
+ <link rel="manifest" href="manifest.webmanifest" />
12
+ <script>
13
+ (function () {
14
+ var THEMES = { claw: 1, knot: 1, dash: 1 };
15
+ var MODES = { system: 1, light: 1, dark: 1 };
16
+ var LEGACY = {
17
+ dark: "claw:dark",
18
+ light: "claw:light",
19
+ openknot: "knot:dark",
20
+ fieldmanual: "dash:dark",
21
+ clawdash: "dash:light",
22
+ system: "claw:system",
23
+ };
24
+ try {
25
+ var keys = Object.keys(localStorage);
26
+ var raw;
27
+ for (var i = 0; i < keys.length; i++) {
28
+ if (keys[i].indexOf("daocore.control.settings.v1") === 0) {
29
+ raw = localStorage.getItem(keys[i]);
30
+ if (raw) break;
31
+ }
32
+ }
33
+ if (!raw) return;
34
+ var s = JSON.parse(raw);
35
+ var t = s && s.theme;
36
+ var m = s && s.themeMode;
37
+ if (typeof t !== "string") t = "";
38
+ if (typeof m !== "string") m = "";
39
+ var legacy = LEGACY[t];
40
+ var theme = THEMES[t] ? t : legacy ? legacy.split(":")[0] : "claw";
41
+ var mode = MODES[m] ? m : legacy ? legacy.split(":")[1] : "system";
42
+ if (mode === "system") {
43
+ mode = window.matchMedia("(prefers-color-scheme: light)").matches ? "light" : "dark";
44
+ }
45
+ var resolved =
46
+ theme === "knot"
47
+ ? mode === "light"
48
+ ? "openknot-light"
49
+ : "openknot"
50
+ : theme === "dash"
51
+ ? mode === "light"
52
+ ? "dash-light"
53
+ : "dash"
54
+ : mode === "light"
55
+ ? "light"
56
+ : "dark";
57
+ document.documentElement.setAttribute("data-theme", resolved);
58
+ document.documentElement.setAttribute(
59
+ "data-theme-mode",
60
+ resolved.indexOf("light") !== -1 ? "light" : "dark",
61
+ );
62
+ } catch (e) {}
63
+ })();
64
+ </script>
65
+ <style>
66
+ body.daocore-mount-fallback-active {
67
+ margin: 0;
68
+ min-width: 320px;
69
+ color: #eef4f8;
70
+ background: #101418;
71
+ font-family:
72
+ Inter,
73
+ ui-sans-serif,
74
+ system-ui,
75
+ -apple-system,
76
+ BlinkMacSystemFont,
77
+ "Segoe UI",
78
+ sans-serif;
79
+ }
80
+
81
+ body.daocore-mount-fallback-active daocore-app {
82
+ display: none;
83
+ }
84
+
85
+ .mount-fallback {
86
+ box-sizing: border-box;
87
+ min-height: 100vh;
88
+ padding: 24px;
89
+ place-items: center;
90
+ }
91
+
92
+ .mount-fallback:not([hidden]) {
93
+ display: grid;
94
+ }
95
+
96
+ .mount-fallback__panel {
97
+ box-sizing: border-box;
98
+ width: min(100%, 640px);
99
+ border: 1px solid rgba(148, 163, 184, 0.28);
100
+ border-radius: 8px;
101
+ background: #151b21;
102
+ box-shadow: 0 24px 80px rgba(0, 0, 0, 0.36);
103
+ padding: 28px;
104
+ }
105
+
106
+ .mount-fallback__eyebrow {
107
+ margin: 0 0 10px;
108
+ color: #9fb0bd;
109
+ font-size: 0.78rem;
110
+ font-weight: 700;
111
+ letter-spacing: 0.08em;
112
+ text-transform: uppercase;
113
+ }
114
+
115
+ .mount-fallback__panel h1 {
116
+ margin: 0;
117
+ color: inherit;
118
+ font-size: clamp(1.5rem, 3vw, 2rem);
119
+ line-height: 1.15;
120
+ }
121
+
122
+ .mount-fallback__panel p {
123
+ margin: 16px 0 0;
124
+ color: #c8d3da;
125
+ font-size: 1rem;
126
+ line-height: 1.6;
127
+ }
128
+
129
+ .mount-fallback__panel ul {
130
+ margin: 18px 0 0;
131
+ padding-left: 1.2rem;
132
+ color: #c8d3da;
133
+ line-height: 1.6;
134
+ }
135
+
136
+ .mount-fallback__panel a {
137
+ color: #8bd3ff;
138
+ text-decoration-thickness: 0.08em;
139
+ text-underline-offset: 0.18em;
140
+ }
141
+
142
+ .mount-fallback__actions {
143
+ display: flex;
144
+ flex-wrap: wrap;
145
+ gap: 10px;
146
+ margin-top: 24px;
147
+ }
148
+
149
+ .mount-fallback__button {
150
+ min-height: 42px;
151
+ border: 1px solid rgba(148, 163, 184, 0.36);
152
+ border-radius: 6px;
153
+ padding: 0 16px;
154
+ color: inherit;
155
+ background: transparent;
156
+ font: inherit;
157
+ font-weight: 700;
158
+ cursor: pointer;
159
+ }
160
+
161
+ .mount-fallback__button--primary {
162
+ border-color: #66c2ff;
163
+ color: #061019;
164
+ background: #8bd3ff;
165
+ }
166
+
167
+ .mount-fallback__panel:focus {
168
+ outline: none;
169
+ }
170
+
171
+ .mount-fallback__button:focus-visible,
172
+ .mount-fallback__panel a:focus-visible {
173
+ outline: 3px solid #f9c74f;
174
+ outline-offset: 3px;
175
+ }
176
+
177
+ html[data-theme-mode="light"] body.daocore-mount-fallback-active {
178
+ color: #151b21;
179
+ background: #f5f7fa;
180
+ }
181
+
182
+ html[data-theme-mode="light"] .mount-fallback__panel {
183
+ border-color: rgba(71, 85, 105, 0.22);
184
+ background: #ffffff;
185
+ box-shadow: 0 24px 80px rgba(15, 23, 42, 0.14);
186
+ }
187
+
188
+ html[data-theme-mode="light"] .mount-fallback__eyebrow,
189
+ html[data-theme-mode="light"] .mount-fallback__panel p,
190
+ html[data-theme-mode="light"] .mount-fallback__panel ul {
191
+ color: #4b5963;
192
+ }
193
+
194
+ html[data-theme-mode="light"] .mount-fallback__panel a {
195
+ color: #0369a1;
196
+ }
197
+ </style>
198
+ <script type="module" crossorigin src="./assets/index-DL8I3w4m.js"></script>
199
+ <link rel="stylesheet" crossorigin href="./assets/index-BimYwq-S.css">
200
+ </head>
201
+ <body>
202
+ <daocore-app></daocore-app>
203
+ <section
204
+ id="daocore-mount-fallback"
205
+ class="mount-fallback"
206
+ data-daocore-mount-timeout-ms="12000"
207
+ role="alert"
208
+ aria-labelledby="daocore-mount-fallback-title"
209
+ hidden
210
+ >
211
+ <div class="mount-fallback__panel" tabindex="-1">
212
+ <p class="mount-fallback__eyebrow">DaoCore Control UI</p>
213
+ <h1 id="daocore-mount-fallback-title">Control UI did not start</h1>
214
+ <p>
215
+ The browser loaded the static page, but the app bundle did not register the
216
+ <code>daocore-app</code> web component. A browser extension or early content script may
217
+ be blocking module execution.
218
+ </p>
219
+ <ul>
220
+ <li>Try again in a clean browser profile or private window.</li>
221
+ <li>Disable extensions that run on all pages, then reload this dashboard.</li>
222
+ <li>
223
+ See
224
+ <a
225
+ href="https://docs.daocore.ai/web/control-ui#blank-control-ui-page"
226
+ target="_blank"
227
+ rel="noopener noreferrer"
228
+ >Control UI troubleshooting</a
229
+ >.
230
+ </li>
231
+ </ul>
232
+ <div class="mount-fallback__actions">
233
+ <button
234
+ type="button"
235
+ id="daocore-mount-retry"
236
+ class="mount-fallback__button mount-fallback__button--primary"
237
+ >
238
+ Try again
239
+ </button>
240
+ <button type="button" id="daocore-mount-wait" class="mount-fallback__button">
241
+ Keep waiting
242
+ </button>
243
+ </div>
244
+ </div>
245
+ </section>
246
+ <script>
247
+ (function () {
248
+ var tagName = "daocore-app";
249
+ var app = document.querySelector(tagName);
250
+ var fallback = document.getElementById("daocore-mount-fallback");
251
+ if (!app || !fallback) return;
252
+
253
+ var panel = fallback.querySelector(".mount-fallback__panel");
254
+ var retry = document.getElementById("daocore-mount-retry");
255
+ var wait = document.getElementById("daocore-mount-wait");
256
+ var rawDelay = Number(fallback.getAttribute("data-daocore-mount-timeout-ms"));
257
+ var delay = Number.isFinite(rawDelay) && rawDelay > 0 ? rawDelay : 12000;
258
+ var timer;
259
+
260
+ function appMounted() {
261
+ try {
262
+ return Boolean(
263
+ app.isConnected &&
264
+ window.customElements &&
265
+ typeof window.customElements.get === "function" &&
266
+ window.customElements.get(tagName),
267
+ );
268
+ } catch (e) {
269
+ return false;
270
+ }
271
+ }
272
+
273
+ function hideFallback() {
274
+ fallback.hidden = true;
275
+ document.body.classList.remove("daocore-mount-fallback-active");
276
+ }
277
+
278
+ function showFallback() {
279
+ if (appMounted()) return;
280
+ fallback.hidden = false;
281
+ document.body.classList.add("daocore-mount-fallback-active");
282
+ if (panel && typeof panel.focus === "function") {
283
+ try {
284
+ panel.focus({ preventScroll: true });
285
+ } catch (e) {
286
+ panel.focus();
287
+ }
288
+ }
289
+ }
290
+
291
+ function armFallbackTimer() {
292
+ window.clearTimeout(timer);
293
+ timer = window.setTimeout(showFallback, delay);
294
+ }
295
+
296
+ armFallbackTimer();
297
+
298
+ if (window.customElements && typeof window.customElements.whenDefined === "function") {
299
+ window.customElements.whenDefined(tagName).then(
300
+ function () {
301
+ window.clearTimeout(timer);
302
+ hideFallback();
303
+ },
304
+ function () {},
305
+ );
306
+ }
307
+
308
+ if (retry) {
309
+ retry.addEventListener("click", function () {
310
+ window.location.reload();
311
+ });
312
+ }
313
+ if (wait) {
314
+ wait.addEventListener("click", function () {
315
+ hideFallback();
316
+ armFallbackTimer();
317
+ });
318
+ }
319
+ })();
320
+ </script>
321
+ </body>
322
+ </html>
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "DaoCore Control",
3
+ "short_name": "DaoCore",
4
+ "description": "DaoCore AI 网关控制面板",
5
+ "start_url": "./",
6
+ "display": "standalone",
7
+ "theme_color": "#050810",
8
+ "background_color": "#050810",
9
+ "icons": [
10
+ {
11
+ "src": "./favicon.svg",
12
+ "sizes": "any",
13
+ "type": "image/svg+xml",
14
+ "purpose": "any"
15
+ },
16
+ {
17
+ "src": "./favicon-32.png",
18
+ "sizes": "32x32",
19
+ "type": "image/png"
20
+ },
21
+ {
22
+ "src": "./apple-touch-icon.png",
23
+ "sizes": "180x180",
24
+ "type": "image/png"
25
+ }
26
+ ],
27
+ "related_applications": [
28
+ {
29
+ "platform": "macos",
30
+ "url": "daocore://",
31
+ "id": "ai.daocore.mac"
32
+ }
33
+ ],
34
+ "protocol_handlers": [
35
+ {
36
+ "protocol": "web+daocore",
37
+ "url": "./?deeplink=%s"
38
+ }
39
+ ]
40
+ }
@@ -0,0 +1,133 @@
1
+ // DaoCore Control – Service Worker
2
+ // Handles offline caching and push notifications.
3
+
4
+ const CACHE_PREFIX = "daocore-control-";
5
+ const EMBEDDED_CACHE_VERSION = "2026.5.85-26b59ca41cf5";
6
+ const URL_CACHE_VERSION = new URL(self.location.href).searchParams
7
+ .get("v")
8
+ ?.replace(/[^a-zA-Z0-9._-]/g, "-");
9
+ const CACHE_VERSION =
10
+ (EMBEDDED_CACHE_VERSION !== "__DAOCORE_CONTROL_UI_BUILD_ID__"
11
+ ? EMBEDDED_CACHE_VERSION
12
+ : URL_CACHE_VERSION) || "dev";
13
+ const CACHE_NAME = `${CACHE_PREFIX}${CACHE_VERSION}`;
14
+ const CONTROL_CACHE_LIMIT = 3;
15
+
16
+ // Minimal app-shell files to precache.
17
+ const PRECACHE_URLS = ["./"];
18
+
19
+ self.addEventListener("install", (event) => {
20
+ event.waitUntil(caches.open(CACHE_NAME).then((cache) => cache.addAll(PRECACHE_URLS)));
21
+ self.skipWaiting();
22
+ });
23
+
24
+ self.addEventListener("activate", (event) => {
25
+ // Keep a small prior-build window so open tabs can still load old hashed chunks after updates.
26
+ event.waitUntil(
27
+ Promise.all([
28
+ self.clients.claim(),
29
+ caches.keys().then((keys) => {
30
+ const controlKeys = keys.filter((key) => key.startsWith(CACHE_PREFIX));
31
+ const priorCacheLimit = Math.max(0, CONTROL_CACHE_LIMIT - 1);
32
+ const retained = new Set([
33
+ ...controlKeys.filter((key) => key !== CACHE_NAME).slice(-priorCacheLimit),
34
+ CACHE_NAME,
35
+ ]);
36
+ return Promise.all(
37
+ controlKeys.filter((key) => !retained.has(key)).map((key) => caches.delete(key)),
38
+ );
39
+ }),
40
+ ]),
41
+ );
42
+ });
43
+
44
+ self.addEventListener("fetch", (event) => {
45
+ const url = new URL(event.request.url);
46
+
47
+ // Skip non-GET and cross-origin requests.
48
+ if (event.request.method !== "GET" || url.origin !== self.location.origin) {
49
+ return;
50
+ }
51
+
52
+ // Skip non-UI routes — API, RPC, and plugin routes should never be cached.
53
+ if (
54
+ url.pathname.startsWith("/api/") ||
55
+ url.pathname.startsWith("/rpc") ||
56
+ url.pathname.startsWith("/plugins/")
57
+ ) {
58
+ return;
59
+ }
60
+
61
+ // Cache-first for hashed assets; network-first for HTML/other.
62
+ if (url.pathname.includes("/assets/")) {
63
+ event.respondWith(
64
+ caches.match(event.request).then(
65
+ (cached) =>
66
+ cached ||
67
+ fetch(event.request).then((response) => {
68
+ if (response.ok) {
69
+ const clone = response.clone();
70
+ void caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone));
71
+ }
72
+ return response;
73
+ }),
74
+ ),
75
+ );
76
+ } else {
77
+ event.respondWith(
78
+ fetch(event.request)
79
+ .then((response) => {
80
+ if (response.ok) {
81
+ const clone = response.clone();
82
+ void caches.open(CACHE_NAME).then((cache) => cache.put(event.request, clone));
83
+ }
84
+ return response;
85
+ })
86
+ .catch(() => caches.match(event.request)),
87
+ );
88
+ }
89
+ });
90
+
91
+ // --- Web Push ---
92
+
93
+ self.addEventListener("push", (event) => {
94
+ if (!event.data) {
95
+ return;
96
+ }
97
+
98
+ let data;
99
+ try {
100
+ data = event.data.json();
101
+ } catch {
102
+ data = { title: "DaoCore", body: event.data.text() };
103
+ }
104
+
105
+ const title = data.title || "DaoCore";
106
+ const options = {
107
+ body: data.body || "",
108
+ icon: "./apple-touch-icon.png",
109
+ badge: "./favicon-32.png",
110
+ tag: data.tag || "daocore-notification",
111
+ data: { url: data.url || "./" },
112
+ };
113
+
114
+ event.waitUntil(self.registration.showNotification(title, options));
115
+ });
116
+
117
+ self.addEventListener("notificationclick", (event) => {
118
+ event.notification.close();
119
+
120
+ const targetUrl = event.notification.data?.url || "./";
121
+
122
+ event.waitUntil(
123
+ self.clients.matchAll({ type: "window", includeUncontrolled: true }).then((clients) => {
124
+ // Focus an existing window if one is open.
125
+ for (const client of clients) {
126
+ if (new URL(client.url).pathname === new URL(targetUrl, self.location.origin).pathname) {
127
+ return client.focus();
128
+ }
129
+ }
130
+ return self.clients.openWindow(targetUrl);
131
+ }),
132
+ );
133
+ });
@@ -1,4 +1,4 @@
1
- import { t as DoctorSessionRouteStateOwner } from "../../runtime-doctor-DVYwKwIT.js";
1
+ import { t as DoctorSessionRouteStateOwner } from "../../runtime-doctor-_yVIDUi3.js";
2
2
 
3
3
  //#region extensions/anthropic/doctor-contract-api.d.ts
4
4
  declare const legacyConfigRules: never[];
@@ -1,4 +1,4 @@
1
1
  import { r as DaoCoreConfig } from "../../types.daocore-z1fablj2.js";
2
- import { d as CliRuntimeCapture, f as createCliRuntimeCapture, n as expectGeneratedTokenPersistedToGatewayAuth, u as CliMockOutputRuntime } from "../../typed-cases-v8PtmO3g.js";
2
+ import { d as CliRuntimeCapture, f as createCliRuntimeCapture, n as expectGeneratedTokenPersistedToGatewayAuth, u as CliMockOutputRuntime } from "../../typed-cases-BYRVKA1F.js";
3
3
  import { a as createTempHomeEnv, c as withFetchPreconnect, d as withEnvAsync, i as TempHomeEnv, s as FetchMock, u as withEnv, z as isLiveTestEnabled } from "../../frozen-time-DwAZolm2.js";
4
4
  export { type CliMockOutputRuntime, type CliRuntimeCapture, type DaoCoreConfig, type FetchMock, type TempHomeEnv, createCliRuntimeCapture, createTempHomeEnv, expectGeneratedTokenPersistedToGatewayAuth, isLiveTestEnabled, withEnv, withEnvAsync, withFetchPreconnect };
@@ -1,4 +1,4 @@
1
- import { t as DoctorSessionRouteStateOwner } from "../../runtime-doctor-DVYwKwIT.js";
1
+ import { t as DoctorSessionRouteStateOwner } from "../../runtime-doctor-_yVIDUi3.js";
2
2
 
3
3
  //#region extensions/google/doctor-contract-api.d.ts
4
4
  declare const sessionRouteStateOwners: DoctorSessionRouteStateOwner[];
@@ -6,9 +6,9 @@ import { G as ImageGenerationProviderPlugin } from "../../types-Zj4Bq9h-2.js";
6
6
  import { n as createSubsystemLogger } from "../../subsystem-Ce5qcC5n.js";
7
7
  import { n as getProviderEnvVars } from "../../provider-env-vars-D4P1nybb.js";
8
8
  import { k as normalizeGooglePreviewModelId } from "../../provider-model-shared-Bv_vhH6i.js";
9
+ import { n as resolveAgentModelPrimaryValue, t as resolveAgentModelFallbackValues } from "../../model-input-Bcau7j-d.js";
9
10
  import { n as resolveApiKeyForProvider, r as parseImageGenerationModelRef, t as OPENAI_DEFAULT_IMAGE_MODEL } from "../../image-generation-core-CTdXmiWL.js";
10
11
  import { n as isFailoverError, t as describeFailoverError } from "../../failover-error-DQhtVXzc.js";
11
12
  import { c as resolveCapabilityModelCandidates, m as throwCapabilityGenerationFailure, r as buildNoCapabilityModelConfiguredMessage } from "../../runtime-shared-D647LTXM.js";
12
- import { n as resolveAgentModelPrimaryValue, t as resolveAgentModelFallbackValues } from "../../model-input-Bcau7j-d.js";
13
13
  import { n as listImageGenerationProviders, t as getImageGenerationProvider } from "../../provider-registry-BQ5DzWBt.js";
14
14
  export { type AuthProfileStore, type DaoCoreConfig, type FallbackAttempt, type GeneratedImageAsset, type ImageGenerationProvider, type ImageGenerationProviderConfiguredContext, type ImageGenerationProviderPlugin, type ImageGenerationRequest, type ImageGenerationResolution, type ImageGenerationResult, type ImageGenerationSourceImage, OPENAI_DEFAULT_IMAGE_MODEL, buildNoCapabilityModelConfiguredMessage, createSubsystemLogger, describeFailoverError, getImageGenerationProvider, getProviderEnvVars, isFailoverError, listImageGenerationProviders, normalizeGooglePreviewModelId as normalizeGoogleModelId, parseImageGenerationModelRef, resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, resolveApiKeyForProvider, resolveCapabilityModelCandidates, throwCapabilityGenerationFailure };
@@ -5,7 +5,7 @@ declare function describeIMessageMessageTool({
5
5
  accountId,
6
6
  currentChannelId
7
7
  }: Parameters<NonNullable<ChannelMessageActionAdapter["describeMessageTool"]>>[0]): {
8
- actions: ("permissions" | "timeout" | "search" | "reply" | "poll" | "pin" | "send" | "broadcast" | "poll-vote" | "react" | "reactions" | "read" | "edit" | "unsend" | "sendWithEffect" | "renameGroup" | "setGroupIcon" | "addParticipant" | "removeParticipant" | "leaveGroup" | "sendAttachment" | "delete" | "unpin" | "list-pins" | "thread-create" | "thread-list" | "thread-reply" | "sticker" | "sticker-search" | "member-info" | "role-info" | "emoji-list" | "emoji-upload" | "sticker-upload" | "role-add" | "role-remove" | "channel-info" | "channel-list" | "channel-create" | "channel-edit" | "channel-delete" | "channel-move" | "category-create" | "category-edit" | "category-delete" | "topic-create" | "topic-edit" | "voice-status" | "event-list" | "event-create" | "kick" | "ban" | "set-profile" | "set-presence" | "download-file" | "upload-file")[];
8
+ actions: ("permissions" | "timeout" | "search" | "reply" | "send" | "broadcast" | "poll" | "poll-vote" | "react" | "reactions" | "read" | "edit" | "unsend" | "sendWithEffect" | "renameGroup" | "setGroupIcon" | "addParticipant" | "removeParticipant" | "leaveGroup" | "sendAttachment" | "delete" | "pin" | "unpin" | "list-pins" | "thread-create" | "thread-list" | "thread-reply" | "sticker" | "sticker-search" | "member-info" | "role-info" | "emoji-list" | "emoji-upload" | "sticker-upload" | "role-add" | "role-remove" | "channel-info" | "channel-list" | "channel-create" | "channel-edit" | "channel-delete" | "channel-move" | "category-create" | "category-edit" | "category-delete" | "topic-create" | "topic-edit" | "voice-status" | "event-list" | "event-create" | "kick" | "ban" | "set-profile" | "set-presence" | "download-file" | "upload-file")[];
9
9
  } | null;
10
10
  //#endregion
11
11
  export { describeIMessageMessageTool as describeMessageTool };
@@ -10,9 +10,9 @@ import { r as buildChannelConfigSchema } from "../../config-schema-Dx48Ud8L.js";
10
10
  import { d as getChatChannelMeta } from "../../core-B7zb6eoz.js";
11
11
  import { t as PAIRING_APPROVED_MESSAGE } from "../../pairing-message-CPDqF95Z.js";
12
12
  import { c as collectStatusIssuesFromLastError, r as buildComputedAccountStatusSnapshot } from "../../status-helpers-CXimLFTG.js";
13
+ import { t as chunkTextForOutbound } from "../../text-chunking-B2vtBPHV.js";
13
14
  import { i as IMessageConfigSchema } from "../../bundled-channel-config-schema-4eXcH-RE.js";
14
15
  import { g as formatTrimmedAllowFromEntries } from "../../channel-config-helpers-CT_uHJja.js";
15
- import { t as chunkTextForOutbound } from "../../text-chunking-B2vtBPHV.js";
16
16
  import { a as looksLikeIMessageTargetId, o as normalizeIMessageMessagingTarget, r as probeIMessage, s as ResolvedIMessageAccount, t as IMessageProbe } from "../../probe-BsCqBWdU.js";
17
17
  import { d as resolveIMessageGroupRequireMention, f as resolveIMessageGroupToolPolicy, n as IMessageService } from "../../targets-CU1hATDw.js";
18
18
 
@@ -24,21 +24,21 @@ import { i as parseStrictPositiveInteger } from "../../parse-finite-number-DclbL
24
24
  import { i as resolveClientIp, r as isTrustedProxyAddress } from "../../net-F7HGAsK5.js";
25
25
  import { r as normalizeProviderId } from "../../provider-id--cxPuRVm.js";
26
26
  import { n as isDangerousNameMatchingEnabled } from "../../dangerous-name-matching-D8w3gqIz.js";
27
- import { t as rawDataToString } from "../../ws-DPQUGEy8.js";
28
- import { n as registerPluginHttpRoute } from "../../http-registry-D3Cdok5J.js";
29
- import { a as getAgentScopedMediaLocalRoots, n as buildAgentMediaPayload } from "../../agent-media-payload-BCMtUkvt.js";
27
+ import { r as buildComputedAccountStatusSnapshot } from "../../status-helpers-CXimLFTG.js";
28
+ import { t as chunkTextForOutbound } from "../../text-chunking-B2vtBPHV.js";
30
29
  import { a as warnMissingProviderGroupPolicyFallbackOnce, n as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy, t as GROUP_POLICY_BLOCKED_LABEL } from "../../runtime-group-policy-BrxcORKQ.js";
30
+ import { r as createChannelPairingController } from "../../channel-pairing-ndZVB-VX.js";
31
+ import { i as logTypingFailure, r as logInboundDrop } from "../../logging-BuEYHHqy.js";
31
32
  import { d as isRequestBodyLimitError, p as readRequestBodyWithLimit } from "../../http-body-C1ZLKBbL.js";
32
- import { r as buildComputedAccountStatusSnapshot } from "../../status-helpers-CXimLFTG.js";
33
+ import { n as registerPluginHttpRoute } from "../../http-registry-D3Cdok5J.js";
34
+ import { t as rawDataToString } from "../../ws-DPQUGEy8.js";
35
+ import { a as getAgentScopedMediaLocalRoots, n as buildAgentMediaPayload } from "../../agent-media-payload-BCMtUkvt.js";
33
36
  import { i as createAccountStatusSink } from "../../channel-lifecycle.core-BAA2tO7Y.js";
34
37
  import { n as loadOutboundMediaFromUrl } from "../../outbound-media-Bp109xuN.js";
35
- import { i as logTypingFailure, r as logInboundDrop } from "../../logging-BuEYHHqy.js";
36
38
  import { c as buildPendingHistoryContextFromMap, m as recordPendingHistoryEntryIfEnabled, t as DEFAULT_GROUP_HISTORY_LIMIT, u as clearHistoryEntriesIfEnabled } from "../../reply-history-D0BAmlGo.js";
37
39
  import { n as resolveStoredModelOverride } from "../../stored-model-override-DQr9sYoN.js";
38
40
  import { r as buildModelsProviderData, t as ModelsProviderData } from "../../commands-models-CAEPBjmz.js";
39
41
  import { t as listSkillCommandsForAgents } from "../../skill-commands-6gVFUBkY.js";
40
- import { r as createChannelPairingController } from "../../channel-pairing-qPwn6FAN.js";
41
42
  import { t as loadSessionStore } from "../../session-store-runtime-DmZVeAkA.js";
42
- import { t as chunkTextForOutbound } from "../../text-chunking-B2vtBPHV.js";
43
43
  import { t as setMattermostRuntime } from "../../runtime-api-BpeGiGD2.js";
44
44
  export { type BaseProbeResult, type BlockStreamingCoalesceConfig, type ChannelAccountSnapshot, type ChannelDirectoryEntry, type ChannelGroupContext, type ChannelMessageActionName, type ChannelPlugin, type ChatType, DEFAULT_ACCOUNT_ID, DEFAULT_GROUP_HISTORY_LIMIT, type DaoCoreConfig, type DaoCorePluginApi, type DmPolicy, GROUP_POLICY_BLOCKED_LABEL, type GroupPolicy, type HistoryEntry, type ModelsProviderData, type PluginRuntime, type ReplyPayload, type RuntimeEnv, applyAccountNameToChannelSection, applySetupAccountConfigPatch, buildAgentMediaPayload, buildChannelConfigSchema, buildComputedAccountStatusSnapshot, buildModelsProviderData, buildPendingHistoryContextFromMap, chunkTextForOutbound, clearHistoryEntriesIfEnabled, createAccountStatusSink, createChannelHistoryWindow, createChannelReplyPipeline as createChannelMessageReplyPipeline, createChannelPairingController, createDedupeCache, formatInboundFromLabel, getAgentScopedMediaLocalRoots, isDangerousNameMatchingEnabled, isRequestBodyLimitError, isTrustedProxyAddress, listSkillCommandsForAgents, loadOutboundMediaFromUrl, loadSessionStore, logInboundDrop, logTypingFailure, migrateBaseNameToDefaultAccount, normalizeAccountId, normalizeProviderId, parseStrictPositiveInteger, rawDataToString, readRequestBodyWithLimit, recordPendingHistoryEntryIfEnabled, registerPluginHttpRoute, resolveAllowlistMatchSimple, resolveAllowlistProviderRuntimeGroupPolicy, resolveChannelMediaMaxBytes, resolveClientIp, resolveControlCommandGate, resolveDefaultGroupPolicy, resolveStorePath, resolveStoredModelOverride, resolveThreadSessionKeys, setMattermostRuntime, warnMissingProviderGroupPolicyFallbackOnce };
@@ -2,7 +2,7 @@ import { n as ChannelPlugin } from "../../types.public-B0VjJLe9.js";
2
2
  import { n as RoutePeer } from "../../resolve-route-ClmiFo9R.js";
3
3
  import { a as resolveSignalAccount, c as probeSignal, i as resolveDefaultSignalAccountId, n as listEnabledSignalAccounts, r as listSignalAccountIds, s as SignalProbe, t as ResolvedSignalAccount } from "../../accounts-DvNCYCPg.js";
4
4
  import { t as signalPlugin } from "../../channel-Bq3wyp3c.js";
5
- import { _ as markdownToSignalTextChunks, a as sendMessageSignal, c as ResolvedSignalReactionLevel, d as MonitorSignalOpts, f as monitorSignalProvider, g as markdownToSignalText, h as SignalTextStyleRange, i as SignalSendResult, l as SignalReactionLevel, m as SignalFormattedText, n as SignalRpcOpts, o as sendReadReceiptSignal, p as signalMessageActions, r as SignalSendOpts, s as sendTypingSignal, t as SignalReceiptType, u as resolveSignalReactionLevel } from "../../send-D95RJNJM.js";
5
+ import { _ as markdownToSignalTextChunks, a as sendMessageSignal, c as ResolvedSignalReactionLevel, d as MonitorSignalOpts, f as monitorSignalProvider, g as markdownToSignalText, h as SignalTextStyleRange, i as SignalSendResult, l as SignalReactionLevel, m as SignalFormattedText, n as SignalRpcOpts, o as sendReadReceiptSignal, p as signalMessageActions, r as SignalSendOpts, s as sendTypingSignal, t as SignalReceiptType, u as resolveSignalReactionLevel } from "../../send-DaFuA5cD.js";
6
6
  import { a as isSignalSenderAllowed, c as resolveSignalRecipient, i as formatSignalSenderId, l as resolveSignalSender, n as formatSignalPairingIdLine, o as normalizeSignalAllowRecipient, r as formatSignalSenderDisplay, s as resolveSignalPeerId, t as SignalSender, u as looksLikeUuid } from "../../identity-DLlvfU6p.js";
7
7
  import { a as SignalInstallResult, c as installSignalCli, d as pickAsset, i as ReleaseAsset, n as normalizeSignalMessagingTarget, r as NamedAsset, s as extractSignalCliArchive, t as looksLikeSignalTargetId, u as looksLikeArchive } from "../../normalize-BtYM5FLJ.js";
8
8
  import { i as sendReactionSignal, n as SignalReactionResult, r as removeReactionSignal, t as SignalReactionOpts } from "../../send-reactions-CiQj_UQ2.js";
@@ -16,12 +16,12 @@ import { d as getChatChannelMeta } from "../../core-B7zb6eoz.js";
16
16
  import { t as formatCliCommand } from "../../command-format-d2gWtZzp.js";
17
17
  import { t as detectBinary } from "../../detect-binary-DqlFLJ1Y.js";
18
18
  import { t as formatDocsLink } from "../../links-Dz13kJx9.js";
19
- import { n as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy } from "../../runtime-group-policy-BrxcORKQ.js";
20
19
  import { t as PAIRING_APPROVED_MESSAGE } from "../../pairing-message-CPDqF95Z.js";
21
20
  import { c as collectStatusIssuesFromLastError, d as createDefaultChannelRuntimeState, n as buildBaseChannelStatusSummary, t as buildBaseAccountStatusSnapshot } from "../../status-helpers-CXimLFTG.js";
21
+ import { n as resolveAllowlistProviderRuntimeGroupPolicy, r as resolveDefaultGroupPolicy } from "../../runtime-group-policy-BrxcORKQ.js";
22
22
  import { o as SignalConfigSchema } from "../../bundled-channel-config-schema-4eXcH-RE.js";
23
23
  import { a as resolveSignalAccount, c as probeSignal, i as resolveDefaultSignalAccountId, n as listEnabledSignalAccounts, o as SignalAccountConfig, r as listSignalAccountIds, t as ResolvedSignalAccount } from "../../accounts-DvNCYCPg.js";
24
- import { a as sendMessageSignal, f as monitorSignalProvider, p as signalMessageActions, u as resolveSignalReactionLevel } from "../../send-D95RJNJM.js";
24
+ import { a as sendMessageSignal, f as monitorSignalProvider, p as signalMessageActions, u as resolveSignalReactionLevel } from "../../send-DaFuA5cD.js";
25
25
  import { c as installSignalCli, n as normalizeSignalMessagingTarget, t as looksLikeSignalTargetId } from "../../normalize-BtYM5FLJ.js";
26
26
  import { i as sendReactionSignal, r as removeReactionSignal } from "../../send-reactions-CiQj_UQ2.js";
27
27
 
@@ -8,7 +8,7 @@ import { F as ChannelStatusIssue, m as ChannelGroupContext, r as ChannelAccountS
8
8
  import { r as ReplyPayload } from "../../reply-payload-KThnG8ZZ.js";
9
9
  import { o as PluginApprovalRequest } from "../../plugin-approvals-DURBhODQ.js";
10
10
  import { n as NormalizedLocation } from "../../location-D6ia4w3e.js";
11
- import { o as readChannelAllowFromStore } from "../../pairing-store-Cfy_zHzi.js";
11
+ import { c as readChannelAllowFromStore } from "../../pairing-challenge-EwSQYSud.js";
12
12
  import { n as TelegramCredentialStatus, r as inspectTelegramAccount, t as InspectedTelegramAccount } from "../../account-inspect-DDbuOvTz.js";
13
13
  import { g as TelegramInlineButtons, h as TelegramButtonStyle, u as sendMessageTelegram } from "../../send-DhL6N0ht.js";
14
14
  import { a as normalizeTelegramCommandName, i as normalizeTelegramCommandDescription, n as TelegramCustomCommandInput, o as resolveTelegramCustomCommands, r as TelegramCustomCommandIssue, t as TELEGRAM_COMMAND_NAME_PATTERN } from "../../command-config-B5uSKuEF.js";
@@ -5,9 +5,9 @@ import { c as VideoGenerationProviderCapabilities, d as VideoGenerationResolutio
5
5
  import { Jn as VideoGenerationProviderPlugin } from "../../types-Zj4Bq9h-2.js";
6
6
  import { n as createSubsystemLogger } from "../../subsystem-Ce5qcC5n.js";
7
7
  import { n as getProviderEnvVars } from "../../provider-env-vars-D4P1nybb.js";
8
+ import { n as resolveAgentModelPrimaryValue, t as resolveAgentModelFallbackValues } from "../../model-input-Bcau7j-d.js";
8
9
  import { n as isFailoverError, t as describeFailoverError } from "../../failover-error-DQhtVXzc.js";
9
10
  import { c as resolveCapabilityModelCandidates, m as throwCapabilityGenerationFailure, r as buildNoCapabilityModelConfiguredMessage } from "../../runtime-shared-D647LTXM.js";
10
- import { n as resolveAgentModelPrimaryValue, t as resolveAgentModelFallbackValues } from "../../model-input-Bcau7j-d.js";
11
11
  import { t as parseVideoGenerationModelRef } from "../../model-ref-mtPT-mlX.js";
12
12
  import { n as listVideoGenerationProviders, t as getVideoGenerationProvider } from "../../provider-registry-DG571X-9.js";
13
13
  export { type AuthProfileStore, type DaoCoreConfig, type FallbackAttempt, type GeneratedVideoAsset, type VideoGenerationIgnoredOverride, type VideoGenerationMode, type VideoGenerationModeCapabilities, type VideoGenerationProvider, type VideoGenerationProviderCapabilities, type VideoGenerationProviderConfiguredContext, type VideoGenerationProviderPlugin, type VideoGenerationRequest, type VideoGenerationResolution, type VideoGenerationResult, type VideoGenerationSourceAsset, type VideoGenerationTransformCapabilities, buildNoCapabilityModelConfiguredMessage, createSubsystemLogger, describeFailoverError, getProviderEnvVars, getVideoGenerationProvider, isFailoverError, listVideoGenerationProviders, parseVideoGenerationModelRef, resolveAgentModelFallbackValues, resolveAgentModelPrimaryValue, resolveCapabilityModelCandidates, throwCapabilityGenerationFailure };
@@ -1,7 +1,7 @@
1
1
  import { r as DaoCoreConfig } from "../../types.daocore-z1fablj2.js";
2
2
  import { a as resolveRequestClientIp } from "../../net-F7HGAsK5.js";
3
- import { t as resolveConfiguredSecretInputString } from "../../resolve-configured-secret-input-string-D5mmr6Ae.js";
4
3
  import { h as WEBHOOK_RATE_LIMIT_DEFAULTS, i as WebhookInFlightLimiter, l as readJsonWebhookBodyOrReject, n as WEBHOOK_IN_FLIGHT_DEFAULTS, s as createWebhookInFlightLimiter, v as createFixedWindowRateLimiter } from "../../webhook-request-guards-CQf6yUy9.js";
5
- import { d as resolveWebhookTargetWithAuthOrRejectSync, p as withResolvedWebhookRequestPipeline, u as resolveWebhookTargetWithAuthOrReject } from "../../webhook-targets-C9cJD_kB.js";
4
+ import { d as resolveWebhookTargetWithAuthOrRejectSync, p as withResolvedWebhookRequestPipeline, u as resolveWebhookTargetWithAuthOrReject } from "../../webhook-targets-DqetRJVn.js";
6
5
  import { t as normalizeWebhookPath } from "../../webhook-path-O9E0sKmN.js";
6
+ import { t as resolveConfiguredSecretInputString } from "../../resolve-configured-secret-input-string-D5mmr6Ae.js";
7
7
  export { type DaoCoreConfig, WEBHOOK_IN_FLIGHT_DEFAULTS, WEBHOOK_RATE_LIMIT_DEFAULTS, type WebhookInFlightLimiter, createFixedWindowRateLimiter, createWebhookInFlightLimiter, normalizeWebhookPath, readJsonWebhookBodyOrReject, resolveConfiguredSecretInputString, resolveRequestClientIp, resolveWebhookTargetWithAuthOrReject, resolveWebhookTargetWithAuthOrRejectSync, withResolvedWebhookRequestPipeline };