botmux 3.9.2 → 3.10.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.
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/dist/.runtime-build-id +1 -1
- package/dist/adapters/cli/codex.d.ts.map +1 -1
- package/dist/adapters/cli/codex.js +6 -0
- package/dist/adapters/cli/codex.js.map +1 -1
- package/dist/adapters/cli/opencode.d.ts.map +1 -1
- package/dist/adapters/cli/opencode.js +7 -1
- package/dist/adapters/cli/opencode.js.map +1 -1
- package/dist/adapters/cli/reasonix.d.ts +35 -0
- package/dist/adapters/cli/reasonix.d.ts.map +1 -0
- package/dist/adapters/cli/reasonix.js +236 -0
- package/dist/adapters/cli/reasonix.js.map +1 -0
- package/dist/adapters/cli/registry.d.ts +2 -1
- package/dist/adapters/cli/registry.d.ts.map +1 -1
- package/dist/adapters/cli/registry.js +4 -1
- package/dist/adapters/cli/registry.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +5 -1
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +168 -62
- package/dist/cli.js.map +1 -1
- package/dist/core/command-handler.d.ts +18 -4
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +234 -26
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +1 -0
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +27 -3
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dispatch.d.ts +54 -24
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +81 -27
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/input-turn-dedupe.d.ts +20 -0
- package/dist/core/input-turn-dedupe.d.ts.map +1 -0
- package/dist/core/input-turn-dedupe.js +57 -0
- package/dist/core/input-turn-dedupe.js.map +1 -0
- package/dist/core/local-terminal-opener.d.ts.map +1 -1
- package/dist/core/local-terminal-opener.js +10 -1
- package/dist/core/local-terminal-opener.js.map +1 -1
- package/dist/core/passthrough-commands.d.ts.map +1 -1
- package/dist/core/passthrough-commands.js +1 -1
- package/dist/core/passthrough-commands.js.map +1 -1
- package/dist/core/plugins/pm2.d.ts.map +1 -1
- package/dist/core/plugins/pm2.js +7 -1
- package/dist/core/plugins/pm2.js.map +1 -1
- package/dist/core/resource-monitor/attribution.d.ts.map +1 -1
- package/dist/core/resource-monitor/attribution.js +17 -1
- package/dist/core/resource-monitor/attribution.js.map +1 -1
- package/dist/core/resource-monitor/darwin.d.ts +145 -0
- package/dist/core/resource-monitor/darwin.d.ts.map +1 -0
- package/dist/core/resource-monitor/darwin.js +360 -0
- package/dist/core/resource-monitor/darwin.js.map +1 -0
- package/dist/core/resource-monitor/procfs.d.ts.map +1 -1
- package/dist/core/resource-monitor/procfs.js +6 -0
- package/dist/core/resource-monitor/procfs.js.map +1 -1
- package/dist/core/resource-monitor/types.d.ts +1 -1
- package/dist/core/resource-monitor/types.d.ts.map +1 -1
- package/dist/core/scheduler.d.ts.map +1 -1
- package/dist/core/scheduler.js +5 -2
- package/dist/core/scheduler.js.map +1 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +3 -0
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts +3 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +46 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-marker.d.ts +1 -8
- package/dist/core/session-marker.d.ts.map +1 -1
- package/dist/core/session-marker.js +2 -50
- package/dist/core/session-marker.js.map +1 -1
- package/dist/core/types.d.ts +3 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +17 -0
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +292 -9
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +27 -12
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/daemon-internal-api.d.ts.map +1 -1
- package/dist/dashboard/daemon-internal-api.js +11 -2
- package/dist/dashboard/daemon-internal-api.js.map +1 -1
- package/dist/dashboard/groups-action-helpers.d.ts +2 -0
- package/dist/dashboard/groups-action-helpers.d.ts.map +1 -1
- package/dist/dashboard/groups-action-helpers.js +9 -0
- package/dist/dashboard/groups-action-helpers.js.map +1 -1
- package/dist/dashboard/groups-matrix-snapshot.d.ts +56 -0
- package/dist/dashboard/groups-matrix-snapshot.d.ts.map +1 -0
- package/dist/dashboard/groups-matrix-snapshot.js +127 -0
- package/dist/dashboard/groups-matrix-snapshot.js.map +1 -0
- package/dist/dashboard/resource-monitor-service.d.ts.map +1 -1
- package/dist/dashboard/resource-monitor-service.js +18 -2
- package/dist/dashboard/resource-monitor-service.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +45 -4
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/groups-api.js +1 -1
- package/dist/dashboard/web/groups-api.js.map +1 -1
- package/dist/dashboard/web/i18n.js +10 -10
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/roles-page.d.ts.map +1 -1
- package/dist/dashboard/web/roles-page.js +26 -11
- package/dist/dashboard/web/roles-page.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/{bot-defaults-page-BHTQEWCH.js → bot-defaults-page-LTVOUDIS.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-KLZCQAHF.js → chunk-3UE7S77S.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-W77TPKZH.js → chunk-DCS35UMD.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-E3HZZXK5.js → chunk-MFQPCVHY.js} +4 -4
- package/dist/dashboard-web/chunks/{chunk-EZH56JCI.js → chunk-ZU3UUKAR.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-page-BP255CAX.js → connectors-page-5KWDIMKC.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-CDHVXBUT.js → groups-page-FHOKYXMW.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-57BFE6GT.js → insights-page-T2ZX2RWL.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-UTOYGQVF.js → monitor-room-YNVBAGR6.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-WTHYAIUM.js → monitoring-page-LHM55YWN.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-JSMIB353.js → office-page-ATXVP7PW.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-3VDBOH7L.js → overview-page-QYI3KBDD.js} +1 -1
- package/dist/dashboard-web/chunks/roles-page-56VWM6CD.js +1 -0
- package/dist/dashboard-web/chunks/{schedules-page-HHN736H6.js → schedules-page-S5K6U4EO.js} +1 -1
- package/dist/dashboard-web/chunks/{sessions-page-EIWOZD7A.js → sessions-page-WBP4N7D2.js} +1 -1
- package/dist/dashboard-web/chunks/{settings-page-2IUT5LS4.js → settings-page-QUZDQARR.js} +1 -1
- package/dist/dashboard-web/chunks/{skills-page-JKFKMUEM.js → skills-page-IFY7AEND.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-Q2PXC3UY.js → team-federation-page-C7FJQPFZ.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-EBQCD4AO.js → v3-page-2LMF3WWR.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-QZRMVNZN.js → whiteboards-page-3XC6QRMY.js} +1 -1
- package/dist/dashboard-web/style.css +2 -4
- package/dist/dashboard.js +65 -9
- package/dist/dashboard.js.map +1 -1
- package/dist/i18n/en.d.ts.map +1 -1
- package/dist/i18n/en.js +33 -7
- package/dist/i18n/en.js.map +1 -1
- package/dist/i18n/zh.d.ts.map +1 -1
- package/dist/i18n/zh.js +31 -7
- package/dist/i18n/zh.js.map +1 -1
- package/dist/im/lark/card-builder.d.ts +7 -0
- package/dist/im/lark/card-builder.d.ts.map +1 -1
- package/dist/im/lark/card-builder.js +56 -0
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +42 -19
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +10 -0
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +79 -0
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts +14 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +171 -15
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/im/lark/lark-hosts.d.ts +5 -0
- package/dist/im/lark/lark-hosts.d.ts.map +1 -1
- package/dist/im/lark/lark-hosts.js +10 -0
- package/dist/im/lark/lark-hosts.js.map +1 -1
- package/dist/im/lark/message-parser.d.ts.map +1 -1
- package/dist/im/lark/message-parser.js +24 -7
- package/dist/im/lark/message-parser.js.map +1 -1
- package/dist/pm2-graceful-exit.d.ts +28 -0
- package/dist/pm2-graceful-exit.d.ts.map +1 -0
- package/dist/pm2-graceful-exit.js +39 -0
- package/dist/pm2-graceful-exit.js.map +1 -0
- package/dist/services/bridge-fallback-gate.d.ts +9 -2
- package/dist/services/bridge-fallback-gate.d.ts.map +1 -1
- package/dist/services/bridge-fallback-gate.js +31 -19
- package/dist/services/bridge-fallback-gate.js.map +1 -1
- package/dist/services/message-listener-store.d.ts +18 -0
- package/dist/services/message-listener-store.d.ts.map +1 -1
- package/dist/services/message-listener-store.js +35 -10
- package/dist/services/message-listener-store.js.map +1 -1
- package/dist/services/message-listener.d.ts +17 -0
- package/dist/services/message-listener.d.ts.map +1 -1
- package/dist/services/message-listener.js +26 -0
- package/dist/services/message-listener.js.map +1 -1
- package/dist/setup/bot-config-editor.d.ts.map +1 -1
- package/dist/setup/bot-config-editor.js +2 -0
- package/dist/setup/bot-config-editor.js.map +1 -1
- package/dist/setup/lark-scopes.json +1 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +8 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/types.d.ts +34 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/child-env.d.ts +1 -1
- package/dist/utils/child-env.d.ts.map +1 -1
- package/dist/utils/child-env.js +13 -0
- package/dist/utils/child-env.js.map +1 -1
- package/dist/utils/file-lock.d.ts.map +1 -1
- package/dist/utils/file-lock.js +1 -1
- package/dist/utils/file-lock.js.map +1 -1
- package/dist/utils/global-install.d.ts.map +1 -1
- package/dist/utils/global-install.js +56 -10
- package/dist/utils/global-install.js.map +1 -1
- package/dist/utils/idle-detector.d.ts +4 -0
- package/dist/utils/idle-detector.d.ts.map +1 -1
- package/dist/utils/idle-detector.js +25 -0
- package/dist/utils/idle-detector.js.map +1 -1
- package/dist/utils/process-identity.d.ts +7 -0
- package/dist/utils/process-identity.d.ts.map +1 -0
- package/dist/utils/process-identity.js +62 -0
- package/dist/utils/process-identity.js.map +1 -0
- package/dist/worker.js +123 -9
- package/dist/worker.js.map +1 -1
- package/dist/workflows/events/payloads.d.ts +10 -10
- package/dist/workflows/events/schema.d.ts +28 -28
- package/dist/workflows/hostExecutors/registry.d.ts +2 -7
- package/dist/workflows/hostExecutors/registry.d.ts.map +1 -1
- package/dist/workflows/hostExecutors/registry.js.map +1 -1
- package/dist/workflows/shared/provider-reconciler.d.ts +1 -30
- package/dist/workflows/shared/provider-reconciler.d.ts.map +1 -1
- package/dist/workflows/shared/provider-reconciler.js.map +1 -1
- package/dist/workflows/v3/artifact-contract.d.ts +41 -0
- package/dist/workflows/v3/artifact-contract.d.ts.map +1 -0
- package/dist/workflows/v3/artifact-contract.js +20 -0
- package/dist/workflows/v3/artifact-contract.js.map +1 -0
- package/dist/workflows/v3/botmux-attempt-lease.d.ts +7 -0
- package/dist/workflows/v3/botmux-attempt-lease.d.ts.map +1 -0
- package/dist/workflows/v3/botmux-attempt-lease.js +189 -0
- package/dist/workflows/v3/botmux-attempt-lease.js.map +1 -0
- package/dist/workflows/v3/botmux-host-policy.d.ts +7 -0
- package/dist/workflows/v3/botmux-host-policy.d.ts.map +1 -0
- package/dist/workflows/v3/botmux-host-policy.js +34 -0
- package/dist/workflows/v3/botmux-host-policy.js.map +1 -0
- package/dist/workflows/v3/cli-run.d.ts +1 -1
- package/dist/workflows/v3/cli-run.d.ts.map +1 -1
- package/dist/workflows/v3/cli-run.js +1 -1
- package/dist/workflows/v3/cli-run.js.map +1 -1
- package/dist/workflows/v3/contract.d.ts +8 -89
- package/dist/workflows/v3/contract.d.ts.map +1 -1
- package/dist/workflows/v3/contract.js +2 -8
- package/dist/workflows/v3/contract.js.map +1 -1
- package/dist/workflows/v3/core-control.d.ts +16 -0
- package/dist/workflows/v3/core-control.d.ts.map +1 -0
- package/dist/workflows/v3/core-control.js +60 -0
- package/dist/workflows/v3/core-control.js.map +1 -0
- package/dist/workflows/v3/daemon-run.d.ts.map +1 -1
- package/dist/workflows/v3/daemon-run.js +2 -1
- package/dist/workflows/v3/daemon-run.js.map +1 -1
- package/dist/workflows/v3/dag-loader.d.ts +5 -0
- package/dist/workflows/v3/dag-loader.d.ts.map +1 -0
- package/dist/workflows/v3/dag-loader.js +22 -0
- package/dist/workflows/v3/dag-loader.js.map +1 -0
- package/dist/workflows/v3/dag.d.ts +2 -6
- package/dist/workflows/v3/dag.d.ts.map +1 -1
- package/dist/workflows/v3/dag.js +2 -24
- package/dist/workflows/v3/dag.js.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.d.ts.map +1 -1
- package/dist/workflows/v3/ephemeral-pool.js +22 -12
- package/dist/workflows/v3/ephemeral-pool.js.map +1 -1
- package/dist/workflows/v3/event-contract.d.ts +273 -0
- package/dist/workflows/v3/event-contract.d.ts.map +1 -0
- package/dist/workflows/v3/event-contract.js +8 -0
- package/dist/workflows/v3/event-contract.js.map +1 -0
- package/dist/workflows/v3/gate-policy.d.ts +12 -0
- package/dist/workflows/v3/gate-policy.d.ts.map +1 -0
- package/dist/workflows/v3/gate-policy.js +20 -0
- package/dist/workflows/v3/gate-policy.js.map +1 -0
- package/dist/workflows/v3/gate-wait-store.d.ts +99 -0
- package/dist/workflows/v3/gate-wait-store.d.ts.map +1 -0
- package/dist/workflows/v3/gate-wait-store.js +263 -0
- package/dist/workflows/v3/gate-wait-store.js.map +1 -0
- package/dist/workflows/v3/host.js +1 -1
- package/dist/workflows/v3/host.js.map +1 -1
- package/dist/workflows/v3/human-gate.d.ts +4 -99
- package/dist/workflows/v3/human-gate.d.ts.map +1 -1
- package/dist/workflows/v3/human-gate.js +4 -275
- package/dist/workflows/v3/human-gate.js.map +1 -1
- package/dist/workflows/v3/in-process-attempt-lease.d.ts +10 -0
- package/dist/workflows/v3/in-process-attempt-lease.d.ts.map +1 -0
- package/dist/workflows/v3/in-process-attempt-lease.js +47 -0
- package/dist/workflows/v3/in-process-attempt-lease.js.map +1 -0
- package/dist/workflows/v3/journal.d.ts +2 -275
- package/dist/workflows/v3/journal.d.ts.map +1 -1
- package/dist/workflows/v3/journal.js.map +1 -1
- package/dist/workflows/v3/library-service.js +1 -1
- package/dist/workflows/v3/library-service.js.map +1 -1
- package/dist/workflows/v3/orchestrator.d.ts +1 -2
- package/dist/workflows/v3/orchestrator.d.ts.map +1 -1
- package/dist/workflows/v3/orchestrator.js.map +1 -1
- package/dist/workflows/v3/portable-artifact-snapshot.d.ts +15 -0
- package/dist/workflows/v3/portable-artifact-snapshot.d.ts.map +1 -0
- package/dist/workflows/v3/portable-artifact-snapshot.js +76 -0
- package/dist/workflows/v3/portable-artifact-snapshot.js.map +1 -0
- package/dist/workflows/v3/portable-final-outputs.d.ts +37 -0
- package/dist/workflows/v3/portable-final-outputs.d.ts.map +1 -0
- package/dist/workflows/v3/portable-final-outputs.js +137 -0
- package/dist/workflows/v3/portable-final-outputs.js.map +1 -0
- package/dist/workflows/v3/portable-run-snapshot.d.ts +14 -0
- package/dist/workflows/v3/portable-run-snapshot.d.ts.map +1 -0
- package/dist/workflows/v3/portable-run-snapshot.js +176 -0
- package/dist/workflows/v3/portable-run-snapshot.js.map +1 -0
- package/dist/workflows/v3/portable-runtime.d.ts +83 -0
- package/dist/workflows/v3/portable-runtime.d.ts.map +1 -0
- package/dist/workflows/v3/portable-runtime.js +135 -0
- package/dist/workflows/v3/portable-runtime.js.map +1 -0
- package/dist/workflows/v3/runtime-host-contract.d.ts +182 -0
- package/dist/workflows/v3/runtime-host-contract.d.ts.map +1 -0
- package/dist/workflows/v3/runtime-host-contract.js +9 -0
- package/dist/workflows/v3/runtime-host-contract.js.map +1 -0
- package/dist/workflows/v3/runtime.d.ts +12 -226
- package/dist/workflows/v3/runtime.d.ts.map +1 -1
- package/dist/workflows/v3/runtime.js +14 -3173
- package/dist/workflows/v3/runtime.js.map +1 -1
- package/dist/workflows/v3/shared-node-runtime.d.ts +203 -0
- package/dist/workflows/v3/shared-node-runtime.d.ts.map +1 -0
- package/dist/workflows/v3/shared-node-runtime.js +2978 -0
- package/dist/workflows/v3/shared-node-runtime.js.map +1 -0
- package/dist/workflows/v3/shared-runtime.d.ts +17 -0
- package/dist/workflows/v3/shared-runtime.d.ts.map +1 -0
- package/dist/workflows/v3/shared-runtime.js +12 -0
- package/dist/workflows/v3/shared-runtime.js.map +1 -0
- package/package.json +4 -1
- package/dist/dashboard-web/chunks/roles-page-LHVAU2BI.js +0 -1
package/dist/dashboard-web/chunks/{whiteboards-page-QZRMVNZN.js → whiteboards-page-3XC6QRMY.js}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as B}from"./chunk-
|
|
1
|
+
import{c as B}from"./chunk-ZU3UUKAR.js";import{c as W,k as C}from"./chunk-5CJMHTT4.js";import"./chunk-MFQPCVHY.js";import{a as P}from"./chunk-SYC6D5XU.js";import{a as O,d as T}from"./chunk-5THX4DI2.js";import{c as R}from"./chunk-7SZRL6FY.js";var r=R(O(),1);var e=R(T(),1);function x(t){let a=Date.parse(t);if(!a)return t||"-";let o=Math.max(0,Math.floor((Date.now()-a)/1e3));if(o<60)return`${o}s ago`;let i=Math.floor(o/60);if(i<60)return`${i}m ago`;let n=Math.floor(i/60);return n<24?`${n}h ago`:`${Math.floor(n/24)}d ago`}function F(t){return t.chatId?.trim()||"__local__"}function G(t,a){if(t==="__local__")return"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F";let o=a.get(t);return o&&o!==t?`${o} (${t})`:t}function K(t,a){let o=new Map;for(let i of t){let n=F(i),c=o.get(n)??[];c.push(i),o.set(n,c)}return[...o.entries()].map(([i,n])=>({chatId:i,label:G(i,a),rows:[...n].sort((c,b)=>b.updatedAt.localeCompare(c.updatedAt))})).sort((i,n)=>i.label.localeCompare(n.label))}function z(){return decodeURIComponent((location.hash.match(/^#\/whiteboards\/([^/]+)/)?.[1]??"").trim())}async function E(t,a){let o=await fetch(`/api/whiteboards/${encodeURIComponent(t)}`),i=await o.json().catch(()=>({}));if(o.ok)return{id:t,content:String(i.content??""),row:a.find(n=>n.id===t)}}async function J(t){let a=new Map;if(!t?.ok)return a;let o=await t.json().catch(()=>({})),i=Array.isArray(o.chats)?o.chats:[];for(let n of i)n.chatId&&a.set(String(n.chatId),String(n.name||n.chatId));return a}function Q(t){let a=t.row,o=a.title||a.id;return(0,e.jsxs)("a",{className:`wb-item${t.active?" active":""}`,"data-whiteboard-id":a.id,href:`#/whiteboards/${encodeURIComponent(a.id)}`,onClick:i=>{i.preventDefault(),t.onSelect(a.id)},children:[(0,e.jsx)("div",{className:"wb-item-head",children:(0,e.jsxs)("div",{className:"wb-item-main",children:[(0,e.jsx)("strong",{children:(0,e.jsx)(C,{text:o,textClassName:"wb-title-scroll"})}),(0,e.jsx)("span",{className:"wb-id-text",title:a.id,children:a.id})]})}),(0,e.jsxs)("div",{className:"wb-item-foot",children:[(0,e.jsxs)("div",{className:"wb-item-meta",children:[(0,e.jsx)("span",{children:x(a.updatedAt)}),(0,e.jsx)("span",{children:"\xB7"}),(0,e.jsxs)("span",{children:["log ",a.logCount]})]}),(0,e.jsx)("span",{className:"wb-scope",title:a.scope,children:a.scope})]})]})}function p(t){let a=t.value||"-";return(0,e.jsxs)("div",{className:"wb-meta-card",title:a,children:[(0,e.jsx)("span",{children:t.label}),(0,e.jsx)("strong",{children:a})]})}function V(t){let a=t.selected;if(!a)return(0,e.jsx)("p",{className:"empty",children:"\u9009\u62E9\u5DE6\u4FA7\u767D\u677F\u67E5\u770B meta \u548C board.md\u3002"});let o=a.row,i=o?.chatId?G(o.chatId,t.groupNames):"\u672A\u7ED1\u5B9A\u7FA4 / \u672C\u5730\u767D\u677F",n=o?.title||a.id;return(0,e.jsxs)(e.Fragment,{children:[(0,e.jsxs)("div",{className:"wb-detail-head",children:[(0,e.jsxs)("div",{className:"wb-detail-title",children:[(0,e.jsx)("p",{className:"eyebrow",children:"WHITEBOARD"}),(0,e.jsx)("h2",{title:n,children:n}),(0,e.jsx)("code",{title:a.id,children:a.id})]}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-whiteboard":!0,onClick:t.onDelete,children:"\u5220\u9664\u767D\u677F"})]}),(0,e.jsxs)("div",{className:"wb-meta-grid",children:[(0,e.jsx)(p,{label:"\u6240\u5C5E\u7FA4",value:i}),(0,e.jsx)(p,{label:"\u8303\u56F4",value:o?.scope??"-"}),(0,e.jsx)(p,{label:"\u6700\u8FD1\u66F4\u65B0",value:o?.updatedAt?x(o.updatedAt):"-"}),(0,e.jsx)(p,{label:"\u6765\u6E90\u76EE\u5F55",value:o?.workingDir??"-"})]}),(0,e.jsxs)("details",{className:"wb-admin-info",children:[(0,e.jsx)("summary",{children:"\u7BA1\u7406\u4FE1\u606F / \u6587\u4EF6\u8DEF\u5F84"}),(0,e.jsx)("code",{children:o?.path??""})]}),(0,e.jsxs)("section",{className:"wb-board-panel",children:[(0,e.jsxs)("div",{className:"wb-board-panel-head",children:[(0,e.jsx)("strong",{children:"board.md"}),(0,e.jsx)("span",{children:"\u53EA\u8BFB\u9884\u89C8"})]}),(0,e.jsx)("pre",{children:a.content||"\uFF08\u6682\u65E0\u5185\u5BB9\uFF09"})]})]})}function X(t){let a=t.selected.row?.title||t.selected.id;return(0,e.jsx)("div",{className:"wb-delete-backdrop","data-delete-modal":!0,onClick:o=>{o.target===o.currentTarget&&t.onCancel()},children:(0,e.jsxs)("div",{className:"wb-delete-dialog",role:"dialog","aria-modal":"true","aria-labelledby":"wb-delete-title",children:[(0,e.jsxs)("div",{className:"wb-delete-body",children:[(0,e.jsx)("div",{className:"wb-delete-mark","aria-hidden":"true",children:"!"}),(0,e.jsxs)("div",{children:[(0,e.jsx)("h3",{id:"wb-delete-title",children:"\u5220\u9664\u767D\u677F\uFF1F"}),(0,e.jsxs)("p",{children:["\u5C06\u5220\u9664 ",(0,e.jsx)("strong",{children:a}),"\uFF08",(0,e.jsx)("code",{children:t.selected.id}),"\uFF09\u7684 board\u3001log\u3001meta\uFF0C\u5E76\u6E05\u7406\u9ED8\u8BA4\u7ED1\u5B9A\u548C\u4F1A\u8BDD\u5F15\u7528\u3002\u6B64\u64CD\u4F5C\u4E0D\u53EF\u6062\u590D\u3002"]})]})]}),(0,e.jsxs)("div",{className:"actions wb-delete-actions",children:[(0,e.jsx)("button",{type:"button","data-delete-cancel":!0,onClick:t.onCancel,disabled:t.deleting,children:"\u53D6\u6D88"}),(0,e.jsx)("button",{type:"button",className:"danger","data-delete-confirm":!0,onClick:t.onConfirm,disabled:t.deleting,children:t.deleting?"\u5220\u9664\u4E2D...":"\u786E\u8BA4\u5220\u9664"})]})]})})}function Y(){let t=B(),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),[i,n]=(0,r.useState)(!1),[c,b]=(0,r.useState)([]),[g,_]=(0,r.useState)(()=>new Map),[m,f]=(0,r.useState)(),[H,S]=(0,r.useState)(!0),[k,M]=(0,r.useState)(null),[u,h]=(0,r.useState)(null),[L,D]=(0,r.useState)(!1),I=(0,r.useMemo)(()=>K(c,g),[c,g]);(0,r.useEffect)(()=>{a.current=!0;let s=z();async function d(){S(!0);try{let[l,y]=await Promise.all([fetch("/api/whiteboards"),fetch("/api/groups").catch(()=>null)]),w=await l.json().catch(()=>({}));if(!l.ok)throw new Error(w?.error??`HTTP ${l.status}`);let q=await J(y),$=Array.isArray(w.whiteboards)?w.whiteboards:[],A;if(s&&(A=await E(s,$)),!a.current)return;n(w.enabled===!0),b($),_(q),f(A),M(null)}catch(l){a.current&&M(l instanceof Error?l.message:String(l))}finally{a.current&&S(!1)}}return d(),()=>{a.current=!1,o.current+=1}},[]);async function U(s){let d=o.current+1;o.current=d;let l=await E(s,c);!a.current||o.current!==d||!l||(f(l),window.history.replaceState(null,"",`#/whiteboards/${encodeURIComponent(s)}`))}async function j(){if(u){D(!0);try{let s=await fetch(`/api/whiteboards/${encodeURIComponent(u.id)}`,{method:"DELETE"}),d=await s.json().catch(()=>({}));if(!s.ok||d.ok===!1)throw new Error(d?.error??`HTTP ${s.status}`);if(!a.current)return;b(l=>l.filter(y=>y.id!==u.id)),m?.id===u.id&&(f(void 0),window.history.replaceState(null,"","#/whiteboards")),h(null)}catch(s){a.current&&window.alert(`\u5220\u9664\u5931\u8D25\uFF1A${s instanceof Error?s.message:String(s)}`)}finally{a.current&&D(!1)}}}let v="\u767D\u677F\u80FD\u529B\u5F53\u524D\u5173\u95ED\uFF1A\u4E0D\u4F1A\u81EA\u52A8\u521B\u5EFA/\u7ED1\u5B9A\u767D\u677F\uFF0C\u4E5F\u4E0D\u4F1A\u6CE8\u5165\u5230 agent prompt\u3002\u5386\u53F2\u767D\u677F\u4EC5\u5728 dashboard \u4E2D\u53EA\u8BFB\u53EF\u89C1\uFF0C\u53EF\u5728\u6B64\u6E05\u7406\u3002",N=(s=!1)=>(0,e.jsx)("div",{className:"page-heading",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("p",{className:"eyebrow",children:t("nav.whiteboards")}),(0,e.jsx)("h1",{children:t("nav.whiteboards")}),s?(0,e.jsx)("span",{className:"wb-disabled-pill",title:v,"aria-label":v,children:v}):null]})});return k?(0,e.jsxs)("section",{className:"page whiteboards-page",children:[N(),(0,e.jsxs)("p",{className:"hint-warn",children:["\u52A0\u8F7D\u767D\u677F\u5931\u8D25\uFF1A",k]})]}):H?(0,e.jsxs)("section",{className:"page whiteboards-page","data-whiteboards-host":!0,children:[N(),(0,e.jsx)(W,{label:t("common.loading")})]}):(0,e.jsxs)("section",{className:"page whiteboards-page",children:[N(!i),(0,e.jsxs)("div",{className:"wb-split",children:[(0,e.jsx)("section",{className:"overview-block wb-list-block",children:(0,e.jsx)("div",{className:"wb-list-panel",children:I.length===0?(0,e.jsx)("p",{className:"empty wb-empty",children:"\u6682\u65E0\u767D\u677F\u3002\u6253\u5F00\u80FD\u529B\u540E\uFF0C\u6BCF\u4E2A\u7FA4\u9996\u6B21\u9700\u8981\u767D\u677F\u65F6\u624D\u4F1A\u521B\u5EFA\u9ED8\u8BA4\u767D\u677F\u3002"}):I.map(s=>(0,e.jsxs)("details",{className:"wb-group",open:!0,children:[(0,e.jsxs)("summary",{children:[(0,e.jsx)("span",{className:"wb-group-title",children:(0,e.jsx)(C,{text:s.label,textClassName:"wb-group-title-scroll"})}),(0,e.jsx)("small",{children:s.rows.length})]}),(0,e.jsx)("div",{className:"wb-group-items",children:s.rows.map(d=>(0,e.jsx)(Q,{row:d,active:m?.id===d.id,onSelect:l=>{U(l)}},d.id))})]},s.chatId))})}),(0,e.jsx)("section",{className:"overview-block wb-detail-block",children:(0,e.jsx)("div",{className:"wb-detail-panel",id:"whiteboard-detail",children:(0,e.jsx)(V,{selected:m,groupNames:g,onDelete:()=>{m&&h(m)}})})})]}),u?(0,e.jsx)(X,{selected:u,deleting:L,onCancel:()=>h(null),onConfirm:()=>{j()}}):null]})}function ae(t){return P(t,(0,e.jsx)(Y,{}))}export{ae as renderWhiteboardsPage};
|
|
@@ -8302,9 +8302,8 @@ button.dashboard-version-chip:hover,
|
|
|
8302
8302
|
color: var(--fg);
|
|
8303
8303
|
}
|
|
8304
8304
|
.dashboard-version-popover {
|
|
8305
|
-
position:
|
|
8306
|
-
|
|
8307
|
-
left: 0;
|
|
8305
|
+
position: fixed;
|
|
8306
|
+
z-index: 1601;
|
|
8308
8307
|
display: flex;
|
|
8309
8308
|
flex-direction: column;
|
|
8310
8309
|
width: min(340px, calc(100vw - 32px));
|
|
@@ -12922,7 +12921,6 @@ dialog :where(input:not([type=checkbox], [type=radio]), select, textarea) {
|
|
|
12922
12921
|
}
|
|
12923
12922
|
.dashboard-version-control { margin-left: 33px; }
|
|
12924
12923
|
.dashboard-version-popover {
|
|
12925
|
-
left: -33px;
|
|
12926
12924
|
width: min(340px, calc(100vw - 24px));
|
|
12927
12925
|
}
|
|
12928
12926
|
.topbar-left {
|
package/dist/dashboard.js
CHANGED
|
@@ -8,12 +8,14 @@ import { homedir } from 'node:os';
|
|
|
8
8
|
import { fileURLToPath } from 'node:url';
|
|
9
9
|
import { randomBytes } from 'node:crypto';
|
|
10
10
|
import { logger } from './utils/logger.js';
|
|
11
|
+
import { gracefulProcessExitCode } from './pm2-graceful-exit.js';
|
|
11
12
|
import { config, isWildcardBindHost } from './config.js';
|
|
12
13
|
import { listenWithProbe } from './utils/listen-with-probe.js';
|
|
13
14
|
import { generateToken, parseCookie, buildSetCookie, verifyHmac, cliAuthBind, decideDashboardAuth, loadPersistedToken, loadOrCreatePersistedToken, persistToken, loadDashboardSecret, loadOrCreateDashboardSecret, } from './dashboard/auth.js';
|
|
14
15
|
import { DaemonRegistry, botsRosterSignature } from './dashboard/registry.js';
|
|
15
16
|
import { Aggregator, subscribeDaemon } from './dashboard/aggregator.js';
|
|
16
17
|
import { createSessionPresentationCoordinator } from './dashboard/session-presentation.js';
|
|
18
|
+
import { compactGroupsMatrix, createGroupsMatrixSnapshot, enrichSessionsWithGroupNames, roleWriteShouldInvalidate, } from './dashboard/groups-matrix-snapshot.js';
|
|
17
19
|
import { parseDashboardAskAnswerRequest, proxyDashboardAskAnswer, } from './dashboard/desktop-asks.js';
|
|
18
20
|
import { createDebugTerminalManager } from './dashboard/debug-terminal.js';
|
|
19
21
|
import { pickCreatorForGroup } from './dashboard/operator-selector.js';
|
|
@@ -196,6 +198,17 @@ mkdirSync(REGISTRY_DIR, { recursive: true });
|
|
|
196
198
|
const registry = new DaemonRegistry(REGISTRY_DIR);
|
|
197
199
|
const aggregator = new Aggregator();
|
|
198
200
|
const sessionPresentation = createSessionPresentationCoordinator(aggregator, getGitRepoInfo);
|
|
201
|
+
const groupsMatrixSnapshot = createGroupsMatrixSnapshot(buildGroupsMatrix, {
|
|
202
|
+
onRefreshError: error => logger.warn(`[dashboard] groups matrix refresh failed: ${String(error)}`),
|
|
203
|
+
});
|
|
204
|
+
let groupsRosterSignature = botsRosterSignature(registry.list());
|
|
205
|
+
registry.on((online) => {
|
|
206
|
+
const next = botsRosterSignature(online);
|
|
207
|
+
if (next === groupsRosterSignature)
|
|
208
|
+
return;
|
|
209
|
+
groupsRosterSignature = next;
|
|
210
|
+
groupsMatrixSnapshot.invalidate();
|
|
211
|
+
});
|
|
199
212
|
// Keep Git-derived fields in the central read-model so REST snapshots and SSE
|
|
200
213
|
// share one row shape. Idle/limited turn boundaries force a branch refresh
|
|
201
214
|
// after the CLI has had a chance to change repositories — that is one
|
|
@@ -1012,6 +1025,7 @@ const groupsActionDeps = {
|
|
|
1012
1025
|
proxyToDaemon,
|
|
1013
1026
|
closeSessionsMatching,
|
|
1014
1027
|
fetch: fetchDaemonUrl,
|
|
1028
|
+
invalidateGroups: () => groupsMatrixSnapshot.invalidate(),
|
|
1015
1029
|
};
|
|
1016
1030
|
// ─── PR2 C8: Route B internal API (`/__daemon/*`) ───────────────────────────
|
|
1017
1031
|
// HMAC + loopback + ts ±60s + nonce TTL, signed-request envelope = full
|
|
@@ -1031,7 +1045,7 @@ const daemonInternalApi = createDaemonInternalApi({
|
|
|
1031
1045
|
getSessions: () => aggregator.getSessions(),
|
|
1032
1046
|
getSchedules: () => aggregator.getSchedules(),
|
|
1033
1047
|
resolveDashboardSettings,
|
|
1034
|
-
buildGroupsMatrix,
|
|
1048
|
+
buildGroupsMatrix: () => groupsMatrixSnapshot.get(),
|
|
1035
1049
|
settingsApplierDeps: settingsWriteApplierDeps,
|
|
1036
1050
|
groupsActionDeps,
|
|
1037
1051
|
proxyToDaemon,
|
|
@@ -1963,6 +1977,7 @@ async function createTeamGroup(args) {
|
|
|
1963
1977
|
if (!upstream.ok || !parsed?.ok || typeof parsed.chatId !== 'string') {
|
|
1964
1978
|
return { ok: false, error: parsed?.error ?? `group_create_http_${upstream.status}` };
|
|
1965
1979
|
}
|
|
1980
|
+
groupsMatrixSnapshot.invalidate();
|
|
1966
1981
|
return {
|
|
1967
1982
|
ok: true,
|
|
1968
1983
|
chatId: parsed.chatId,
|
|
@@ -1996,6 +2011,7 @@ async function transferTeamGroupOwner(args) {
|
|
|
1996
2011
|
transferError: parsed?.error ?? `owner_transfer_http_${upstream.status}`,
|
|
1997
2012
|
};
|
|
1998
2013
|
}
|
|
2014
|
+
groupsMatrixSnapshot.invalidate();
|
|
1999
2015
|
return {
|
|
2000
2016
|
ownerTransferredTo: parsed.ownerTransferredTo ?? null,
|
|
2001
2017
|
transferError: parsed.transferError ?? null,
|
|
@@ -2053,6 +2069,7 @@ async function createLifecycleGroupForWebhook(connector, args) {
|
|
|
2053
2069
|
if (!upstream.ok || !parsed?.ok || typeof parsed.chatId !== 'string') {
|
|
2054
2070
|
throw new Error(parsed?.error ?? `group_create_http_${upstream.status}`);
|
|
2055
2071
|
}
|
|
2072
|
+
groupsMatrixSnapshot.invalidate();
|
|
2056
2073
|
return { chatId: parsed.chatId, creatorLarkAppId: parsed.creator ?? pick.creatorLarkAppId };
|
|
2057
2074
|
}
|
|
2058
2075
|
/**
|
|
@@ -2635,12 +2652,13 @@ const server = createServer(async (req, res) => {
|
|
|
2635
2652
|
// raw appId as botName — resolve through the live registry so consumers
|
|
2636
2653
|
// (dashboard, HD2D office tab) always see the human-facing name.
|
|
2637
2654
|
const names = new Map([...registry.list()].map(d => [d.larkAppId, d.botName]));
|
|
2638
|
-
|
|
2655
|
+
groupsMatrixSnapshot.warm();
|
|
2656
|
+
const sessions = enrichSessionsWithGroupNames(aggregator.getSessions().map(s => {
|
|
2639
2657
|
const n = names.get(s.larkAppId);
|
|
2640
2658
|
return n && n !== s.larkAppId && (!s.botName || s.botName === s.larkAppId)
|
|
2641
2659
|
? { ...s, botName: n }
|
|
2642
2660
|
: s;
|
|
2643
|
-
});
|
|
2661
|
+
}), groupsMatrixSnapshot.peekPresentation());
|
|
2644
2662
|
return jsonRes(res, 200, {
|
|
2645
2663
|
sessions: authed ? sessions : redactSessionsForPublic(sessions),
|
|
2646
2664
|
});
|
|
@@ -3916,7 +3934,12 @@ const server = createServer(async (req, res) => {
|
|
|
3916
3934
|
// route and the Route B `/__daemon/groups-matrix` endpoint return the
|
|
3917
3935
|
// same matrix shape. Public-read carve-out: oncall bindings carry
|
|
3918
3936
|
// workingDir (repo/customer paths) so we scrub when unauthed.
|
|
3919
|
-
const matrix = await
|
|
3937
|
+
const matrix = await groupsMatrixSnapshot.get({
|
|
3938
|
+
force: authed && url.searchParams.get('refresh') === '1',
|
|
3939
|
+
});
|
|
3940
|
+
if (url.searchParams.get('view') === 'compact') {
|
|
3941
|
+
return jsonRes(res, 200, compactGroupsMatrix(matrix));
|
|
3942
|
+
}
|
|
3920
3943
|
return jsonRes(res, 200, {
|
|
3921
3944
|
chats: authed ? matrix.chats : redactGroupsForPublic(matrix.chats),
|
|
3922
3945
|
bots: matrix.bots,
|
|
@@ -3961,14 +3984,33 @@ const server = createServer(async (req, res) => {
|
|
|
3961
3984
|
headers: { 'content-type': 'application/json' },
|
|
3962
3985
|
body: raw,
|
|
3963
3986
|
});
|
|
3987
|
+
const upstreamText = await upstream.text();
|
|
3988
|
+
let upstreamJson = null;
|
|
3989
|
+
try {
|
|
3990
|
+
upstreamJson = JSON.parse(upstreamText);
|
|
3991
|
+
}
|
|
3992
|
+
catch { /* leave null */ }
|
|
3993
|
+
// 写角色会翻转群矩阵里的 hasRole → 失效快照,避免 roles 页「已配置」
|
|
3994
|
+
// 徽标最多陈旧 30s(对齐 oncall bind/unbind、建群/加 bot 的失效)。
|
|
3995
|
+
if (roleWriteShouldInvalidate(upstream.ok, upstreamJson))
|
|
3996
|
+
groupsMatrixSnapshot.invalidate();
|
|
3964
3997
|
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3965
|
-
res.end(
|
|
3998
|
+
res.end(upstreamText);
|
|
3966
3999
|
return;
|
|
3967
4000
|
}
|
|
3968
4001
|
if (req.method === 'DELETE') {
|
|
3969
4002
|
const upstream = await proxyToDaemon(larkAppId, `/api/roles/${encodeURIComponent(chatId)}`, { method: 'DELETE' });
|
|
4003
|
+
const upstreamText = await upstream.text();
|
|
4004
|
+
let upstreamJson = null;
|
|
4005
|
+
try {
|
|
4006
|
+
upstreamJson = JSON.parse(upstreamText);
|
|
4007
|
+
}
|
|
4008
|
+
catch { /* leave null */ }
|
|
4009
|
+
// 删角色会把 hasRole 翻回 false — 失效快照让徽标立即刷新,不等 30s TTL。
|
|
4010
|
+
if (roleWriteShouldInvalidate(upstream.ok, upstreamJson))
|
|
4011
|
+
groupsMatrixSnapshot.invalidate();
|
|
3970
4012
|
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
3971
|
-
res.end(
|
|
4013
|
+
res.end(upstreamText);
|
|
3972
4014
|
return;
|
|
3973
4015
|
}
|
|
3974
4016
|
}
|
|
@@ -4126,8 +4168,19 @@ const server = createServer(async (req, res) => {
|
|
|
4126
4168
|
headers: { 'content-type': 'application/json' },
|
|
4127
4169
|
body: raw,
|
|
4128
4170
|
});
|
|
4171
|
+
const upstreamText = await upstream.text();
|
|
4172
|
+
let upstreamJson = null;
|
|
4173
|
+
try {
|
|
4174
|
+
upstreamJson = JSON.parse(upstreamText);
|
|
4175
|
+
}
|
|
4176
|
+
catch { /* leave null */ }
|
|
4177
|
+
// 只有真正改写了角色文件(changed:true)才失效缓存:preview、被拒
|
|
4178
|
+
// (chat_role_exists)、missing_entry 都不动 hasRole,跟着失效只会白白
|
|
4179
|
+
// 打穿 30s 快照、把 PR 的 fan-out 优化抵消掉(判定在 roleWriteShouldInvalidate)。
|
|
4180
|
+
if (roleWriteShouldInvalidate(upstream.ok, upstreamJson))
|
|
4181
|
+
groupsMatrixSnapshot.invalidate();
|
|
4129
4182
|
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4130
|
-
res.end(
|
|
4183
|
+
res.end(upstreamText);
|
|
4131
4184
|
return;
|
|
4132
4185
|
}
|
|
4133
4186
|
let mRoleProfileEntry;
|
|
@@ -4886,6 +4939,8 @@ const server = createServer(async (req, res) => {
|
|
|
4886
4939
|
upstreamJson.autoInvitedOpenId = autoInvited;
|
|
4887
4940
|
}
|
|
4888
4941
|
}
|
|
4942
|
+
if (upstream.ok && upstreamJson?.ok)
|
|
4943
|
+
groupsMatrixSnapshot.invalidate();
|
|
4889
4944
|
res.writeHead(upstream.status, { 'content-type': 'application/json' });
|
|
4890
4945
|
res.end(upstreamJson ? JSON.stringify(upstreamJson) : upstreamText);
|
|
4891
4946
|
return;
|
|
@@ -4972,6 +5027,7 @@ const server = createServer(async (req, res) => {
|
|
|
4972
5027
|
if (!groupUpstream.ok || !groupResp?.ok || typeof groupResp.chatId !== 'string') {
|
|
4973
5028
|
return jsonRes(res, 502, { ok: false, error: groupResp?.error ?? `group_create_http_${groupUpstream.status}` });
|
|
4974
5029
|
}
|
|
5030
|
+
groupsMatrixSnapshot.invalidate();
|
|
4975
5031
|
}
|
|
4976
5032
|
catch {
|
|
4977
5033
|
return jsonRes(res, 502, { ok: false, error: 'group_create_proxy_failed' });
|
|
@@ -5422,9 +5478,9 @@ function shutdown() {
|
|
|
5422
5478
|
resourceMonitor.stop();
|
|
5423
5479
|
platformTunnel?.stop();
|
|
5424
5480
|
debugTerminalManager.shutdown();
|
|
5425
|
-
server.close(() => process.exit(
|
|
5481
|
+
server.close(() => process.exit(gracefulProcessExitCode()));
|
|
5426
5482
|
// Hard-exit fallback after 5s
|
|
5427
|
-
setTimeout(() => process.exit(
|
|
5483
|
+
setTimeout(() => process.exit(gracefulProcessExitCode()), 5_000).unref();
|
|
5428
5484
|
}
|
|
5429
5485
|
process.on('SIGTERM', shutdown);
|
|
5430
5486
|
process.on('SIGINT', shutdown);
|