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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../../src/core/resource-monitor/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAErB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,eAAe,EAAE;QACf,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,GAAG,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;IACF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACpD;
|
|
1
|
+
{"version":3,"file":"attribution.d.ts","sourceRoot":"","sources":["../../../src/core/resource-monitor/attribution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EAErB,kBAAkB,EAClB,sBAAsB,EACvB,MAAM,YAAY,CAAC;AAGpB,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,KAAK,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACvC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,IAAI,EAAE,kBAAkB,EAAE,CAAC;IAC3B,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,eAAe,EAAE;QACf,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,MAAM,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAC7C,GAAG,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC3C,CAAC;IACF,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACpD;AAkGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAyJ7E"}
|
|
@@ -23,6 +23,22 @@ function collectSubtree(rootPid, children) {
|
|
|
23
23
|
}
|
|
24
24
|
return out;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Do a sampled process and a marker agree on the same process birth?
|
|
28
|
+
*
|
|
29
|
+
* Linux compares /proc start ticks, where the two producers are byte-identical.
|
|
30
|
+
* macOS compares ps(1) `lstart` strings, and the two producers format the
|
|
31
|
+
* day-of-month differently: `ps -p <pid>` keeps ps's space padding (`Aug 5`) while
|
|
32
|
+
* the sampler's bulk table is whitespace-split (`Aug 5`). Normalizing here rather
|
|
33
|
+
* than in readProcessStartIdentity() keeps the stamps already written into live
|
|
34
|
+
* marker files valid across an upgrade — the marker path must stay byte-exact.
|
|
35
|
+
*/
|
|
36
|
+
function sameProcessBirth(sampled, markerProcStart) {
|
|
37
|
+
if (sampled === undefined)
|
|
38
|
+
return false;
|
|
39
|
+
const collapse = (value) => value.trim().replace(/\s+/g, ' ');
|
|
40
|
+
return collapse(String(sampled)) === collapse(markerProcStart);
|
|
41
|
+
}
|
|
26
42
|
function addPidTree(target, rootPid, children, byPid) {
|
|
27
43
|
if (!rootPid || rootPid <= 0 || !byPid.has(rootPid))
|
|
28
44
|
return false;
|
|
@@ -74,7 +90,7 @@ export function attributeResources(input) {
|
|
|
74
90
|
const markerPidsBySession = new Map();
|
|
75
91
|
for (const [pid, marker] of input.cliMarkers) {
|
|
76
92
|
const proc = byPid.get(pid);
|
|
77
|
-
if (marker.procStart && (!proc ||
|
|
93
|
+
if (marker.procStart && (!proc || !sameProcessBirth(proc.startTicks, marker.procStart))) {
|
|
78
94
|
continue;
|
|
79
95
|
}
|
|
80
96
|
const arr = markerPidsBySession.get(marker.sessionId) ?? [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../../src/core/resource-monitor/attribution.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"attribution.js","sourceRoot":"","sources":["../../../src/core/resource-monitor/attribution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { cpus } from 'node:os';
|
|
2
|
+
import type { ProcfsSample, ProcessResourceSample } from './types.js';
|
|
3
|
+
/** Wall-clock budget shared by every tool in one sample. */
|
|
4
|
+
export declare function createSampleBudget(nowFn: () => number, budgetMs?: number): () => number;
|
|
5
|
+
/**
|
|
6
|
+
* Why the outcome distinguishes "absent" from "failed":
|
|
7
|
+
*
|
|
8
|
+
* Some tools decide *how* a metric is defined — vm_stat decides what "available
|
|
9
|
+
* memory" means, top decides whether process memory is phys_footprint or RSS. A tool
|
|
10
|
+
* that does not exist on this host is a stable property: the fallback definition then
|
|
11
|
+
* holds for every sample and the series stays internally comparable. A tool that
|
|
12
|
+
* exists but failed *this once* (timeout, sandbox denial, exhausted budget) is the
|
|
13
|
+
* dangerous case — falling back for one sample splices a different definition into a
|
|
14
|
+
* series and draws a step that reads as a real spike. Callers must drop such a sample
|
|
15
|
+
* instead, so collapsing both cases into `undefined` is not good enough.
|
|
16
|
+
*/
|
|
17
|
+
export type ToolOutcome = {
|
|
18
|
+
ok: true;
|
|
19
|
+
stdout: string;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
absent: true;
|
|
23
|
+
} | {
|
|
24
|
+
ok: false;
|
|
25
|
+
absent: false;
|
|
26
|
+
};
|
|
27
|
+
export type ToolRunner = (candidates: string[], args: string[], remainingMs: () => number, maxMs?: number) => ToolOutcome;
|
|
28
|
+
/**
|
|
29
|
+
* Host CPU ticks in centiseconds, summed across cores.
|
|
30
|
+
*
|
|
31
|
+
* `os.cpus()` reports milliseconds per core; dividing by 10 lands on the same unit
|
|
32
|
+
* as the process table below. macOS has no iowait, so idle is idle.
|
|
33
|
+
*/
|
|
34
|
+
export declare function hostCpuTicks(cpuList: ReturnType<typeof cpus>): {
|
|
35
|
+
total: number;
|
|
36
|
+
idle: number;
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* `ps -o time` cumulative CPU time → centiseconds.
|
|
40
|
+
* Formats seen from macOS ps: `0:00.14`, `170:41.46`, `27:03:12.08`, `3-04:11:22.31`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function parsePsCpuTime(raw: string): number;
|
|
43
|
+
/**
|
|
44
|
+
* One row of `ps -Ao pid=,ppid=,rss=,time=,lstart=`.
|
|
45
|
+
*
|
|
46
|
+
* Every column is kernel-derived and fixed-format: `lstart` is ps's
|
|
47
|
+
* `%a %b %e %H:%M:%S %Y`, always exactly 5 whitespace-separated tokens, so a row is
|
|
48
|
+
* exactly 9 tokens and anything else is not a row we understand. The lstart string is
|
|
49
|
+
* carried through as `startTicks`: on macOS it is what marker birth-stamps are
|
|
50
|
+
* compared against (see readProcessStartIdentity), hence `number | string`.
|
|
51
|
+
*
|
|
52
|
+
* Rejecting off-shape rows matters because a row is what grants a pid its ppid, its
|
|
53
|
+
* memory and its birth identity — a fabricated one would place a process anywhere in
|
|
54
|
+
* the tree. There is no attacker-controlled text in this table (argv is not selected),
|
|
55
|
+
* and the format checks keep it that way if ps ever changes its output.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parsePsLine(line: string): ProcessResourceSample | null;
|
|
58
|
+
export declare function parsePsTable(raw: string): ProcessResourceSample[];
|
|
59
|
+
/**
|
|
60
|
+
* `top`'s MEM column is phys_footprint — the same number Activity Monitor shows as
|
|
61
|
+
* "Memory", and the closest macOS analogue to the PSS the Linux sampler prefers:
|
|
62
|
+
* shared clean pages are excluded and compressed pages are counted, so summing it
|
|
63
|
+
* across a process group does not double-count the shared Node runtime the way RSS
|
|
64
|
+
* does (measured: 213MB footprint vs 558MB RSS for one claude process).
|
|
65
|
+
*
|
|
66
|
+
* The cost is precision — top rounds to 3-4 significant digits with a unit suffix.
|
|
67
|
+
*/
|
|
68
|
+
export declare function parseTopMemBytes(raw: string): number | null;
|
|
69
|
+
export declare function parseTopFootprints(raw: string): Map<number, number>;
|
|
70
|
+
/** `ps -Ao pid=,lstart=` → pid → birth stamp, used to re-check identity after top. */
|
|
71
|
+
export declare function parsePsBirthStamps(raw: string): Map<number, string>;
|
|
72
|
+
/**
|
|
73
|
+
* Overlay top's phys_footprint onto the ps table, but only for pids that provably
|
|
74
|
+
* did not change identity in between.
|
|
75
|
+
*
|
|
76
|
+
* ps and top are separate instants. A pid sampled by ps can exit and be recycled
|
|
77
|
+
* before top runs, which would otherwise splice the new process's memory onto the old
|
|
78
|
+
* process's identity and process tree — and if the old process still had a live
|
|
79
|
+
* marker, the wrong number would be shown with `confidence=marker`. Re-reading the
|
|
80
|
+
* birth stamps after top brackets the whole window: an unchanged stamp means the pid
|
|
81
|
+
* did not change hands. Anything unproven — recycled, or absent from the second pass
|
|
82
|
+
* because it exited — keeps its ps RSS.
|
|
83
|
+
*
|
|
84
|
+
* Precision caveat: `lstart` resolves to one second, so a recycle *within the same
|
|
85
|
+
* second* presents an identical stamp and slips through. XNU hands out pids
|
|
86
|
+
* sequentially from `lastpid + 1` and wraps at PID_MAX back to 100, so hitting it
|
|
87
|
+
* takes roughly a full lap of the pid space — ~100k allocations — inside one second.
|
|
88
|
+
* That is extremely hard to reach in practice, not provably impossible. Closing it
|
|
89
|
+
* outright would mean microsecond birth times from `proc_pidinfo`, i.e. a native
|
|
90
|
+
* binding; not worth it for a memory number that self-corrects on the next sample.
|
|
91
|
+
*/
|
|
92
|
+
export declare function applyFootprints(processes: ProcessResourceSample[], footprints: Map<number, number>, birthAfter: Map<number, string>): void;
|
|
93
|
+
/**
|
|
94
|
+
* `vm_stat` page counters → the memTotal/memAvailable pair.
|
|
95
|
+
*
|
|
96
|
+
* "Available" = free + speculative + inactive. This deliberately follows Linux
|
|
97
|
+
* MemAvailable semantics rather than Activity Monitor's "used": those queues are
|
|
98
|
+
* reclaimable under pressure, exactly like Linux's page cache and inactive LRU. Pages
|
|
99
|
+
* held by the compressor are *not* reclaimable and are therefore counted as used,
|
|
100
|
+
* since they are in none of those queues. Do not "fix" this to match Activity
|
|
101
|
+
* Monitor — it would make macOS hosts read as permanently ~90% full and break
|
|
102
|
+
* comparability with the Linux hosts on the same dashboard.
|
|
103
|
+
*
|
|
104
|
+
* `Pages purgeable` is deliberately NOT added. It is not a fifth, disjoint queue:
|
|
105
|
+
* XNU bumps `vm_page_purgeable_count` for resident non-wired pages of volatile
|
|
106
|
+
* purgeable objects, and those pages simultaneously sit on the active/inactive
|
|
107
|
+
* queues. Adding it double-counts the inactive∩purgeable overlap, overstating
|
|
108
|
+
* available memory (unbounded in the graphics/cache-heavy case, and able to exceed
|
|
109
|
+
* total). The aggregate counters cannot express the overlap-free reclaimable union,
|
|
110
|
+
* so this stays a documented under-estimate rather than a double-counted guess.
|
|
111
|
+
*/
|
|
112
|
+
export declare function parseVmStat(raw: string, totalBytes: number): {
|
|
113
|
+
memTotalBytes: number;
|
|
114
|
+
memAvailableBytes: number;
|
|
115
|
+
} | null;
|
|
116
|
+
/** `sysctl -n vm.swapusage` → `total = 2048.00M used = 1024.25M free = 1023.75M (encrypted)` */
|
|
117
|
+
export declare function parseSwapusage(raw: string): {
|
|
118
|
+
swapTotalBytes: number;
|
|
119
|
+
swapFreeBytes: number;
|
|
120
|
+
};
|
|
121
|
+
export interface DarwinSampleDeps {
|
|
122
|
+
nowFn?: () => number;
|
|
123
|
+
run?: ToolRunner;
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Build one macOS sample, or null when this round cannot be trusted.
|
|
127
|
+
*
|
|
128
|
+
* The degradation rule, applied to every tool that defines a metric:
|
|
129
|
+
*
|
|
130
|
+
* - **deterministic** — binary absent, or output this host's OS version formats in a
|
|
131
|
+
* way we cannot parse → stable fallback. It applies to every sample on this host,
|
|
132
|
+
* so the series stays internally comparable and no step appears.
|
|
133
|
+
* - **transient** — the binary is there and normally parses, but *this call* failed
|
|
134
|
+
* (timeout, sandbox denial, exhausted budget) → return null. The caller renders
|
|
135
|
+
* "unsupported" for one round, which is honest; substituting the fallback for a
|
|
136
|
+
* single sample splices a second definition into a live series and draws a step
|
|
137
|
+
* that reads as a real spike (os.freemem() understates available memory; ps RSS
|
|
138
|
+
* runs ~2.7× phys_footprint).
|
|
139
|
+
*
|
|
140
|
+
* Order follows that rule: the mandatory process table first — with the whole budget,
|
|
141
|
+
* since losing it invalidates the sample and resets the dashboard's CPU and session
|
|
142
|
+
* baselines — then the cheap host counters, and only then the optional footprint pass.
|
|
143
|
+
*/
|
|
144
|
+
export declare function sampleDarwin(nowMs: number, deps?: DarwinSampleDeps): ProcfsSample | null;
|
|
145
|
+
//# sourceMappingURL=darwin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"darwin.d.ts","sourceRoot":"","sources":["../../../src/core/resource-monitor/darwin.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAA8B,MAAM,SAAS,CAAC;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAkDtE,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,MAAM,EAAE,QAAQ,SAAmB,GAAG,MAAM,MAAM,CAGjG;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,GACnB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,IAAI,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC;AAEjC,MAAM,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,WAAW,CAAC;AA0B1H;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAS9F;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAalD;AAQD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI,CAiBtE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,qBAAqB,EAAE,CAQjE;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAQ3D;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAUnE;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAWnE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,qBAAqB,EAAE,EAClC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,IAAI,CAQN;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAaxH;AAED,mGAAmG;AACnG,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAQ7F;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,UAAU,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,YAAY,GAAG,IAAI,CA6C5F"}
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
import { execFileSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { cpus, freemem, loadavg, totalmem } from 'node:os';
|
|
4
|
+
/**
|
|
5
|
+
* macOS resource sampling — the darwin counterpart of `procfs.ts`.
|
|
6
|
+
*
|
|
7
|
+
* There is no /proc on macOS, so every field of `ProcfsSample` is rebuilt from a
|
|
8
|
+
* different source. The tick unit is fixed at **centiseconds (10ms)** so it matches
|
|
9
|
+
* Linux's USER_HZ=100 convention: the service layer only ever divides process ticks
|
|
10
|
+
* by host ticks, so the two must share one unit.
|
|
11
|
+
*
|
|
12
|
+
* - host cpu ticks → `os.cpus()` per-core times (ms) summed across cores
|
|
13
|
+
* - loadavg → `os.loadavg()`
|
|
14
|
+
* - mem → `vm_stat` page counters + `sysctl vm.swapusage`
|
|
15
|
+
* - process table → `ps -Ao pid=,ppid=,rss=,time=,lstart=`
|
|
16
|
+
* - process memory → `top -l 1 -stats pid,mem` (phys_footprint), RSS as fallback
|
|
17
|
+
*
|
|
18
|
+
* Every external command is spawned by absolute path with a pinned PATH/LANG, the
|
|
19
|
+
* same hardening `session-marker.ts` already applies to its `ps` fallback, and the
|
|
20
|
+
* whole sample shares one wall-clock budget so a wedged tool cannot stall the daemon
|
|
21
|
+
* for the length of every timeout in turn.
|
|
22
|
+
*
|
|
23
|
+
* The process table deliberately does *not* select `command`. No consumer reads
|
|
24
|
+
* `cmd`, and including it would put attacker-sized data in the output: argv can reach
|
|
25
|
+
* ARG_MAX (1MiB) per process, so a handful of processes could push the table past
|
|
26
|
+
* maxBuffer and take the whole dashboard to "unsupported". Without it the table is
|
|
27
|
+
* kernel-derived, fixed-width, and ~40KB on a 700-process host (vs ~120KB with).
|
|
28
|
+
*/
|
|
29
|
+
const PS_BINS = ['/bin/ps', '/usr/bin/ps'];
|
|
30
|
+
const VM_STAT_BINS = ['/usr/bin/vm_stat'];
|
|
31
|
+
const SYSCTL_BINS = ['/usr/sbin/sysctl', '/sbin/sysctl'];
|
|
32
|
+
const TOP_BINS = ['/usr/bin/top'];
|
|
33
|
+
const COMMAND_TIMEOUT_MS = 2_000;
|
|
34
|
+
// One budget for the whole sample. Each tool is capped at the smaller of its own
|
|
35
|
+
// timeout and what is left, so the worst case is bounded by this instead of by the
|
|
36
|
+
// sum of five separate timeouts — these are synchronous spawns on the daemon's event
|
|
37
|
+
// loop, and the sampler runs every 10s.
|
|
38
|
+
const SAMPLE_BUDGET_MS = 3_000;
|
|
39
|
+
const COMMAND_MAX_BUFFER = 16 * 1024 * 1024;
|
|
40
|
+
// `top` truncates the process list at -n; 4096 is far above any real host's count
|
|
41
|
+
// while still bounding the output we have to parse.
|
|
42
|
+
const TOP_PROCESS_LIMIT = 4096;
|
|
43
|
+
function firstExisting(candidates) {
|
|
44
|
+
for (const candidate of candidates) {
|
|
45
|
+
if (existsSync(candidate))
|
|
46
|
+
return candidate;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/** Wall-clock budget shared by every tool in one sample. */
|
|
51
|
+
export function createSampleBudget(nowFn, budgetMs = SAMPLE_BUDGET_MS) {
|
|
52
|
+
const deadline = nowFn() + budgetMs;
|
|
53
|
+
return () => Math.max(0, deadline - nowFn());
|
|
54
|
+
}
|
|
55
|
+
const runTool = (candidates, args, remainingMs, maxMs = COMMAND_TIMEOUT_MS) => {
|
|
56
|
+
const bin = firstExisting(candidates);
|
|
57
|
+
if (!bin)
|
|
58
|
+
return { ok: false, absent: true };
|
|
59
|
+
const timeout = Math.min(maxMs, remainingMs());
|
|
60
|
+
if (timeout <= 0)
|
|
61
|
+
return { ok: false, absent: false };
|
|
62
|
+
try {
|
|
63
|
+
return {
|
|
64
|
+
ok: true,
|
|
65
|
+
stdout: execFileSync(bin, args, {
|
|
66
|
+
encoding: 'utf-8',
|
|
67
|
+
timeout,
|
|
68
|
+
maxBuffer: COMMAND_MAX_BUFFER,
|
|
69
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
70
|
+
// Pinned env: LANG=C keeps `ps -o lstart=` byte-identical to the marker
|
|
71
|
+
// birth-stamps written by readProcessStartIdentity(), which also pins LANG=C.
|
|
72
|
+
env: { PATH: '/usr/bin:/bin:/usr/sbin:/sbin', LANG: 'C' },
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Denied by a sandbox profile, timed out, or output over maxBuffer.
|
|
78
|
+
return { ok: false, absent: false };
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Host CPU ticks in centiseconds, summed across cores.
|
|
83
|
+
*
|
|
84
|
+
* `os.cpus()` reports milliseconds per core; dividing by 10 lands on the same unit
|
|
85
|
+
* as the process table below. macOS has no iowait, so idle is idle.
|
|
86
|
+
*/
|
|
87
|
+
export function hostCpuTicks(cpuList) {
|
|
88
|
+
let total = 0;
|
|
89
|
+
let idle = 0;
|
|
90
|
+
for (const cpu of cpuList) {
|
|
91
|
+
const times = cpu.times;
|
|
92
|
+
total += (times.user + times.nice + times.sys + times.irq + times.idle) / 10;
|
|
93
|
+
idle += times.idle / 10;
|
|
94
|
+
}
|
|
95
|
+
return { total: Math.round(total), idle: Math.round(idle) };
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* `ps -o time` cumulative CPU time → centiseconds.
|
|
99
|
+
* Formats seen from macOS ps: `0:00.14`, `170:41.46`, `27:03:12.08`, `3-04:11:22.31`.
|
|
100
|
+
*/
|
|
101
|
+
export function parsePsCpuTime(raw) {
|
|
102
|
+
const trimmed = raw.trim();
|
|
103
|
+
if (!trimmed)
|
|
104
|
+
return 0;
|
|
105
|
+
const dashSplit = trimmed.split('-');
|
|
106
|
+
const days = dashSplit.length > 1 ? Number(dashSplit[0]) || 0 : 0;
|
|
107
|
+
const clock = dashSplit.length > 1 ? dashSplit[1] : dashSplit[0];
|
|
108
|
+
const parts = clock.split(':');
|
|
109
|
+
if (parts.length === 0)
|
|
110
|
+
return 0;
|
|
111
|
+
const seconds = Number(parts[parts.length - 1]) || 0;
|
|
112
|
+
const minutes = parts.length >= 2 ? Number(parts[parts.length - 2]) || 0 : 0;
|
|
113
|
+
const hours = parts.length >= 3 ? Number(parts[parts.length - 3]) || 0 : 0;
|
|
114
|
+
const totalSeconds = days * 86_400 + hours * 3_600 + minutes * 60 + seconds;
|
|
115
|
+
return Math.round(totalSeconds * 100);
|
|
116
|
+
}
|
|
117
|
+
// `[dd-][hh:]mm:ss.cc` and `%a %b %e %H:%M:%S %Y`, the only shapes ps emits for the
|
|
118
|
+
// two fixed-format columns. Validating them means a row whose layout we did not
|
|
119
|
+
// expect is dropped rather than mistaken for a process (see parsePsLine).
|
|
120
|
+
const PS_CPUTIME_RE = /^(?:\d+-)?(?:\d+:)?\d+:\d+(?:\.\d+)?$/;
|
|
121
|
+
const PS_LSTART_RE = /^[A-Za-z]{3} [A-Za-z]{3} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}$/;
|
|
122
|
+
/**
|
|
123
|
+
* One row of `ps -Ao pid=,ppid=,rss=,time=,lstart=`.
|
|
124
|
+
*
|
|
125
|
+
* Every column is kernel-derived and fixed-format: `lstart` is ps's
|
|
126
|
+
* `%a %b %e %H:%M:%S %Y`, always exactly 5 whitespace-separated tokens, so a row is
|
|
127
|
+
* exactly 9 tokens and anything else is not a row we understand. The lstart string is
|
|
128
|
+
* carried through as `startTicks`: on macOS it is what marker birth-stamps are
|
|
129
|
+
* compared against (see readProcessStartIdentity), hence `number | string`.
|
|
130
|
+
*
|
|
131
|
+
* Rejecting off-shape rows matters because a row is what grants a pid its ppid, its
|
|
132
|
+
* memory and its birth identity — a fabricated one would place a process anywhere in
|
|
133
|
+
* the tree. There is no attacker-controlled text in this table (argv is not selected),
|
|
134
|
+
* and the format checks keep it that way if ps ever changes its output.
|
|
135
|
+
*/
|
|
136
|
+
export function parsePsLine(line) {
|
|
137
|
+
const fields = line.trim().split(/\s+/);
|
|
138
|
+
if (fields.length !== 9)
|
|
139
|
+
return null;
|
|
140
|
+
const pid = Number(fields[0]);
|
|
141
|
+
const ppid = Number(fields[1]);
|
|
142
|
+
const rssKb = Number(fields[2]);
|
|
143
|
+
if (!Number.isInteger(pid) || !Number.isInteger(ppid) || !Number.isFinite(rssKb))
|
|
144
|
+
return null;
|
|
145
|
+
if (!PS_CPUTIME_RE.test(fields[3]))
|
|
146
|
+
return null;
|
|
147
|
+
const startTicks = fields.slice(4, 9).join(' ');
|
|
148
|
+
if (!PS_LSTART_RE.test(startTicks))
|
|
149
|
+
return null;
|
|
150
|
+
return {
|
|
151
|
+
pid,
|
|
152
|
+
ppid,
|
|
153
|
+
rssBytes: rssKb * 1024,
|
|
154
|
+
cpuTicks: parsePsCpuTime(fields[3]),
|
|
155
|
+
startTicks,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
export function parsePsTable(raw) {
|
|
159
|
+
const out = [];
|
|
160
|
+
for (const line of raw.split('\n')) {
|
|
161
|
+
if (!line.trim())
|
|
162
|
+
continue;
|
|
163
|
+
const parsed = parsePsLine(line);
|
|
164
|
+
if (parsed)
|
|
165
|
+
out.push(parsed);
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* `top`'s MEM column is phys_footprint — the same number Activity Monitor shows as
|
|
171
|
+
* "Memory", and the closest macOS analogue to the PSS the Linux sampler prefers:
|
|
172
|
+
* shared clean pages are excluded and compressed pages are counted, so summing it
|
|
173
|
+
* across a process group does not double-count the shared Node runtime the way RSS
|
|
174
|
+
* does (measured: 213MB footprint vs 558MB RSS for one claude process).
|
|
175
|
+
*
|
|
176
|
+
* The cost is precision — top rounds to 3-4 significant digits with a unit suffix.
|
|
177
|
+
*/
|
|
178
|
+
export function parseTopMemBytes(raw) {
|
|
179
|
+
// Trailing +/- markers appear once top has a previous frame to diff against.
|
|
180
|
+
const match = raw.trim().match(/^([\d.]+)([BKMGT]?)[+-]?$/);
|
|
181
|
+
if (!match)
|
|
182
|
+
return null;
|
|
183
|
+
const value = Number(match[1]);
|
|
184
|
+
if (!Number.isFinite(value))
|
|
185
|
+
return null;
|
|
186
|
+
const scale = { B: 1, '': 1, K: 1024, M: 1024 ** 2, G: 1024 ** 3, T: 1024 ** 4 };
|
|
187
|
+
return value * (scale[match[2]] ?? 1);
|
|
188
|
+
}
|
|
189
|
+
export function parseTopFootprints(raw) {
|
|
190
|
+
const out = new Map();
|
|
191
|
+
for (const line of raw.split('\n')) {
|
|
192
|
+
const match = line.trim().match(/^(\d+)\s+(\S+)\s*$/);
|
|
193
|
+
if (!match)
|
|
194
|
+
continue;
|
|
195
|
+
const bytes = parseTopMemBytes(match[2]);
|
|
196
|
+
if (bytes === null)
|
|
197
|
+
continue;
|
|
198
|
+
out.set(Number(match[1]), bytes);
|
|
199
|
+
}
|
|
200
|
+
return out;
|
|
201
|
+
}
|
|
202
|
+
/** `ps -Ao pid=,lstart=` → pid → birth stamp, used to re-check identity after top. */
|
|
203
|
+
export function parsePsBirthStamps(raw) {
|
|
204
|
+
const out = new Map();
|
|
205
|
+
for (const line of raw.split('\n')) {
|
|
206
|
+
const fields = line.trim().split(/\s+/);
|
|
207
|
+
if (fields.length < 6)
|
|
208
|
+
continue;
|
|
209
|
+
const pid = Number(fields[0]);
|
|
210
|
+
const stamp = fields.slice(1, 6).join(' ');
|
|
211
|
+
if (!Number.isInteger(pid) || !PS_LSTART_RE.test(stamp))
|
|
212
|
+
continue;
|
|
213
|
+
out.set(pid, stamp);
|
|
214
|
+
}
|
|
215
|
+
return out;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Overlay top's phys_footprint onto the ps table, but only for pids that provably
|
|
219
|
+
* did not change identity in between.
|
|
220
|
+
*
|
|
221
|
+
* ps and top are separate instants. A pid sampled by ps can exit and be recycled
|
|
222
|
+
* before top runs, which would otherwise splice the new process's memory onto the old
|
|
223
|
+
* process's identity and process tree — and if the old process still had a live
|
|
224
|
+
* marker, the wrong number would be shown with `confidence=marker`. Re-reading the
|
|
225
|
+
* birth stamps after top brackets the whole window: an unchanged stamp means the pid
|
|
226
|
+
* did not change hands. Anything unproven — recycled, or absent from the second pass
|
|
227
|
+
* because it exited — keeps its ps RSS.
|
|
228
|
+
*
|
|
229
|
+
* Precision caveat: `lstart` resolves to one second, so a recycle *within the same
|
|
230
|
+
* second* presents an identical stamp and slips through. XNU hands out pids
|
|
231
|
+
* sequentially from `lastpid + 1` and wraps at PID_MAX back to 100, so hitting it
|
|
232
|
+
* takes roughly a full lap of the pid space — ~100k allocations — inside one second.
|
|
233
|
+
* That is extremely hard to reach in practice, not provably impossible. Closing it
|
|
234
|
+
* outright would mean microsecond birth times from `proc_pidinfo`, i.e. a native
|
|
235
|
+
* binding; not worth it for a memory number that self-corrects on the next sample.
|
|
236
|
+
*/
|
|
237
|
+
export function applyFootprints(processes, footprints, birthAfter) {
|
|
238
|
+
if (footprints.size === 0)
|
|
239
|
+
return;
|
|
240
|
+
for (const proc of processes) {
|
|
241
|
+
const footprint = footprints.get(proc.pid);
|
|
242
|
+
if (footprint === undefined)
|
|
243
|
+
continue;
|
|
244
|
+
if (birthAfter.get(proc.pid) !== proc.startTicks)
|
|
245
|
+
continue;
|
|
246
|
+
proc.rssBytes = footprint;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* `vm_stat` page counters → the memTotal/memAvailable pair.
|
|
251
|
+
*
|
|
252
|
+
* "Available" = free + speculative + inactive. This deliberately follows Linux
|
|
253
|
+
* MemAvailable semantics rather than Activity Monitor's "used": those queues are
|
|
254
|
+
* reclaimable under pressure, exactly like Linux's page cache and inactive LRU. Pages
|
|
255
|
+
* held by the compressor are *not* reclaimable and are therefore counted as used,
|
|
256
|
+
* since they are in none of those queues. Do not "fix" this to match Activity
|
|
257
|
+
* Monitor — it would make macOS hosts read as permanently ~90% full and break
|
|
258
|
+
* comparability with the Linux hosts on the same dashboard.
|
|
259
|
+
*
|
|
260
|
+
* `Pages purgeable` is deliberately NOT added. It is not a fifth, disjoint queue:
|
|
261
|
+
* XNU bumps `vm_page_purgeable_count` for resident non-wired pages of volatile
|
|
262
|
+
* purgeable objects, and those pages simultaneously sit on the active/inactive
|
|
263
|
+
* queues. Adding it double-counts the inactive∩purgeable overlap, overstating
|
|
264
|
+
* available memory (unbounded in the graphics/cache-heavy case, and able to exceed
|
|
265
|
+
* total). The aggregate counters cannot express the overlap-free reclaimable union,
|
|
266
|
+
* so this stays a documented under-estimate rather than a double-counted guess.
|
|
267
|
+
*/
|
|
268
|
+
export function parseVmStat(raw, totalBytes) {
|
|
269
|
+
const pageSize = Number(raw.match(/page size of (\d+) bytes/)?.[1]);
|
|
270
|
+
if (!Number.isFinite(pageSize) || pageSize <= 0)
|
|
271
|
+
return null;
|
|
272
|
+
const pages = (label) => {
|
|
273
|
+
const match = raw.match(new RegExp(`^${label}:\\s+(\\d+)\\.?\\s*$`, 'm'));
|
|
274
|
+
return match ? Number(match[1]) : 0;
|
|
275
|
+
};
|
|
276
|
+
const reclaimable = pages('Pages free') + pages('Pages speculative') + pages('Pages inactive');
|
|
277
|
+
if (reclaimable <= 0)
|
|
278
|
+
return null;
|
|
279
|
+
return {
|
|
280
|
+
memTotalBytes: totalBytes,
|
|
281
|
+
memAvailableBytes: reclaimable * pageSize,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/** `sysctl -n vm.swapusage` → `total = 2048.00M used = 1024.25M free = 1023.75M (encrypted)` */
|
|
285
|
+
export function parseSwapusage(raw) {
|
|
286
|
+
const scale = { B: 1, K: 1024, M: 1024 ** 2, G: 1024 ** 3, T: 1024 ** 4 };
|
|
287
|
+
const read = (label) => {
|
|
288
|
+
const match = raw.match(new RegExp(`${label}\\s*=\\s*([\\d.]+)([BKMGT])`, 'i'));
|
|
289
|
+
if (!match)
|
|
290
|
+
return 0;
|
|
291
|
+
return (Number(match[1]) || 0) * (scale[match[2].toUpperCase()] ?? 1);
|
|
292
|
+
};
|
|
293
|
+
return { swapTotalBytes: read('total'), swapFreeBytes: read('free') };
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Build one macOS sample, or null when this round cannot be trusted.
|
|
297
|
+
*
|
|
298
|
+
* The degradation rule, applied to every tool that defines a metric:
|
|
299
|
+
*
|
|
300
|
+
* - **deterministic** — binary absent, or output this host's OS version formats in a
|
|
301
|
+
* way we cannot parse → stable fallback. It applies to every sample on this host,
|
|
302
|
+
* so the series stays internally comparable and no step appears.
|
|
303
|
+
* - **transient** — the binary is there and normally parses, but *this call* failed
|
|
304
|
+
* (timeout, sandbox denial, exhausted budget) → return null. The caller renders
|
|
305
|
+
* "unsupported" for one round, which is honest; substituting the fallback for a
|
|
306
|
+
* single sample splices a second definition into a live series and draws a step
|
|
307
|
+
* that reads as a real spike (os.freemem() understates available memory; ps RSS
|
|
308
|
+
* runs ~2.7× phys_footprint).
|
|
309
|
+
*
|
|
310
|
+
* Order follows that rule: the mandatory process table first — with the whole budget,
|
|
311
|
+
* since losing it invalidates the sample and resets the dashboard's CPU and session
|
|
312
|
+
* baselines — then the cheap host counters, and only then the optional footprint pass.
|
|
313
|
+
*/
|
|
314
|
+
export function sampleDarwin(nowMs, deps = {}) {
|
|
315
|
+
const run = deps.run ?? runTool;
|
|
316
|
+
const remainingMs = createSampleBudget(deps.nowFn ?? Date.now);
|
|
317
|
+
const ps = run(PS_BINS, ['-Ao', 'pid=,ppid=,rss=,time=,lstart='], remainingMs, SAMPLE_BUDGET_MS);
|
|
318
|
+
if (!ps.ok)
|
|
319
|
+
return null;
|
|
320
|
+
const processes = parsePsTable(ps.stdout);
|
|
321
|
+
if (processes.length === 0)
|
|
322
|
+
return null;
|
|
323
|
+
const totalBytes = totalmem();
|
|
324
|
+
const vmStat = run(VM_STAT_BINS, [], remainingMs);
|
|
325
|
+
if (!vmStat.ok && !vmStat.absent)
|
|
326
|
+
return null;
|
|
327
|
+
// os.freemem() on macOS counts only free+speculative pages, so it understates what
|
|
328
|
+
// is actually reclaimable. Reached only when vm_stat is absent or unparseable here.
|
|
329
|
+
const mem = (vmStat.ok ? parseVmStat(vmStat.stdout, totalBytes) : null)
|
|
330
|
+
?? { memTotalBytes: totalBytes, memAvailableBytes: freemem() };
|
|
331
|
+
// Swap is exempt from the rule above: it is not written to any history series, so a
|
|
332
|
+
// missed reading shows as a zeroed swap gauge for one refresh and nothing more.
|
|
333
|
+
const swapRaw = run(SYSCTL_BINS, ['-n', 'vm.swapusage'], remainingMs);
|
|
334
|
+
const swap = parseSwapusage(swapRaw.ok ? swapRaw.stdout : '');
|
|
335
|
+
const [load1 = 0, load5 = 0, load15 = 0] = loadavg();
|
|
336
|
+
const cpuTicks = hostCpuTicks(cpus());
|
|
337
|
+
// phys_footprint per pid. Absent or unparseable top → every sample on this host
|
|
338
|
+
// reports ps RSS (stable). A failed top call, or a failed identity re-check that
|
|
339
|
+
// would silently leave RSS inside a footprint series → drop this sample.
|
|
340
|
+
const top = run(TOP_BINS, ['-l', '1', '-n', String(TOP_PROCESS_LIMIT), '-stats', 'pid,mem'], remainingMs);
|
|
341
|
+
if (!top.ok && !top.absent)
|
|
342
|
+
return null;
|
|
343
|
+
const footprints = top.ok ? parseTopFootprints(top.stdout) : new Map();
|
|
344
|
+
if (footprints.size > 0) {
|
|
345
|
+
const birthAfter = run(PS_BINS, ['-Ao', 'pid=,lstart='], remainingMs);
|
|
346
|
+
if (!birthAfter.ok)
|
|
347
|
+
return null;
|
|
348
|
+
applyFootprints(processes, footprints, parsePsBirthStamps(birthAfter.stdout));
|
|
349
|
+
}
|
|
350
|
+
return {
|
|
351
|
+
supported: true,
|
|
352
|
+
sampledAt: nowMs,
|
|
353
|
+
totalCpuTicks: cpuTicks.total,
|
|
354
|
+
idleCpuTicks: cpuTicks.idle,
|
|
355
|
+
loadavg: { load1, load5, load15 },
|
|
356
|
+
mem: { ...mem, ...swap },
|
|
357
|
+
processes,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
//# sourceMappingURL=darwin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"darwin.js","sourceRoot":"","sources":["../../../src/core/resource-monitor/darwin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"procfs.d.ts","sourceRoot":"","sources":["../../../src/core/resource-monitor/procfs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"procfs.d.ts","sourceRoot":"","sources":["../../../src/core/resource-monitor/procfs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAyB,MAAM,YAAY,CAAC;AAiBtE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMhF;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAG1F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC,KAAK,CAAC,CAa7D;AAOD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAc1I;AAED,wBAAgB,YAAY,CAAC,KAAK,SAAa,GAAG,YAAY,CA6D7D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { readdirSync, readFileSync } from 'node:fs';
|
|
2
2
|
import { platform } from 'node:os';
|
|
3
|
+
import { sampleDarwin } from './darwin.js';
|
|
3
4
|
const PAGE_SIZE_BYTES = 4096;
|
|
4
5
|
function unsupportedSample(sampledAt) {
|
|
5
6
|
return {
|
|
@@ -69,6 +70,11 @@ export function parseProcessStat(raw) {
|
|
|
69
70
|
return { pid, ppid, cpuTicks: utime + stime, startTicks, rssPages };
|
|
70
71
|
}
|
|
71
72
|
export function sampleProcfs(nowMs = Date.now()) {
|
|
73
|
+
// macOS has no /proc; darwin.ts rebuilds the same shape from ps/vm_stat/sysctl/top
|
|
74
|
+
// and returns null when those tools are unavailable (e.g. denied by a sandbox
|
|
75
|
+
// profile), which degrades to the same "unsupported" snapshot as any other platform.
|
|
76
|
+
if (platform() === 'darwin')
|
|
77
|
+
return sampleDarwin(nowMs) ?? unsupportedSample(nowMs);
|
|
72
78
|
if (platform() !== 'linux')
|
|
73
79
|
return unsupportedSample(nowMs);
|
|
74
80
|
let procEntries;
|