botmux 3.4.3 → 3.5.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 +10 -7
- package/README.md +11 -6
- package/dist/adapters/backend/herdr-backend.d.ts +43 -6
- package/dist/adapters/backend/herdr-backend.d.ts.map +1 -1
- package/dist/adapters/backend/herdr-backend.js +362 -28
- package/dist/adapters/backend/herdr-backend.js.map +1 -1
- package/dist/adapters/backend/reproduce-command.d.ts +39 -0
- package/dist/adapters/backend/reproduce-command.d.ts.map +1 -0
- package/dist/adapters/backend/reproduce-command.js +63 -0
- package/dist/adapters/backend/reproduce-command.js.map +1 -0
- package/dist/adapters/backend/session-backend-selector.d.ts +10 -1
- package/dist/adapters/backend/session-backend-selector.d.ts.map +1 -1
- package/dist/adapters/backend/session-backend-selector.js +73 -4
- package/dist/adapters/backend/session-backend-selector.js.map +1 -1
- package/dist/adapters/backend/types.d.ts +16 -0
- package/dist/adapters/backend/types.d.ts.map +1 -1
- package/dist/adapters/backend/types.js.map +1 -1
- package/dist/adapters/cli/pi-initial-prompt.d.ts.map +1 -1
- package/dist/adapters/cli/pi-initial-prompt.js +5 -1
- package/dist/adapters/cli/pi-initial-prompt.js.map +1 -1
- package/dist/adapters/cli/traex.d.ts.map +1 -1
- package/dist/adapters/cli/traex.js +5 -0
- package/dist/adapters/cli/traex.js.map +1 -1
- package/dist/adapters/cli/types.d.ts +3 -3
- package/dist/adapters/cli/types.d.ts.map +1 -1
- package/dist/adapters/hook-installer.d.ts +7 -0
- package/dist/adapters/hook-installer.d.ts.map +1 -1
- package/dist/adapters/hook-installer.js +56 -0
- package/dist/adapters/hook-installer.js.map +1 -1
- package/dist/bot-registry.d.ts +13 -0
- package/dist/bot-registry.d.ts.map +1 -1
- package/dist/bot-registry.js +118 -2
- package/dist/bot-registry.js.map +1 -1
- package/dist/cli/capabilities.d.ts +24 -0
- package/dist/cli/capabilities.d.ts.map +1 -0
- package/dist/cli/capabilities.js +25 -0
- package/dist/cli/capabilities.js.map +1 -0
- package/dist/cli/create-group-resolver.d.ts +24 -0
- package/dist/cli/create-group-resolver.d.ts.map +1 -1
- package/dist/cli/create-group-resolver.js +23 -0
- package/dist/cli/create-group-resolver.js.map +1 -1
- package/dist/cli/daemon-lifecycle-env.d.ts +5 -7
- package/dist/cli/daemon-lifecycle-env.d.ts.map +1 -1
- package/dist/cli/daemon-lifecycle-env.js +13 -7
- package/dist/cli/daemon-lifecycle-env.js.map +1 -1
- package/dist/cli/exact-chat-grant-client.d.ts +48 -0
- package/dist/cli/exact-chat-grant-client.d.ts.map +1 -0
- package/dist/cli/exact-chat-grant-client.js +108 -0
- package/dist/cli/exact-chat-grant-client.js.map +1 -0
- package/dist/cli/exact-chat-grant.d.ts +18 -0
- package/dist/cli/exact-chat-grant.d.ts.map +1 -0
- package/dist/cli/exact-chat-grant.js +97 -0
- package/dist/cli/exact-chat-grant.js.map +1 -0
- package/dist/cli.d.ts +10 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +770 -126
- package/dist/cli.js.map +1 -1
- package/dist/codex-rpc-engine.d.ts +26 -0
- package/dist/codex-rpc-engine.d.ts.map +1 -1
- package/dist/codex-rpc-engine.js +113 -2
- package/dist/codex-rpc-engine.js.map +1 -1
- package/dist/config.d.ts +16 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +16 -0
- package/dist/config.js.map +1 -1
- package/dist/core/bot-live-control.d.ts +41 -0
- package/dist/core/bot-live-control.d.ts.map +1 -0
- package/dist/core/bot-live-control.js +135 -0
- package/dist/core/bot-live-control.js.map +1 -0
- package/dist/core/command-handler.d.ts.map +1 -1
- package/dist/core/command-handler.js +28 -8
- package/dist/core/command-handler.js.map +1 -1
- package/dist/core/daemon-config-fence.d.ts +8 -0
- package/dist/core/daemon-config-fence.d.ts.map +1 -0
- package/dist/core/daemon-config-fence.js +13 -0
- package/dist/core/daemon-config-fence.js.map +1 -0
- package/dist/core/dashboard-events.d.ts +5 -0
- package/dist/core/dashboard-events.d.ts.map +1 -1
- package/dist/core/dashboard-events.js.map +1 -1
- package/dist/core/dashboard-ipc-server.d.ts +21 -2
- package/dist/core/dashboard-ipc-server.d.ts.map +1 -1
- package/dist/core/dashboard-ipc-server.js +232 -5
- package/dist/core/dashboard-ipc-server.js.map +1 -1
- package/dist/core/dispatch-registry.d.ts +12 -0
- package/dist/core/dispatch-registry.d.ts.map +1 -0
- package/dist/core/dispatch-registry.js +33 -0
- package/dist/core/dispatch-registry.js.map +1 -0
- package/dist/core/dispatch.d.ts +99 -0
- package/dist/core/dispatch.d.ts.map +1 -1
- package/dist/core/dispatch.js +136 -0
- package/dist/core/dispatch.js.map +1 -1
- package/dist/core/maintenance.d.ts.map +1 -1
- package/dist/core/maintenance.js +10 -3
- package/dist/core/maintenance.js.map +1 -1
- package/dist/core/persistent-backend.d.ts +16 -2
- package/dist/core/persistent-backend.d.ts.map +1 -1
- package/dist/core/persistent-backend.js +40 -0
- package/dist/core/persistent-backend.js.map +1 -1
- package/dist/core/session-discovery.d.ts +8 -1
- package/dist/core/session-discovery.d.ts.map +1 -1
- package/dist/core/session-discovery.js +140 -8
- package/dist/core/session-discovery.js.map +1 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +12 -8
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-title.d.ts +8 -0
- package/dist/core/session-title.d.ts.map +1 -1
- package/dist/core/session-title.js +54 -0
- package/dist/core/session-title.js.map +1 -1
- package/dist/core/terminal-write-auth.d.ts +15 -0
- package/dist/core/terminal-write-auth.d.ts.map +1 -1
- package/dist/core/terminal-write-auth.js +20 -0
- package/dist/core/terminal-write-auth.js.map +1 -1
- package/dist/core/trigger-session.d.ts.map +1 -1
- package/dist/core/trigger-session.js +3 -2
- package/dist/core/trigger-session.js.map +1 -1
- package/dist/core/types.d.ts +33 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/worker-pool.d.ts +27 -8
- package/dist/core/worker-pool.d.ts.map +1 -1
- package/dist/core/worker-pool.js +389 -19
- package/dist/core/worker-pool.js.map +1 -1
- package/dist/daemon.d.ts +4 -2
- package/dist/daemon.d.ts.map +1 -1
- package/dist/daemon.js +397 -26
- package/dist/daemon.js.map +1 -1
- package/dist/dashboard/bot-onboarding.d.ts +127 -1
- package/dist/dashboard/bot-onboarding.d.ts.map +1 -1
- package/dist/dashboard/bot-onboarding.js +1104 -25
- package/dist/dashboard/bot-onboarding.js.map +1 -1
- package/dist/dashboard/debug-terminal.d.ts +18 -0
- package/dist/dashboard/debug-terminal.d.ts.map +1 -0
- package/dist/dashboard/debug-terminal.js +338 -0
- package/dist/dashboard/debug-terminal.js.map +1 -0
- package/dist/dashboard/public-redact.d.ts +2 -0
- package/dist/dashboard/public-redact.d.ts.map +1 -1
- package/dist/dashboard/public-redact.js +12 -3
- package/dist/dashboard/public-redact.js.map +1 -1
- package/dist/dashboard/registry.d.ts +8 -0
- package/dist/dashboard/registry.d.ts.map +1 -1
- package/dist/dashboard/registry.js +13 -0
- package/dist/dashboard/registry.js.map +1 -1
- package/dist/dashboard/settings-write-applier.d.ts +47 -1
- package/dist/dashboard/settings-write-applier.d.ts.map +1 -1
- package/dist/dashboard/settings-write-applier.js +102 -1
- package/dist/dashboard/settings-write-applier.js.map +1 -1
- package/dist/dashboard/web/app.d.ts.map +1 -1
- package/dist/dashboard/web/app.js +2 -0
- package/dist/dashboard/web/app.js.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.d.ts +1 -0
- package/dist/dashboard/web/bot-defaults-page.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults-page.js +24 -5
- package/dist/dashboard/web/bot-defaults-page.js.map +1 -1
- package/dist/dashboard/web/bot-defaults.d.ts +15 -0
- package/dist/dashboard/web/bot-defaults.d.ts.map +1 -1
- package/dist/dashboard/web/bot-defaults.js +19 -0
- package/dist/dashboard/web/bot-defaults.js.map +1 -1
- package/dist/dashboard/web/i18n.d.ts.map +1 -1
- package/dist/dashboard/web/i18n.js +76 -6
- package/dist/dashboard/web/i18n.js.map +1 -1
- package/dist/dashboard/web/icon-tooltip.d.ts +3 -0
- package/dist/dashboard/web/icon-tooltip.d.ts.map +1 -0
- package/dist/dashboard/web/icon-tooltip.js +108 -0
- package/dist/dashboard/web/icon-tooltip.js.map +1 -0
- package/dist/dashboard/web/sessions-kanban.js +2 -2
- package/dist/dashboard/web/sessions-kanban.js.map +1 -1
- package/dist/dashboard/web/sessions-page.d.ts.map +1 -1
- package/dist/dashboard/web/sessions-page.js +48 -9
- package/dist/dashboard/web/sessions-page.js.map +1 -1
- package/dist/dashboard/web/sessions.d.ts +2 -0
- package/dist/dashboard/web/sessions.d.ts.map +1 -1
- package/dist/dashboard/web/sessions.js +46 -2
- package/dist/dashboard/web/sessions.js.map +1 -1
- package/dist/dashboard/web/settings-page.d.ts +78 -0
- package/dist/dashboard/web/settings-page.d.ts.map +1 -1
- package/dist/dashboard/web/settings-page.js +88 -1
- package/dist/dashboard/web/settings-page.js.map +1 -1
- package/dist/dashboard/web/store.d.ts +2 -0
- package/dist/dashboard/web/store.d.ts.map +1 -1
- package/dist/dashboard/web/store.js +13 -1
- package/dist/dashboard/web/store.js.map +1 -1
- package/dist/dashboard-web/app.js +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-O376WSER.js +5 -0
- package/dist/dashboard-web/chunks/{chunk-JNRSPKLS.js → chunk-EJDYUINZ.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-CUV65BIQ.js → chunk-H7P5UV4W.js} +6 -6
- package/dist/dashboard-web/chunks/{chunk-P6GO5KT4.js → chunk-QCPPKCX3.js} +1 -1
- package/dist/dashboard-web/chunks/{chunk-UBOLHQCK.js → chunk-WXPMNEYV.js} +1 -1
- package/dist/dashboard-web/chunks/{connectors-page-KTC2QWNW.js → connectors-page-IR54AOAI.js} +1 -1
- package/dist/dashboard-web/chunks/{groups-page-B3EKGOLY.js → groups-page-3P4TLUMF.js} +1 -1
- package/dist/dashboard-web/chunks/{insights-page-X6RXNCWX.js → insights-page-TDCZV56A.js} +1 -1
- package/dist/dashboard-web/chunks/{monitor-room-LLRA5LQW.js → monitor-room-QWCWL3SX.js} +1 -1
- package/dist/dashboard-web/chunks/{monitoring-page-7MT5FEOS.js → monitoring-page-IOWFSNVC.js} +1 -1
- package/dist/dashboard-web/chunks/{office-page-KD46D5TD.js → office-page-5AUPEHZP.js} +1 -1
- package/dist/dashboard-web/chunks/{overview-page-JUWNH32O.js → overview-page-QJMI6NLW.js} +1 -1
- package/dist/dashboard-web/chunks/{roles-page-P6F7NLOI.js → roles-page-WJVB52ET.js} +1 -1
- package/dist/dashboard-web/chunks/{schedules-page-XIHWZST4.js → schedules-page-RVRWHP4V.js} +1 -1
- package/dist/dashboard-web/chunks/sessions-page-KWLGBX6G.js +3 -0
- package/dist/dashboard-web/chunks/settings-page-TNZEPC7V.js +2 -0
- package/dist/dashboard-web/chunks/{skills-page-A46KVWBL.js → skills-page-7YT5TIX5.js} +1 -1
- package/dist/dashboard-web/chunks/{team-federation-page-SDUC56DF.js → team-federation-page-NJZKTU7A.js} +1 -1
- package/dist/dashboard-web/chunks/{v3-page-J5JOTUSQ.js → v3-page-NQ73UA2Q.js} +1 -1
- package/dist/dashboard-web/chunks/{whiteboards-page-U7LSOAWI.js → whiteboards-page-DSM3MDMN.js} +1 -1
- package/dist/dashboard-web/style.css +198 -7
- package/dist/dashboard.js +294 -7
- package/dist/dashboard.js.map +1 -1
- package/dist/features/codex-notifier/adoption.d.ts +11 -0
- package/dist/features/codex-notifier/adoption.d.ts.map +1 -0
- package/dist/features/codex-notifier/adoption.js +11 -0
- package/dist/features/codex-notifier/adoption.js.map +1 -0
- package/dist/features/codex-notifier/app-opener.d.ts +21 -0
- package/dist/features/codex-notifier/app-opener.d.ts.map +1 -0
- package/dist/features/codex-notifier/app-opener.js +33 -0
- package/dist/features/codex-notifier/app-opener.js.map +1 -0
- package/dist/features/codex-notifier/card-action.d.ts +27 -0
- package/dist/features/codex-notifier/card-action.d.ts.map +1 -0
- package/dist/features/codex-notifier/card-action.js +84 -0
- package/dist/features/codex-notifier/card-action.js.map +1 -0
- package/dist/features/codex-notifier/card.d.ts +12 -0
- package/dist/features/codex-notifier/card.d.ts.map +1 -0
- package/dist/features/codex-notifier/card.js +150 -0
- package/dist/features/codex-notifier/card.js.map +1 -0
- package/dist/features/codex-notifier/codex-context.d.ts +12 -0
- package/dist/features/codex-notifier/codex-context.d.ts.map +1 -0
- package/dist/features/codex-notifier/codex-context.js +161 -0
- package/dist/features/codex-notifier/codex-context.js.map +1 -0
- package/dist/features/codex-notifier/config.d.ts +9 -0
- package/dist/features/codex-notifier/config.d.ts.map +1 -0
- package/dist/features/codex-notifier/config.js +11 -0
- package/dist/features/codex-notifier/config.js.map +1 -0
- package/dist/features/codex-notifier/confirmed-turn.d.ts +20 -0
- package/dist/features/codex-notifier/confirmed-turn.d.ts.map +1 -0
- package/dist/features/codex-notifier/confirmed-turn.js +130 -0
- package/dist/features/codex-notifier/confirmed-turn.js.map +1 -0
- package/dist/features/codex-notifier/emitter.d.ts +13 -0
- package/dist/features/codex-notifier/emitter.d.ts.map +1 -0
- package/dist/features/codex-notifier/emitter.js +33 -0
- package/dist/features/codex-notifier/emitter.js.map +1 -0
- package/dist/features/codex-notifier/event-store.d.ts +29 -0
- package/dist/features/codex-notifier/event-store.d.ts.map +1 -0
- package/dist/features/codex-notifier/event-store.js +217 -0
- package/dist/features/codex-notifier/event-store.js.map +1 -0
- package/dist/features/codex-notifier/event.d.ts +46 -0
- package/dist/features/codex-notifier/event.d.ts.map +1 -0
- package/dist/features/codex-notifier/event.js +188 -0
- package/dist/features/codex-notifier/event.js.map +1 -0
- package/dist/features/codex-notifier/hook-cli.d.ts +23 -0
- package/dist/features/codex-notifier/hook-cli.d.ts.map +1 -0
- package/dist/features/codex-notifier/hook-cli.js +130 -0
- package/dist/features/codex-notifier/hook-cli.js.map +1 -0
- package/dist/features/codex-notifier/hook-installer.d.ts +19 -0
- package/dist/features/codex-notifier/hook-installer.d.ts.map +1 -0
- package/dist/features/codex-notifier/hook-installer.js +158 -0
- package/dist/features/codex-notifier/hook-installer.js.map +1 -0
- package/dist/features/codex-notifier/index.d.ts +21 -0
- package/dist/features/codex-notifier/index.d.ts.map +1 -0
- package/dist/features/codex-notifier/index.js +19 -0
- package/dist/features/codex-notifier/index.js.map +1 -0
- package/dist/features/codex-notifier/internal-turn.d.ts +5 -0
- package/dist/features/codex-notifier/internal-turn.d.ts.map +1 -0
- package/dist/features/codex-notifier/internal-turn.js +43 -0
- package/dist/features/codex-notifier/internal-turn.js.map +1 -0
- package/dist/features/codex-notifier/outbox-worker.d.ts +71 -0
- package/dist/features/codex-notifier/outbox-worker.d.ts.map +1 -0
- package/dist/features/codex-notifier/outbox-worker.js +290 -0
- package/dist/features/codex-notifier/outbox-worker.js.map +1 -0
- package/dist/features/codex-notifier/outbox.d.ts +25 -0
- package/dist/features/codex-notifier/outbox.d.ts.map +1 -0
- package/dist/features/codex-notifier/outbox.js +225 -0
- package/dist/features/codex-notifier/outbox.js.map +1 -0
- package/dist/features/codex-notifier/paths.d.ts +7 -0
- package/dist/features/codex-notifier/paths.d.ts.map +1 -0
- package/dist/features/codex-notifier/paths.js +20 -0
- package/dist/features/codex-notifier/paths.js.map +1 -0
- package/dist/features/codex-notifier/screen-lock.d.ts +12 -0
- package/dist/features/codex-notifier/screen-lock.d.ts.map +1 -0
- package/dist/features/codex-notifier/screen-lock.js +47 -0
- package/dist/features/codex-notifier/screen-lock.js.map +1 -0
- package/dist/features/codex-notifier/side-conversation-monitor.d.ts +102 -0
- package/dist/features/codex-notifier/side-conversation-monitor.d.ts.map +1 -0
- package/dist/features/codex-notifier/side-conversation-monitor.js +774 -0
- package/dist/features/codex-notifier/side-conversation-monitor.js.map +1 -0
- package/dist/features/codex-notifier/types.d.ts +42 -0
- package/dist/features/codex-notifier/types.d.ts.map +1 -0
- package/dist/features/codex-notifier/types.js +2 -0
- package/dist/features/codex-notifier/types.js.map +1 -0
- package/dist/features/codex-notifier/worker-lock.d.ts +8 -0
- package/dist/features/codex-notifier/worker-lock.d.ts.map +1 -0
- package/dist/features/codex-notifier/worker-lock.js +108 -0
- package/dist/features/codex-notifier/worker-lock.js.map +1 -0
- package/dist/global-config.d.ts +13 -0
- package/dist/global-config.d.ts.map +1 -1
- package/dist/global-config.js +30 -0
- package/dist/global-config.js.map +1 -1
- package/dist/im/lark/card-builder.js +2 -2
- package/dist/im/lark/card-builder.js.map +1 -1
- package/dist/im/lark/card-handler.d.ts +2 -0
- package/dist/im/lark/card-handler.d.ts.map +1 -1
- package/dist/im/lark/card-handler.js +165 -34
- package/dist/im/lark/card-handler.js.map +1 -1
- package/dist/im/lark/client.d.ts +62 -4
- package/dist/im/lark/client.d.ts.map +1 -1
- package/dist/im/lark/client.js +237 -29
- package/dist/im/lark/client.js.map +1 -1
- package/dist/im/lark/event-dispatcher.d.ts.map +1 -1
- package/dist/im/lark/event-dispatcher.js +20 -30
- package/dist/im/lark/event-dispatcher.js.map +1 -1
- package/dist/services/codex-app-threads.d.ts +47 -0
- package/dist/services/codex-app-threads.d.ts.map +1 -1
- package/dist/services/codex-app-threads.js +502 -10
- package/dist/services/codex-app-threads.js.map +1 -1
- package/dist/services/exact-chat-grant.d.ts +83 -0
- package/dist/services/exact-chat-grant.d.ts.map +1 -0
- package/dist/services/exact-chat-grant.js +249 -0
- package/dist/services/exact-chat-grant.js.map +1 -0
- package/dist/services/group-creator.d.ts +11 -0
- package/dist/services/group-creator.d.ts.map +1 -1
- package/dist/services/group-creator.js +18 -9
- package/dist/services/group-creator.js.map +1 -1
- package/dist/services/local-cli-opener.d.ts.map +1 -1
- package/dist/services/local-cli-opener.js +10 -5
- package/dist/services/local-cli-opener.js.map +1 -1
- package/dist/services/traex-user-input.d.ts +19 -0
- package/dist/services/traex-user-input.d.ts.map +1 -0
- package/dist/services/traex-user-input.js +57 -0
- package/dist/services/traex-user-input.js.map +1 -0
- package/dist/setup/open-platform-automation.d.ts +24 -3
- package/dist/setup/open-platform-automation.d.ts.map +1 -1
- package/dist/setup/open-platform-automation.js +45 -8
- package/dist/setup/open-platform-automation.js.map +1 -1
- package/dist/setup/verify-permissions.d.ts +18 -0
- package/dist/setup/verify-permissions.d.ts.map +1 -1
- package/dist/setup/verify-permissions.js +60 -0
- package/dist/setup/verify-permissions.js.map +1 -1
- package/dist/types.d.ts +70 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/stuck-detector.d.ts +45 -0
- package/dist/utils/stuck-detector.d.ts.map +1 -0
- package/dist/utils/stuck-detector.js +188 -0
- package/dist/utils/stuck-detector.js.map +1 -0
- package/dist/utils/stuck-key-guard.d.ts +75 -0
- package/dist/utils/stuck-key-guard.d.ts.map +1 -0
- package/dist/utils/stuck-key-guard.js +77 -0
- package/dist/utils/stuck-key-guard.js.map +1 -0
- package/dist/worker.js +705 -93
- package/dist/worker.js.map +1 -1
- package/package.json +1 -1
- package/dist/dashboard-web/chunks/bot-defaults-page-B5AY4B2J.js +0 -5
- package/dist/dashboard-web/chunks/sessions-page-2VECQ27T.js +0 -3
- package/dist/dashboard-web/chunks/settings-page-HMIUE2JA.js +0 -2
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
export const CODEX_NOTIFIER_PLUGIN_ID = 'codex-watch';
|
|
4
|
+
export const MAX_CODEX_NOTIFIER_EVENT_BYTES = 64 * 1024;
|
|
5
|
+
/** 飞书消息幂等键基于完整事件 ID,避免只截断长 ID 前缀造成碰撞。 */
|
|
6
|
+
export function codexNotifierMessageUuid(eventId) {
|
|
7
|
+
return `cw_${createHash('sha256').update(eventId).digest('hex').slice(0, 47)}`;
|
|
8
|
+
}
|
|
9
|
+
/** 插件事件边界的可分类校验错误,供 HTTP 层映射 4xx 响应。 */
|
|
10
|
+
export class CodexNotifierEventValidationError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
constructor(code, message, options) {
|
|
13
|
+
super(message, options);
|
|
14
|
+
this.code = code;
|
|
15
|
+
this.name = 'CodexNotifierEventValidationError';
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const requiredText = (max) => z.string().trim().min(1).max(max);
|
|
19
|
+
const CodexTaskCompletedEventSchema = z.object({
|
|
20
|
+
schemaVersion: z.literal(1),
|
|
21
|
+
eventId: requiredText(128),
|
|
22
|
+
type: z.literal('task.completed'),
|
|
23
|
+
source: z.literal('codex-desktop'),
|
|
24
|
+
clientSurface: z.enum(['codex-app', 'codex-cli']).optional(),
|
|
25
|
+
conversationKind: z.literal('side').optional(),
|
|
26
|
+
threadId: requiredText(256),
|
|
27
|
+
nativeTurnId: requiredText(256),
|
|
28
|
+
status: z.enum(['completed', 'failed', 'cancelled']),
|
|
29
|
+
title: requiredText(300).optional(),
|
|
30
|
+
cwd: requiredText(4096),
|
|
31
|
+
completedAt: z.string().datetime({ offset: true }),
|
|
32
|
+
finalPreview: requiredText(6500).optional(),
|
|
33
|
+
}).strict();
|
|
34
|
+
function plainObject(value) {
|
|
35
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
36
|
+
return false;
|
|
37
|
+
const prototype = Object.getPrototypeOf(value);
|
|
38
|
+
return prototype === Object.prototype || prototype === null;
|
|
39
|
+
}
|
|
40
|
+
function byteLengthOfObject(value) {
|
|
41
|
+
try {
|
|
42
|
+
return Buffer.byteLength(JSON.stringify(value), 'utf8');
|
|
43
|
+
}
|
|
44
|
+
catch (cause) {
|
|
45
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'event payload is not serializable', { cause });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function decodePayload(input, maxBytes) {
|
|
49
|
+
if (typeof input !== 'string' && !Buffer.isBuffer(input)) {
|
|
50
|
+
if (byteLengthOfObject(input) > maxBytes) {
|
|
51
|
+
throw new CodexNotifierEventValidationError('payload_too_large', `event payload exceeds ${maxBytes} bytes`);
|
|
52
|
+
}
|
|
53
|
+
return input;
|
|
54
|
+
}
|
|
55
|
+
const bytes = Buffer.isBuffer(input) ? input.byteLength : Buffer.byteLength(input, 'utf8');
|
|
56
|
+
if (bytes > maxBytes) {
|
|
57
|
+
throw new CodexNotifierEventValidationError('payload_too_large', `event payload exceeds ${maxBytes} bytes`);
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
return JSON.parse(Buffer.isBuffer(input) ? input.toString('utf8') : input);
|
|
61
|
+
}
|
|
62
|
+
catch (cause) {
|
|
63
|
+
throw new CodexNotifierEventValidationError('invalid_json', 'event payload is not valid JSON', { cause });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* 校验 Codex 完成事件。严格拒绝额外字段、非普通对象和超大输入,避免跨进程边界
|
|
68
|
+
* 成为原型污染或无界内存入口。
|
|
69
|
+
*/
|
|
70
|
+
export function parseCodexNotifierEvent(input, maxBytes = MAX_CODEX_NOTIFIER_EVENT_BYTES) {
|
|
71
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0) {
|
|
72
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'maxBytes must be a positive safe integer');
|
|
73
|
+
}
|
|
74
|
+
const decoded = decodePayload(input, maxBytes);
|
|
75
|
+
if (!plainObject(decoded)) {
|
|
76
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'event payload must be a plain object');
|
|
77
|
+
}
|
|
78
|
+
// 这些键即使只是普通 JSON 自有属性也没有业务含义,显式拒绝可让边界策略更清晰。
|
|
79
|
+
if (['__proto__', 'prototype', 'constructor'].some(key => Object.hasOwn(decoded, key))) {
|
|
80
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'event payload contains a forbidden property');
|
|
81
|
+
}
|
|
82
|
+
const parsed = CodexTaskCompletedEventSchema.safeParse(decoded);
|
|
83
|
+
if (!parsed.success) {
|
|
84
|
+
throw new CodexNotifierEventValidationError('invalid_event', `invalid codex completion event: ${parsed.error.issues.map(issue => issue.message).join('; ')}`, { cause: parsed.error });
|
|
85
|
+
}
|
|
86
|
+
const expectedId = codexNotifierEventId({
|
|
87
|
+
source: parsed.data.source,
|
|
88
|
+
threadId: parsed.data.threadId,
|
|
89
|
+
nativeTurnId: parsed.data.nativeTurnId,
|
|
90
|
+
status: parsed.data.status,
|
|
91
|
+
});
|
|
92
|
+
if (parsed.data.eventId !== expectedId) {
|
|
93
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'codex completion event id mismatch');
|
|
94
|
+
}
|
|
95
|
+
return parsed.data;
|
|
96
|
+
}
|
|
97
|
+
/** 兼容一个迁移周期的旧插件入口;内建链路直接调用 parseCodexNotifierEvent。 */
|
|
98
|
+
export function parseCodexNotifierPluginEvent(pluginId, input, maxBytes = MAX_CODEX_NOTIFIER_EVENT_BYTES) {
|
|
99
|
+
if (pluginId !== CODEX_NOTIFIER_PLUGIN_ID) {
|
|
100
|
+
throw new CodexNotifierEventValidationError('invalid_plugin', `unsupported plugin event source: ${pluginId}`);
|
|
101
|
+
}
|
|
102
|
+
return parseCodexNotifierEvent(input, maxBytes);
|
|
103
|
+
}
|
|
104
|
+
function requiredHookText(value, name) {
|
|
105
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
106
|
+
throw new CodexNotifierEventValidationError('invalid_event', `hook payload is missing ${name}`);
|
|
107
|
+
}
|
|
108
|
+
return value.trim();
|
|
109
|
+
}
|
|
110
|
+
function optionalSingleLine(value, maxLength) {
|
|
111
|
+
if (typeof value !== 'string')
|
|
112
|
+
return undefined;
|
|
113
|
+
const normalized = value.replace(/[\u0000-\u001f\u007f]/g, ' ').replace(/\s+/g, ' ').trim();
|
|
114
|
+
if (!normalized)
|
|
115
|
+
return undefined;
|
|
116
|
+
const chars = Array.from(normalized);
|
|
117
|
+
return chars.length > maxLength ? `${chars.slice(0, maxLength - 1).join('')}…` : normalized;
|
|
118
|
+
}
|
|
119
|
+
function optionalMultiline(value, maxLength) {
|
|
120
|
+
if (typeof value !== 'string')
|
|
121
|
+
return undefined;
|
|
122
|
+
const normalized = value
|
|
123
|
+
.replace(/\r\n?/g, '\n')
|
|
124
|
+
.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, ' ')
|
|
125
|
+
.replace(/\n{3,}/g, '\n\n')
|
|
126
|
+
.trim();
|
|
127
|
+
if (!normalized)
|
|
128
|
+
return undefined;
|
|
129
|
+
const chars = Array.from(normalized);
|
|
130
|
+
return chars.length > maxLength ? `${chars.slice(0, maxLength - 1).join('')}…` : normalized;
|
|
131
|
+
}
|
|
132
|
+
/** 事件 ID 只依赖 Codex 原生任务身份,Hook 重试不会生成第二条通知。 */
|
|
133
|
+
export function codexNotifierEventId(input) {
|
|
134
|
+
return createHash('sha256')
|
|
135
|
+
.update(JSON.stringify([input.source, input.threadId, input.nativeTurnId, input.status]))
|
|
136
|
+
.digest('hex');
|
|
137
|
+
}
|
|
138
|
+
/** 把 Codex Stop Hook 的稳定字段转换成内建完成事件。 */
|
|
139
|
+
export function createCodexNotifierEvent(payload, options = {}) {
|
|
140
|
+
if (payload.hook_event_name !== 'Stop') {
|
|
141
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'unsupported Codex hook event');
|
|
142
|
+
}
|
|
143
|
+
const threadId = requiredHookText(payload.session_id, 'session_id');
|
|
144
|
+
const nativeTurnId = requiredHookText(payload.turn_id, 'turn_id');
|
|
145
|
+
const cwd = requiredHookText(payload.cwd, 'cwd');
|
|
146
|
+
return createCodexNotifierCompletionEvent({
|
|
147
|
+
threadId,
|
|
148
|
+
nativeTurnId,
|
|
149
|
+
status: 'completed',
|
|
150
|
+
cwd,
|
|
151
|
+
...options,
|
|
152
|
+
finalPreview: options.finalPreview
|
|
153
|
+
?? (typeof payload.last_assistant_message === 'string'
|
|
154
|
+
? payload.last_assistant_message
|
|
155
|
+
: undefined),
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
/** 从 Hook 或 Codex App IPC 的终态构造同一种可靠完成事件。 */
|
|
159
|
+
export function createCodexNotifierCompletionEvent(input) {
|
|
160
|
+
const threadId = requiredHookText(input.threadId, 'threadId');
|
|
161
|
+
const nativeTurnId = requiredHookText(input.nativeTurnId, 'nativeTurnId');
|
|
162
|
+
const cwd = requiredHookText(input.cwd, 'cwd');
|
|
163
|
+
const completedAt = input.completedAt ?? new Date().toISOString();
|
|
164
|
+
if (!Number.isFinite(Date.parse(completedAt))) {
|
|
165
|
+
throw new CodexNotifierEventValidationError('invalid_event', 'completedAt must be an ISO timestamp');
|
|
166
|
+
}
|
|
167
|
+
const identity = {
|
|
168
|
+
source: 'codex-desktop',
|
|
169
|
+
threadId,
|
|
170
|
+
nativeTurnId,
|
|
171
|
+
status: input.status,
|
|
172
|
+
};
|
|
173
|
+
const title = optionalSingleLine(input.title, 300);
|
|
174
|
+
const finalPreview = optionalMultiline(input.finalPreview, 6500);
|
|
175
|
+
return parseCodexNotifierEvent({
|
|
176
|
+
schemaVersion: 1,
|
|
177
|
+
eventId: codexNotifierEventId(identity),
|
|
178
|
+
type: 'task.completed',
|
|
179
|
+
...identity,
|
|
180
|
+
...(input.clientSurface ? { clientSurface: input.clientSurface } : {}),
|
|
181
|
+
...(input.conversationKind ? { conversationKind: input.conversationKind } : {}),
|
|
182
|
+
cwd,
|
|
183
|
+
completedAt,
|
|
184
|
+
...(title ? { title } : {}),
|
|
185
|
+
...(finalPreview ? { finalPreview } : {}),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../../src/features/codex-notifier/event.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Readable } from 'node:stream';
|
|
2
|
+
import { type CodexTurnContext } from './codex-context.js';
|
|
3
|
+
import { type ResolvedCodexNotifierConfig } from './config.js';
|
|
4
|
+
import { enqueueCodexNotifierEvent } from './outbox.js';
|
|
5
|
+
import { type ScreenLockState } from './screen-lock.js';
|
|
6
|
+
import { confirmCodexNotifierTurn, readConfirmedCodexNotifierTurn, removeConfirmedCodexNotifierTurn } from './confirmed-turn.js';
|
|
7
|
+
export type CodexNotifierHookOutcome = 'enqueued' | 'disabled' | 'misconfigured' | 'managed' | 'tracked' | 'subagent' | 'internal' | 'unsupported' | 'screen_unlocked' | 'platform_unsupported';
|
|
8
|
+
export interface CodexNotifierHookDeps {
|
|
9
|
+
env?: NodeJS.ProcessEnv;
|
|
10
|
+
dataDir?: string;
|
|
11
|
+
config?: ResolvedCodexNotifierConfig;
|
|
12
|
+
lockState?: ScreenLockState;
|
|
13
|
+
readContext?: (transcriptPath: unknown, turnId: unknown, sessionId: unknown) => CodexTurnContext;
|
|
14
|
+
enqueue?: typeof enqueueCodexNotifierEvent;
|
|
15
|
+
confirmTurn?: typeof confirmCodexNotifierTurn;
|
|
16
|
+
readConfirmedTurn?: typeof readConfirmedCodexNotifierTurn;
|
|
17
|
+
removeConfirmedTurn?: typeof removeConfirmedCodexNotifierTurn;
|
|
18
|
+
}
|
|
19
|
+
/** 处理一个 Codex 通知 Hook payload;所有跳过原因都显式返回,便于 Dashboard/测试诊断。 */
|
|
20
|
+
export declare function processCodexNotifierHookPayload(payload: Record<string, unknown>, deps?: CodexNotifierHookDeps): CodexNotifierHookOutcome;
|
|
21
|
+
/** CLI Hook 不得阻塞 Codex 流程;失败只在 DEBUG 下输出诊断并返回。 */
|
|
22
|
+
export declare function runCodexNotifierHookCli(stream?: Readable, deps?: CodexNotifierHookDeps): Promise<CodexNotifierHookOutcome | 'error'>;
|
|
23
|
+
//# sourceMappingURL=hook-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-cli.d.ts","sourceRoot":"","sources":["../../../src/features/codex-notifier/hook-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAA8B,KAAK,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAC3F,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAA8C,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpG,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,gCAAgC,EAEjC,MAAM,qBAAqB,CAAC;AAK7B,MAAM,MAAM,wBAAwB,GAChC,UAAU,GACV,UAAU,GACV,eAAe,GACf,SAAS,GACT,SAAS,GACT,UAAU,GACV,UAAU,GACV,aAAa,GACb,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,2BAA2B,CAAC;IACrC,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,WAAW,CAAC,EAAE,CAAC,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,KAAK,gBAAgB,CAAC;IACjG,OAAO,CAAC,EAAE,OAAO,yBAAyB,CAAC;IAC3C,WAAW,CAAC,EAAE,OAAO,wBAAwB,CAAC;IAC9C,iBAAiB,CAAC,EAAE,OAAO,8BAA8B,CAAC;IAC1D,mBAAmB,CAAC,EAAE,OAAO,gCAAgC,CAAC;CAC/D;AA6BD,gEAAgE;AAChE,wBAAgB,+BAA+B,CAC7C,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,GAAE,qBAA0B,GAC/B,wBAAwB,CA+E1B;AAcD,kDAAkD;AAClD,wBAAsB,uBAAuB,CAC3C,MAAM,GAAE,QAAwB,EAChC,IAAI,GAAE,qBAA0B,GAC/B,OAAO,CAAC,wBAAwB,GAAG,OAAO,CAAC,CAS7C"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { resolveBotmuxDataDir } from '../../core/data-dir.js';
|
|
2
|
+
import { createCodexNotifierEvent } from './event.js';
|
|
3
|
+
import { readCodexTurnContext } from './codex-context.js';
|
|
4
|
+
import { resolveCodexNotifierConfig } from './config.js';
|
|
5
|
+
import { enqueueCodexNotifierEvent } from './outbox.js';
|
|
6
|
+
import { detectScreenLock, shouldNotifyForLockState } from './screen-lock.js';
|
|
7
|
+
import { confirmCodexNotifierTurn, readConfirmedCodexNotifierTurn, removeConfirmedCodexNotifierTurn, } from './confirmed-turn.js';
|
|
8
|
+
import { isInternalCodexPrompt } from './internal-turn.js';
|
|
9
|
+
const MAX_STDIN_BYTES = 1024 * 1024;
|
|
10
|
+
function isCodexAmbientSuggestionTurn(context, lastAssistantMessage) {
|
|
11
|
+
const prompt = context.prompt?.toLowerCase();
|
|
12
|
+
if (prompt?.includes('generate 0 to 3 hyperpersonalized suggestions for what this user can do with codex')
|
|
13
|
+
|| prompt?.includes('upholding safety and compliance standards for codex ambient suggestions')) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
// Codex 的临时推荐线程当前不落 transcript,只能从其固定 JSON 结果识别。
|
|
17
|
+
// 已提取到真实用户问题时不能只凭回复形状过滤,避免误伤用户主动请求。
|
|
18
|
+
if (context.prompt || typeof lastAssistantMessage !== 'string')
|
|
19
|
+
return false;
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(lastAssistantMessage);
|
|
22
|
+
return parsed !== null
|
|
23
|
+
&& typeof parsed === 'object'
|
|
24
|
+
&& !Array.isArray(parsed)
|
|
25
|
+
&& Object.keys(parsed).length === 1
|
|
26
|
+
&& Array.isArray(parsed.suggestions);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** 处理一个 Codex 通知 Hook payload;所有跳过原因都显式返回,便于 Dashboard/测试诊断。 */
|
|
33
|
+
export function processCodexNotifierHookPayload(payload, deps = {}) {
|
|
34
|
+
const env = deps.env ?? process.env;
|
|
35
|
+
if (env.BOTMUX_SESSION_ID?.trim())
|
|
36
|
+
return 'managed';
|
|
37
|
+
const eventName = payload.hook_event_name;
|
|
38
|
+
const dataDir = deps.dataDir ?? resolveBotmuxDataDir();
|
|
39
|
+
const removeConfirmedTurn = deps.removeConfirmedTurn ?? removeConfirmedCodexNotifierTurn;
|
|
40
|
+
const discardConfirmedTurn = () => {
|
|
41
|
+
if (eventName === 'Stop') {
|
|
42
|
+
removeConfirmedTurn(dataDir, payload.session_id, payload.turn_id);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
const config = deps.config ?? resolveCodexNotifierConfig();
|
|
46
|
+
if (!config.enabled) {
|
|
47
|
+
discardConfirmedTurn();
|
|
48
|
+
return 'disabled';
|
|
49
|
+
}
|
|
50
|
+
if (!config.targetBotAppId) {
|
|
51
|
+
discardConfirmedTurn();
|
|
52
|
+
return 'misconfigured';
|
|
53
|
+
}
|
|
54
|
+
if (typeof payload.agent_id === 'string'
|
|
55
|
+
&& payload.agent_id.trim()
|
|
56
|
+
&& payload.agent_id !== payload.session_id) {
|
|
57
|
+
discardConfirmedTurn();
|
|
58
|
+
return 'subagent';
|
|
59
|
+
}
|
|
60
|
+
const readContext = deps.readContext ?? readCodexTurnContext;
|
|
61
|
+
if (eventName === 'UserPromptSubmit') {
|
|
62
|
+
const context = readContext(payload.transcript_path, payload.turn_id, payload.session_id);
|
|
63
|
+
const prompt = typeof payload.prompt === 'string' ? payload.prompt : context.prompt;
|
|
64
|
+
if (context.internal || isInternalCodexPrompt(prompt))
|
|
65
|
+
return 'internal';
|
|
66
|
+
const confirmTurn = deps.confirmTurn ?? confirmCodexNotifierTurn;
|
|
67
|
+
return confirmTurn(dataDir, payload.session_id, payload.turn_id, prompt) ? 'tracked' : 'internal';
|
|
68
|
+
}
|
|
69
|
+
if (eventName !== 'Stop')
|
|
70
|
+
return 'unsupported';
|
|
71
|
+
const lockState = deps.lockState ?? detectScreenLock();
|
|
72
|
+
if (lockState === 'unsupported' && config.notifyWhen === 'locked_only') {
|
|
73
|
+
discardConfirmedTurn();
|
|
74
|
+
return 'platform_unsupported';
|
|
75
|
+
}
|
|
76
|
+
if (!shouldNotifyForLockState(config.notifyWhen, lockState)) {
|
|
77
|
+
discardConfirmedTurn();
|
|
78
|
+
return 'screen_unlocked';
|
|
79
|
+
}
|
|
80
|
+
const context = readContext(payload.transcript_path, payload.turn_id, payload.session_id);
|
|
81
|
+
const readConfirmedTurn = deps.readConfirmedTurn ?? readConfirmedCodexNotifierTurn;
|
|
82
|
+
const confirmed = readConfirmedTurn(dataDir, payload.session_id, payload.turn_id);
|
|
83
|
+
const prompt = context.prompt ?? confirmed?.prompt;
|
|
84
|
+
if (context.internal
|
|
85
|
+
|| isInternalCodexPrompt(prompt)
|
|
86
|
+
|| isCodexAmbientSuggestionTurn(context, payload.last_assistant_message)
|
|
87
|
+
|| !prompt) {
|
|
88
|
+
discardConfirmedTurn();
|
|
89
|
+
return 'internal';
|
|
90
|
+
}
|
|
91
|
+
const event = createCodexNotifierEvent(payload, {
|
|
92
|
+
clientSurface: context.clientSurface,
|
|
93
|
+
// title 只保存用户问题;卡片层统一拼接项目名,避免 project 重复。
|
|
94
|
+
title: prompt,
|
|
95
|
+
finalPreview: typeof payload.last_assistant_message === 'string' && payload.last_assistant_message.trim()
|
|
96
|
+
? payload.last_assistant_message
|
|
97
|
+
: context.lastAssistantMessage,
|
|
98
|
+
});
|
|
99
|
+
const enqueue = deps.enqueue ?? enqueueCodexNotifierEvent;
|
|
100
|
+
enqueue(dataDir, config.targetBotAppId, event);
|
|
101
|
+
discardConfirmedTurn();
|
|
102
|
+
return 'enqueued';
|
|
103
|
+
}
|
|
104
|
+
async function readStdinJson(stream) {
|
|
105
|
+
let text = '';
|
|
106
|
+
for await (const chunk of stream) {
|
|
107
|
+
text += chunk.toString();
|
|
108
|
+
if (Buffer.byteLength(text) > MAX_STDIN_BYTES)
|
|
109
|
+
throw new Error('hook_payload_too_large');
|
|
110
|
+
}
|
|
111
|
+
if (!text.trim())
|
|
112
|
+
throw new Error('hook_payload_empty');
|
|
113
|
+
const parsed = JSON.parse(text);
|
|
114
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
115
|
+
throw new Error('hook_payload_invalid');
|
|
116
|
+
return parsed;
|
|
117
|
+
}
|
|
118
|
+
/** CLI Hook 不得阻塞 Codex 流程;失败只在 DEBUG 下输出诊断并返回。 */
|
|
119
|
+
export async function runCodexNotifierHookCli(stream = process.stdin, deps = {}) {
|
|
120
|
+
try {
|
|
121
|
+
return processCodexNotifierHookPayload(await readStdinJson(stream), deps);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (process.env.DEBUG === '1') {
|
|
125
|
+
process.stderr.write(`[codex-notifier] hook failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
126
|
+
}
|
|
127
|
+
return 'error';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=hook-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-cli.js","sourceRoot":"","sources":["../../../src/features/codex-notifier/hook-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare function codexHooksPath(env?: NodeJS.ProcessEnv, userHome?: string): string;
|
|
2
|
+
export declare function botmuxCodexNotifierHookCommand(userHome?: string, nodePath?: string, platform?: NodeJS.Platform): string;
|
|
3
|
+
/** Stop 与 UserPromptSubmit 都存在时才算完整安装,避免失去真实用户 turn 的强来源证明。 */
|
|
4
|
+
export declare function isCodexNotifierHookInstalled(path?: string): boolean;
|
|
5
|
+
/**
|
|
6
|
+
* 幂等安装 UserPromptSubmit + Stop Hook。前者确认用户 turn,后者据此过滤内部 turn。
|
|
7
|
+
* 会替换旧 checkout/旧 Node 路径,同时保留 Flux 和其他 Hook。
|
|
8
|
+
* 迁移期 legacy-stop 只保留 Stop,避免旧插件收到不认识的 UserPromptSubmit。
|
|
9
|
+
*/
|
|
10
|
+
export declare function installCodexNotifierHook(options?: {
|
|
11
|
+
path?: string;
|
|
12
|
+
command?: string;
|
|
13
|
+
mode?: 'full' | 'legacy-stop';
|
|
14
|
+
}): {
|
|
15
|
+
path: string;
|
|
16
|
+
command: string;
|
|
17
|
+
changed: boolean;
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=hook-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-installer.d.ts","sourceRoot":"","sources":["../../../src/features/codex-notifier/hook-installer.ts"],"names":[],"mappings":"AAUA,wBAAgB,cAAc,CAAC,GAAG,oBAAc,EAAE,QAAQ,SAAY,GAAG,MAAM,CAK9E;AAED,wBAAgB,8BAA8B,CAC5C,QAAQ,SAAY,EACpB,QAAQ,SAAmB,EAC3B,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAC3C,MAAM,CAOR;AAyDD,+DAA+D;AAC/D,wBAAgB,4BAA4B,CAAC,IAAI,SAAmB,GAAG,OAAO,CAQ7E;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,GAAE;IAChD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;CAC1B,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CA8D3D"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { accessSync, constants, existsSync, mkdirSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { homedir } from 'node:os';
|
|
3
|
+
import { dirname, join, win32 } from 'node:path';
|
|
4
|
+
import { atomicWriteFileSync } from '../../utils/atomic-write.js';
|
|
5
|
+
function shellWord(value) {
|
|
6
|
+
if (/^[A-Za-z0-9_./:@%+=,-]+$/.test(value))
|
|
7
|
+
return value;
|
|
8
|
+
return `'${value.replaceAll("'", `'"'"'`)}'`;
|
|
9
|
+
}
|
|
10
|
+
export function codexHooksPath(env = process.env, userHome = homedir()) {
|
|
11
|
+
const codexHome = typeof env.CODEX_HOME === 'string' && env.CODEX_HOME.trim()
|
|
12
|
+
? env.CODEX_HOME.trim()
|
|
13
|
+
: join(userHome, '.codex');
|
|
14
|
+
return join(codexHome, 'hooks.json');
|
|
15
|
+
}
|
|
16
|
+
export function botmuxCodexNotifierHookCommand(userHome = homedir(), nodePath = process.execPath, platform = process.platform) {
|
|
17
|
+
if (platform === 'win32') {
|
|
18
|
+
const shim = win32.join(userHome, '.botmux', 'bin', 'botmux.cmd');
|
|
19
|
+
return `"${shim.replaceAll('"', '""')}" codex-watch-hook`;
|
|
20
|
+
}
|
|
21
|
+
const path = [dirname(nodePath), '/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin'].join(':');
|
|
22
|
+
return `/usr/bin/env PATH=${shellWord(path)} ${shellWord(join(userHome, '.botmux', 'bin', 'botmux'))} codex-watch-hook`;
|
|
23
|
+
}
|
|
24
|
+
function plainObject(value) {
|
|
25
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
26
|
+
}
|
|
27
|
+
function botmuxShimFromCommand(value) {
|
|
28
|
+
if (typeof value !== 'string')
|
|
29
|
+
return undefined;
|
|
30
|
+
const match = value.match(/(?:^|\s)(?:'([^']*[\\/]\.botmux[\\/]bin[\\/]botmux(?:\.cmd)?)'|"([^"]*[\\/]\.botmux[\\/]bin[\\/]botmux(?:\.cmd)?)"|([^\s'"]*[\\/]\.botmux[\\/]bin[\\/]botmux(?:\.cmd)?))\s+codex-watch-hook(?:\s|$)/i);
|
|
31
|
+
return match?.[1] ?? match?.[2] ?? match?.[3];
|
|
32
|
+
}
|
|
33
|
+
function isBotmuxCodexNotifierCommand(value) {
|
|
34
|
+
return botmuxShimFromCommand(value) !== undefined;
|
|
35
|
+
}
|
|
36
|
+
function isRunnableBotmuxCodexNotifierCommand(value) {
|
|
37
|
+
const shim = botmuxShimFromCommand(value);
|
|
38
|
+
if (!shim)
|
|
39
|
+
return false;
|
|
40
|
+
try {
|
|
41
|
+
accessSync(shim, constants.X_OK);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
if (typeof value !== 'string')
|
|
47
|
+
return false;
|
|
48
|
+
const pathMatch = value.match(/(?:^|\s)PATH=(?:'([^']*)'|"([^"]*)"|([^\s]+))/);
|
|
49
|
+
if (!pathMatch)
|
|
50
|
+
return true;
|
|
51
|
+
const path = pathMatch[1] ?? pathMatch[2] ?? pathMatch[3] ?? '';
|
|
52
|
+
return path.split(':').some(dir => {
|
|
53
|
+
if (!dir)
|
|
54
|
+
return false;
|
|
55
|
+
try {
|
|
56
|
+
accessSync(join(dir, 'node'), constants.X_OK);
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
function readHooksRoot(path) {
|
|
65
|
+
if (!existsSync(path))
|
|
66
|
+
return {};
|
|
67
|
+
const root = JSON.parse(readFileSync(path, 'utf8'));
|
|
68
|
+
if (!plainObject(root))
|
|
69
|
+
throw new Error('hooks_config_invalid_root');
|
|
70
|
+
return root;
|
|
71
|
+
}
|
|
72
|
+
const CODEX_NOTIFIER_HOOK_EVENTS = ['Stop', 'UserPromptSubmit'];
|
|
73
|
+
function eventHasRunnableHook(root, eventName) {
|
|
74
|
+
const entries = root.hooks?.[eventName];
|
|
75
|
+
return Array.isArray(entries) && entries.some((entry) => Array.isArray(entry?.hooks)
|
|
76
|
+
&& entry.hooks.some((hook) => hook?.type === 'command'
|
|
77
|
+
&& isRunnableBotmuxCodexNotifierCommand(hook.command)));
|
|
78
|
+
}
|
|
79
|
+
/** Stop 与 UserPromptSubmit 都存在时才算完整安装,避免失去真实用户 turn 的强来源证明。 */
|
|
80
|
+
export function isCodexNotifierHookInstalled(path = codexHooksPath()) {
|
|
81
|
+
try {
|
|
82
|
+
const root = readHooksRoot(path);
|
|
83
|
+
if (!plainObject(root.hooks))
|
|
84
|
+
return false;
|
|
85
|
+
return CODEX_NOTIFIER_HOOK_EVENTS.every(eventName => eventHasRunnableHook(root, eventName));
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 幂等安装 UserPromptSubmit + Stop Hook。前者确认用户 turn,后者据此过滤内部 turn。
|
|
93
|
+
* 会替换旧 checkout/旧 Node 路径,同时保留 Flux 和其他 Hook。
|
|
94
|
+
* 迁移期 legacy-stop 只保留 Stop,避免旧插件收到不认识的 UserPromptSubmit。
|
|
95
|
+
*/
|
|
96
|
+
export function installCodexNotifierHook(options = {}) {
|
|
97
|
+
const path = options.path ?? codexHooksPath();
|
|
98
|
+
const requestedCommand = options.command ?? botmuxCodexNotifierHookCommand();
|
|
99
|
+
const mode = options.mode ?? 'full';
|
|
100
|
+
const root = readHooksRoot(path);
|
|
101
|
+
const original = JSON.stringify(root);
|
|
102
|
+
if (!Object.hasOwn(root, 'hooks'))
|
|
103
|
+
root.hooks = {};
|
|
104
|
+
if (!plainObject(root.hooks))
|
|
105
|
+
throw new Error('hooks_config_invalid_hooks');
|
|
106
|
+
let existingCommand;
|
|
107
|
+
for (const eventName of CODEX_NOTIFIER_HOOK_EVENTS) {
|
|
108
|
+
const entries = root.hooks[eventName];
|
|
109
|
+
if (entries !== undefined && !Array.isArray(entries)) {
|
|
110
|
+
throw new Error(`hooks_config_invalid_${eventName.toLowerCase()}`);
|
|
111
|
+
}
|
|
112
|
+
for (const entry of entries ?? []) {
|
|
113
|
+
for (const hook of Array.isArray(entry?.hooks) ? entry.hooks : []) {
|
|
114
|
+
if (!existingCommand
|
|
115
|
+
&& hook?.type === 'command'
|
|
116
|
+
&& isBotmuxCodexNotifierCommand(hook.command)
|
|
117
|
+
&& isRunnableBotmuxCodexNotifierCommand(hook.command)) {
|
|
118
|
+
existingCommand = hook.command;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// 已信任的旧命令字节保持不变;只去重和收敛分组。新安装使用稳定 PATH。
|
|
124
|
+
const command = existingCommand ?? requestedCommand;
|
|
125
|
+
for (const eventName of CODEX_NOTIFIER_HOOK_EVENTS) {
|
|
126
|
+
const nextEntries = [];
|
|
127
|
+
for (const entry of root.hooks[eventName] ?? []) {
|
|
128
|
+
if (!plainObject(entry) || !Array.isArray(entry.hooks)) {
|
|
129
|
+
nextEntries.push(entry);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const remaining = entry.hooks.filter((hook) => !(hook?.type === 'command' && isBotmuxCodexNotifierCommand(hook.command)));
|
|
133
|
+
if (remaining.length > 0)
|
|
134
|
+
nextEntries.push({ ...entry, hooks: remaining });
|
|
135
|
+
}
|
|
136
|
+
if (mode === 'full' || eventName === 'Stop') {
|
|
137
|
+
nextEntries.push({
|
|
138
|
+
matcher: '*',
|
|
139
|
+
hooks: [{ type: 'command', command, timeout: 10 }],
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (nextEntries.length > 0)
|
|
143
|
+
root.hooks[eventName] = nextEntries;
|
|
144
|
+
else
|
|
145
|
+
delete root.hooks[eventName];
|
|
146
|
+
}
|
|
147
|
+
const changed = JSON.stringify(root) !== original;
|
|
148
|
+
if (changed) {
|
|
149
|
+
mkdirSync(dirname(path), { recursive: true, mode: 0o700 });
|
|
150
|
+
atomicWriteFileSync(path, `${JSON.stringify(root, null, 2)}\n`, {
|
|
151
|
+
mode: 0o600,
|
|
152
|
+
durable: true,
|
|
153
|
+
followTargetSymlink: false,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return { path, command, changed };
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=hook-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hook-installer.js","sourceRoot":"","sources":["../../../src/features/codex-notifier/hook-installer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { CODEX_NOTIFIER_PLUGIN_ID, MAX_CODEX_NOTIFIER_EVENT_BYTES, CodexNotifierEventValidationError, codexNotifierEventId, codexNotifierMessageUuid, createCodexNotifierCompletionEvent, createCodexNotifierEvent, parseCodexNotifierEvent, parseCodexNotifierPluginEvent, } from './event.js';
|
|
2
|
+
export { CodexNotifierEventStore, DEFAULT_MAX_CODEX_NOTIFIER_EVENTS, DEFAULT_MAX_CODEX_NOTIFIER_RECEIPTS, } from './event-store.js';
|
|
3
|
+
export type { CodexNotifierDeliveryUpdate, RecordCodexNotifierEventResult, } from './event-store.js';
|
|
4
|
+
export { buildCodexCompletionCard, buildCodexNotifierResultCard, } from './card.js';
|
|
5
|
+
export { createCodexNotifierCardActionHandler, type CodexNotifierCardActionDeps, } from './card-action.js';
|
|
6
|
+
export { canOpenCodexAppThread, isCodexAppThreadId, openCodexAppThread, type CodexAppOpenResult, type CodexAppOpenRunner, } from './app-opener.js';
|
|
7
|
+
export { startCodexNotifierAdoptionSession } from './adoption.js';
|
|
8
|
+
export { resolveCodexNotifierConfig, type ResolvedCodexNotifierConfig, } from './config.js';
|
|
9
|
+
export { parseCodexTurnContext, readCodexTurnContext, type CodexTurnContext, } from './codex-context.js';
|
|
10
|
+
export { CODEX_NOTIFIER_CONFIRMED_TURN_TTL_MS, MAX_CODEX_NOTIFIER_CONFIRMED_TURNS, confirmCodexNotifierTurn, pruneConfirmedCodexNotifierTurns, readConfirmedCodexNotifierTurn, removeConfirmedCodexNotifierTurn, type ConfirmedCodexTurn, } from './confirmed-turn.js';
|
|
11
|
+
export { isInternalCodexPrompt, isInternalCodexSessionMeta, } from './internal-turn.js';
|
|
12
|
+
export { detectScreenLock, parseMacScreenLock, shouldNotifyForLockState, type ScreenLockState, } from './screen-lock.js';
|
|
13
|
+
export { botmuxCodexNotifierHookCommand, codexHooksPath, installCodexNotifierHook, isCodexNotifierHookInstalled, } from './hook-installer.js';
|
|
14
|
+
export { processCodexNotifierHookPayload, runCodexNotifierHookCli, type CodexNotifierHookDeps, type CodexNotifierHookOutcome, } from './hook-cli.js';
|
|
15
|
+
export { enqueueCodexNotifierEvent, listCodexNotifierOutbox, materializeCodexNotifierOutboxEvent, parseCodexNotifierOutboxItem, quarantineCodexNotifierOutboxItem, readCodexNotifierOutboxItem, removeCodexNotifierOutboxItem, type CodexNotifierOutboxItem, } from './outbox.js';
|
|
16
|
+
export { CODEX_NOTIFIER_WORKER_STALE_MS, CodexNotifierOutboxWorker, isCodexNotifierWorkerStateFresh, readCodexNotifierWorkerState, runCodexNotifierWorkerSupervisor, type CodexNotifierDisposition, type CodexNotifierOutboxWorkerOptions, type CodexNotifierWorkerSupervisorOptions, type CodexNotifierWorkerState, } from './outbox-worker.js';
|
|
17
|
+
export { acquireCodexNotifierWorkerLease, type CodexNotifierWorkerLease, } from './worker-lock.js';
|
|
18
|
+
export { applyCodexConversationPatches, CodexSideConversationMonitor, CodexSideConversationTracker, createSideConversationCompletionEvent, listRecentCodexVisualizationThreads, runCodexSideConversationMonitor, type CodexConversationPatch, type CodexSideConversationMonitorOptions, type CodexVisualizationThread, } from './side-conversation-monitor.js';
|
|
19
|
+
export { emitCodexNotifierOutboxItem } from './emitter.js';
|
|
20
|
+
export type { CodexClientSurface, CodexConversationKind, CodexNotifierDelivery, CodexNotifierDeliveryStatus, CodexNotifierEventRecord, CodexTaskCompletedEvent, CodexTaskSource, CodexTaskStatus, } from './types.js';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/codex-notifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,iCAAiC,EACjC,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,EAClC,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,iCAAiC,EACjC,mCAAmC,GACpC,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,2BAA2B,EAC3B,8BAA8B,GAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oCAAoC,EACpC,KAAK,2BAA2B,GACjC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,GACxB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EACL,0BAA0B,EAC1B,KAAK,2BAA2B,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,EACpB,KAAK,gBAAgB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oCAAoC,EACpC,kCAAkC,EAClC,wBAAwB,EACxB,gCAAgC,EAChC,8BAA8B,EAC9B,gCAAgC,EAChC,KAAK,kBAAkB,GACxB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,EACxB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mCAAmC,EACnC,4BAA4B,EAC5B,iCAAiC,EACjC,2BAA2B,EAC3B,6BAA6B,EAC7B,KAAK,uBAAuB,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,EAC5B,gCAAgC,EAChC,KAAK,wBAAwB,EAC7B,KAAK,gCAAgC,EACrC,KAAK,oCAAoC,EACzC,KAAK,wBAAwB,GAC9B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,+BAA+B,EAC/B,KAAK,wBAAwB,GAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,EAC5B,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,EAC/B,KAAK,sBAAsB,EAC3B,KAAK,mCAAmC,EACxC,KAAK,wBAAwB,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAC3D,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,eAAe,EACf,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { CODEX_NOTIFIER_PLUGIN_ID, MAX_CODEX_NOTIFIER_EVENT_BYTES, CodexNotifierEventValidationError, codexNotifierEventId, codexNotifierMessageUuid, createCodexNotifierCompletionEvent, createCodexNotifierEvent, parseCodexNotifierEvent, parseCodexNotifierPluginEvent, } from './event.js';
|
|
2
|
+
export { CodexNotifierEventStore, DEFAULT_MAX_CODEX_NOTIFIER_EVENTS, DEFAULT_MAX_CODEX_NOTIFIER_RECEIPTS, } from './event-store.js';
|
|
3
|
+
export { buildCodexCompletionCard, buildCodexNotifierResultCard, } from './card.js';
|
|
4
|
+
export { createCodexNotifierCardActionHandler, } from './card-action.js';
|
|
5
|
+
export { canOpenCodexAppThread, isCodexAppThreadId, openCodexAppThread, } from './app-opener.js';
|
|
6
|
+
export { startCodexNotifierAdoptionSession } from './adoption.js';
|
|
7
|
+
export { resolveCodexNotifierConfig, } from './config.js';
|
|
8
|
+
export { parseCodexTurnContext, readCodexTurnContext, } from './codex-context.js';
|
|
9
|
+
export { CODEX_NOTIFIER_CONFIRMED_TURN_TTL_MS, MAX_CODEX_NOTIFIER_CONFIRMED_TURNS, confirmCodexNotifierTurn, pruneConfirmedCodexNotifierTurns, readConfirmedCodexNotifierTurn, removeConfirmedCodexNotifierTurn, } from './confirmed-turn.js';
|
|
10
|
+
export { isInternalCodexPrompt, isInternalCodexSessionMeta, } from './internal-turn.js';
|
|
11
|
+
export { detectScreenLock, parseMacScreenLock, shouldNotifyForLockState, } from './screen-lock.js';
|
|
12
|
+
export { botmuxCodexNotifierHookCommand, codexHooksPath, installCodexNotifierHook, isCodexNotifierHookInstalled, } from './hook-installer.js';
|
|
13
|
+
export { processCodexNotifierHookPayload, runCodexNotifierHookCli, } from './hook-cli.js';
|
|
14
|
+
export { enqueueCodexNotifierEvent, listCodexNotifierOutbox, materializeCodexNotifierOutboxEvent, parseCodexNotifierOutboxItem, quarantineCodexNotifierOutboxItem, readCodexNotifierOutboxItem, removeCodexNotifierOutboxItem, } from './outbox.js';
|
|
15
|
+
export { CODEX_NOTIFIER_WORKER_STALE_MS, CodexNotifierOutboxWorker, isCodexNotifierWorkerStateFresh, readCodexNotifierWorkerState, runCodexNotifierWorkerSupervisor, } from './outbox-worker.js';
|
|
16
|
+
export { acquireCodexNotifierWorkerLease, } from './worker-lock.js';
|
|
17
|
+
export { applyCodexConversationPatches, CodexSideConversationMonitor, CodexSideConversationTracker, createSideConversationCompletionEvent, listRecentCodexVisualizationThreads, runCodexSideConversationMonitor, } from './side-conversation-monitor.js';
|
|
18
|
+
export { emitCodexNotifierOutboxItem } from './emitter.js';
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/codex-notifier/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,8BAA8B,EAC9B,iCAAiC,EACjC,oBAAoB,EACpB,wBAAwB,EACxB,kCAAkC,EAClC,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,uBAAuB,EACvB,iCAAiC,EACjC,mCAAmC,GACpC,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EACL,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,oCAAoC,GAErC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,GAGnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,iCAAiC,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EACL,0BAA0B,GAE3B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,qBAAqB,EACrB,oBAAoB,GAErB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oCAAoC,EACpC,kCAAkC,EAClC,wBAAwB,EACxB,gCAAgC,EAChC,8BAA8B,EAC9B,gCAAgC,GAEjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,qBAAqB,EACrB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,wBAAwB,GAEzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,8BAA8B,EAC9B,cAAc,EACd,wBAAwB,EACxB,4BAA4B,GAC7B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,+BAA+B,EAC/B,uBAAuB,GAGxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,mCAAmC,EACnC,4BAA4B,EAC5B,iCAAiC,EACjC,2BAA2B,EAC3B,6BAA6B,GAE9B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,8BAA8B,EAC9B,yBAAyB,EACzB,+BAA+B,EAC/B,4BAA4B,EAC5B,gCAAgC,GAKjC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,+BAA+B,GAEhC,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,EAC5B,qCAAqC,EACrC,mCAAmC,EACnC,+BAA+B,GAIhC,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** 识别 Codex Desktop 自动创建的后台任务,避免把内部 Agent 的 Stop 当成用户任务完成。 */
|
|
2
|
+
export declare function isInternalCodexPrompt(prompt: unknown): boolean;
|
|
3
|
+
/** session_meta.source 是协议级来源;出现 internal/subagent 时不属于用户主任务。 */
|
|
4
|
+
export declare function isInternalCodexSessionMeta(meta: unknown): boolean;
|
|
5
|
+
//# sourceMappingURL=internal-turn.d.ts.map
|