@resolveio/server-lib 22.3.221 → 22.3.223
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/ai/assistant-core-heuristics.d.ts +11 -0
- package/ai/assistant-core-heuristics.js +356 -0
- package/ai/assistant-core-heuristics.js.map +1 -0
- package/ai/resolveio-platform-intelligence-memory-corpus.d.ts +3 -0
- package/ai/resolveio-platform-intelligence-memory-corpus.js +214 -0
- package/ai/resolveio-platform-intelligence-memory-corpus.js.map +1 -0
- package/ai/resolveio-platform-intelligence-memory.d.ts +20 -0
- package/ai/resolveio-platform-intelligence-memory.js +341 -0
- package/ai/resolveio-platform-intelligence-memory.js.map +1 -0
- package/{src/ai/resolveio-platform-intelligence-types.ts → ai/resolveio-platform-intelligence-types.d.ts} +15 -20
- package/ai/resolveio-platform-intelligence-types.js +4 -0
- package/ai/resolveio-platform-intelligence-types.js.map +1 -0
- package/ai/resolveio-platform-intelligence.d.ts +6 -0
- package/ai/resolveio-platform-intelligence.js +463 -0
- package/ai/resolveio-platform-intelligence.js.map +1 -0
- package/client-server-app.d.ts +1 -0
- package/client-server-app.js +68 -0
- package/client-server-app.js.map +1 -0
- package/collections/ai-run.collection.d.ts +3 -0
- package/collections/ai-run.collection.js +170 -0
- package/collections/ai-run.collection.js.map +1 -0
- package/collections/ai-terminal-conversation.collection.d.ts +2 -0
- package/collections/ai-terminal-conversation.collection.js +140 -0
- package/collections/ai-terminal-conversation.collection.js.map +1 -0
- package/collections/ai-terminal-issue-report.collection.d.ts +2 -0
- package/collections/ai-terminal-issue-report.collection.js +148 -0
- package/collections/ai-terminal-issue-report.collection.js.map +1 -0
- package/collections/ai-terminal-message.collection.d.ts +2 -0
- package/collections/ai-terminal-message.collection.js +121 -0
- package/collections/ai-terminal-message.collection.js.map +1 -0
- package/collections/app-setting.collection.d.ts +3 -0
- package/collections/app-setting.collection.js +103 -0
- package/collections/app-setting.collection.js.map +1 -0
- package/collections/app-status.collection.d.ts +3 -0
- package/collections/app-status.collection.js +57 -0
- package/collections/app-status.collection.js.map +1 -0
- package/collections/communication-metric.collection.d.ts +2 -0
- package/collections/communication-metric.collection.js +133 -0
- package/collections/communication-metric.collection.js.map +1 -0
- package/collections/counter.collection.d.ts +3 -0
- package/collections/counter.collection.js +56 -0
- package/collections/counter.collection.js.map +1 -0
- package/collections/cron-job-history.collection.d.ts +3 -0
- package/collections/cron-job-history.collection.js +137 -0
- package/collections/cron-job-history.collection.js.map +1 -0
- package/collections/cron-job.collection.d.ts +3 -0
- package/collections/cron-job.collection.js +92 -0
- package/collections/cron-job.collection.js.map +1 -0
- package/collections/customer-notification.collection.d.ts +3 -0
- package/collections/customer-notification.collection.js +130 -0
- package/collections/customer-notification.collection.js.map +1 -0
- package/collections/customer-portal-password.collection.d.ts +3 -0
- package/collections/customer-portal-password.collection.js +75 -0
- package/collections/customer-portal-password.collection.js.map +1 -0
- package/collections/email-history.collection.d.ts +3 -0
- package/collections/email-history.collection.js +134 -0
- package/collections/email-history.collection.js.map +1 -0
- package/collections/email-verified.collection.d.ts +3 -0
- package/collections/email-verified.collection.js +62 -0
- package/collections/email-verified.collection.js.map +1 -0
- package/collections/file.collection.d.ts +3 -0
- package/collections/file.collection.js +74 -0
- package/collections/file.collection.js.map +1 -0
- package/collections/flag-update.collection.d.ts +3 -0
- package/collections/flag-update.collection.js +57 -0
- package/collections/flag-update.collection.js.map +1 -0
- package/collections/flag.collection.d.ts +3 -0
- package/collections/flag.collection.js +57 -0
- package/collections/flag.collection.js.map +1 -0
- package/collections/log-method-latency.collection.d.ts +3 -0
- package/collections/log-method-latency.collection.js +77 -0
- package/collections/log-method-latency.collection.js.map +1 -0
- package/collections/log-subscription.collection.d.ts +3 -0
- package/collections/log-subscription.collection.js +80 -0
- package/collections/log-subscription.collection.js.map +1 -0
- package/collections/log.collection.d.ts +3 -0
- package/collections/log.collection.js +93 -0
- package/collections/log.collection.js.map +1 -0
- package/collections/logged-in-users.collection.d.ts +3 -0
- package/collections/logged-in-users.collection.js +67 -0
- package/collections/logged-in-users.collection.js.map +1 -0
- package/collections/monitor-cpu.collection.d.ts +3 -0
- package/collections/monitor-cpu.collection.js +65 -0
- package/collections/monitor-cpu.collection.js.map +1 -0
- package/collections/monitor-function.collection.d.ts +3 -0
- package/collections/monitor-function.collection.js +74 -0
- package/collections/monitor-function.collection.js.map +1 -0
- package/collections/monitor-memory.collection.d.ts +3 -0
- package/collections/monitor-memory.collection.js +77 -0
- package/collections/monitor-memory.collection.js.map +1 -0
- package/collections/monitor-mongo.collection.d.ts +3 -0
- package/collections/monitor-mongo.collection.js +71 -0
- package/collections/monitor-mongo.collection.js.map +1 -0
- package/collections/notification.collection.d.ts +3 -0
- package/collections/notification.collection.js +57 -0
- package/collections/notification.collection.js.map +1 -0
- package/collections/openai-usage-ledger.collection.d.ts +2 -0
- package/collections/openai-usage-ledger.collection.js +188 -0
- package/collections/openai-usage-ledger.collection.js.map +1 -0
- package/collections/report-builder-dashboard-builder.collection.d.ts +3 -0
- package/collections/report-builder-dashboard-builder.collection.js +109 -0
- package/collections/report-builder-dashboard-builder.collection.js.map +1 -0
- package/collections/report-builder-library.collection.d.ts +3 -0
- package/collections/report-builder-library.collection.js +87 -0
- package/collections/report-builder-library.collection.js.map +1 -0
- package/collections/report-builder-report.collection.d.ts +4 -0
- package/collections/report-builder-report.collection.js +184 -0
- package/collections/report-builder-report.collection.js.map +1 -0
- package/collections/user-group.collection.d.ts +4 -0
- package/collections/user-group.collection.js +89 -0
- package/collections/user-group.collection.js.map +1 -0
- package/collections/user-guide.collection.d.ts +3 -0
- package/collections/user-guide.collection.js +57 -0
- package/collections/user-guide.collection.js.map +1 -0
- package/collections/user.collection.d.ts +4 -0
- package/collections/user.collection.js +180 -0
- package/collections/user.collection.js.map +1 -0
- package/cron/cron.d.ts +14 -0
- package/cron/cron.js +216 -0
- package/cron/cron.js.map +1 -0
- package/fixtures/cron-jobs.d.ts +1 -0
- package/fixtures/cron-jobs.js +150 -0
- package/fixtures/cron-jobs.js.map +1 -0
- package/fixtures/init.d.ts +1 -0
- package/fixtures/init.js +91 -0
- package/fixtures/init.js.map +1 -0
- package/http/auth.d.ts +2 -0
- package/http/auth.js +951 -0
- package/http/auth.js.map +1 -0
- package/http/health.d.ts +1 -0
- package/http/health.js +11 -0
- package/http/health.js.map +1 -0
- package/http/home.d.ts +1 -0
- package/http/home.js +134 -0
- package/http/home.js.map +1 -0
- package/http/slow-query-publication.d.ts +2 -0
- package/http/slow-query-publication.js +99 -0
- package/http/slow-query-publication.js.map +1 -0
- package/index.d.ts +1 -0
- package/index.js +19 -0
- package/index.js.map +1 -0
- package/managers/ai-assistant-codex-manager.manager.d.ts +67 -0
- package/managers/ai-assistant-codex-manager.manager.js +1113 -0
- package/managers/ai-assistant-codex-manager.manager.js.map +1 -0
- package/managers/ai-run-evidence.manager.d.ts +36 -0
- package/managers/ai-run-evidence.manager.js +377 -0
- package/managers/ai-run-evidence.manager.js.map +1 -0
- package/managers/communication-metric.manager.d.ts +16 -0
- package/managers/communication-metric.manager.js +134 -0
- package/managers/communication-metric.manager.js.map +1 -0
- package/managers/cron.manager.d.ts +20 -0
- package/managers/cron.manager.js +534 -0
- package/managers/cron.manager.js.map +1 -0
- package/managers/customer-notification-content.manager.d.ts +55 -0
- package/managers/customer-notification-content.manager.js +158 -0
- package/managers/customer-notification-content.manager.js.map +1 -0
- package/managers/diagnostic-manager-bootstrap.d.ts +9 -0
- package/managers/diagnostic-manager-bootstrap.js +260 -0
- package/managers/diagnostic-manager-bootstrap.js.map +1 -0
- package/managers/error-auto-fix.manager.d.ts +149 -0
- package/managers/error-auto-fix.manager.js +3064 -0
- package/managers/error-auto-fix.manager.js.map +1 -0
- package/managers/local-log.manager.d.ts +18 -0
- package/managers/local-log.manager.js +88 -0
- package/managers/local-log.manager.js.map +1 -0
- package/managers/method.manager.d.ts +84 -0
- package/managers/method.manager.js +1964 -0
- package/managers/method.manager.js.map +1 -0
- package/managers/mongo.manager.d.ts +224 -0
- package/managers/mongo.manager.js +5000 -0
- package/managers/mongo.manager.js.map +1 -0
- package/managers/monitor.manager.d.ts +70 -0
- package/managers/monitor.manager.js +550 -0
- package/managers/monitor.manager.js.map +1 -0
- package/managers/openai-usage-ledger.manager.d.ts +30 -0
- package/managers/openai-usage-ledger.manager.js +142 -0
- package/managers/openai-usage-ledger.manager.js.map +1 -0
- package/managers/slow-query-verifier.manager.d.ts +144 -0
- package/managers/slow-query-verifier.manager.js +3857 -0
- package/managers/slow-query-verifier.manager.js.map +1 -0
- package/managers/slow-query.manager.d.ts +28 -0
- package/managers/slow-query.manager.js +468 -0
- package/managers/slow-query.manager.js.map +1 -0
- package/managers/subscription.manager.d.ts +169 -0
- package/managers/subscription.manager.js +3434 -0
- package/managers/subscription.manager.js.map +1 -0
- package/managers/websocket.manager.d.ts +73 -0
- package/managers/websocket.manager.js +673 -0
- package/managers/websocket.manager.js.map +1 -0
- package/managers/worker-dispatcher.manager.d.ts +120 -0
- package/managers/worker-dispatcher.manager.js +1266 -0
- package/managers/worker-dispatcher.manager.js.map +1 -0
- package/managers/worker-server.manager.d.ts +35 -0
- package/managers/worker-server.manager.js +582 -0
- package/managers/worker-server.manager.js.map +1 -0
- package/methods/accounts.d.ts +2 -0
- package/methods/accounts.js +624 -0
- package/methods/accounts.js.map +1 -0
- package/methods/ai-terminal.d.ts +458 -0
- package/methods/ai-terminal.js +27991 -0
- package/methods/ai-terminal.js.map +1 -0
- package/methods/app-settings.d.ts +2 -0
- package/methods/app-settings.js +169 -0
- package/methods/app-settings.js.map +1 -0
- package/methods/aws.d.ts +2 -0
- package/methods/aws.js +877 -0
- package/methods/aws.js.map +1 -0
- package/methods/collections.d.ts +2 -0
- package/methods/collections.js +719 -0
- package/methods/collections.js.map +1 -0
- package/methods/counters.d.ts +2 -0
- package/methods/counters.js +113 -0
- package/methods/counters.js.map +1 -0
- package/methods/cron-jobs.d.ts +2 -0
- package/methods/cron-jobs.js +2475 -0
- package/methods/cron-jobs.js.map +1 -0
- package/methods/customer-notifications.d.ts +2 -0
- package/methods/customer-notifications.js +528 -0
- package/methods/customer-notifications.js.map +1 -0
- package/methods/diagnostics.d.ts +2 -0
- package/methods/diagnostics.js +703 -0
- package/methods/diagnostics.js.map +1 -0
- package/methods/flag-updates.d.ts +2 -0
- package/methods/flag-updates.js +8 -0
- package/methods/flag-updates.js.map +1 -0
- package/methods/flags.d.ts +2 -0
- package/methods/flags.js +8 -0
- package/methods/flags.js.map +1 -0
- package/methods/logs.d.ts +2 -0
- package/methods/logs.js +751 -0
- package/methods/logs.js.map +1 -0
- package/methods/mongo-explorer.d.ts +2 -0
- package/methods/mongo-explorer.js +1808 -0
- package/methods/mongo-explorer.js.map +1 -0
- package/methods/monitor.d.ts +2 -0
- package/methods/monitor.js +543 -0
- package/methods/monitor.js.map +1 -0
- package/methods/pdf.d.ts +2 -0
- package/methods/pdf.js +1216 -0
- package/methods/pdf.js.map +1 -0
- package/methods/publications.d.ts +1 -0
- package/methods/publications.js +183 -0
- package/methods/publications.js.map +1 -0
- package/methods/report-builder.d.ts +2 -0
- package/methods/report-builder.js +3094 -0
- package/methods/report-builder.js.map +1 -0
- package/methods/support.d.ts +2 -0
- package/methods/support.js +430 -0
- package/methods/support.js.map +1 -0
- package/models/ai-run.model.d.ts +19 -0
- package/models/ai-run.model.js +4 -0
- package/models/ai-run.model.js.map +1 -0
- package/models/ai-terminal-conversation.model.d.ts +17 -0
- package/models/ai-terminal-conversation.model.js +4 -0
- package/models/ai-terminal-conversation.model.js.map +1 -0
- package/models/ai-terminal-issue-report.model.d.ts +19 -0
- package/models/ai-terminal-issue-report.model.js +4 -0
- package/models/ai-terminal-issue-report.model.js.map +1 -0
- package/models/ai-terminal-message.model.d.ts +22 -0
- package/models/ai-terminal-message.model.js +4 -0
- package/models/ai-terminal-message.model.js.map +1 -0
- package/models/app-setting.model.d.ts +16 -0
- package/models/app-setting.model.js +4 -0
- package/models/app-setting.model.js.map +1 -0
- package/{src/models/app-status.model.ts → models/app-status.model.d.ts} +2 -3
- package/models/app-status.model.js +4 -0
- package/models/app-status.model.js.map +1 -0
- package/{src/models/billing-logged-in-users.model.ts → models/billing-logged-in-users.model.d.ts} +4 -5
- package/models/billing-logged-in-users.model.js +4 -0
- package/models/billing-logged-in-users.model.js.map +1 -0
- package/models/collection-document.model.d.ts +21 -0
- package/models/collection-document.model.js +4 -0
- package/models/collection-document.model.js.map +1 -0
- package/models/communication-metric.model.d.ts +20 -0
- package/models/communication-metric.model.js +4 -0
- package/models/communication-metric.model.js.map +1 -0
- package/{src/models/counter.model.ts → models/counter.model.d.ts} +3 -4
- package/models/counter.model.js +4 -0
- package/models/counter.model.js.map +1 -0
- package/models/cron-job-history.model.d.ts +15 -0
- package/models/cron-job-history.model.js +4 -0
- package/models/cron-job-history.model.js.map +1 -0
- package/models/cron-job.model.d.ts +14 -0
- package/models/cron-job.model.js +4 -0
- package/models/cron-job.model.js.map +1 -0
- package/models/customer-notification.model.d.ts +26 -0
- package/models/customer-notification.model.js +4 -0
- package/models/customer-notification.model.js.map +1 -0
- package/models/customer-portal-password.model.d.ts +11 -0
- package/models/customer-portal-password.model.js +4 -0
- package/models/customer-portal-password.model.js.map +1 -0
- package/models/dialog.model.d.ts +23 -0
- package/models/dialog.model.js +4 -0
- package/models/dialog.model.js.map +1 -0
- package/models/email-history.model.d.ts +32 -0
- package/{src/models/email-history.model.ts → models/email-history.model.js} +4 -36
- package/models/email-history.model.js.map +1 -0
- package/{src/models/email-verified.model.ts → models/email-verified.model.d.ts} +5 -6
- package/models/email-verified.model.js +4 -0
- package/models/email-verified.model.js.map +1 -0
- package/{src/models/file.model.ts → models/file.model.d.ts} +7 -8
- package/models/file.model.js +4 -0
- package/models/file.model.js.map +1 -0
- package/{src/models/flag-update.model.ts → models/flag-update.model.d.ts} +3 -4
- package/models/flag-update.model.js +4 -0
- package/models/flag-update.model.js.map +1 -0
- package/{src/models/flag.model.ts → models/flag.model.d.ts} +3 -4
- package/models/flag.model.js +4 -0
- package/models/flag.model.js.map +1 -0
- package/models/log-method-latency.model.d.ts +10 -0
- package/models/log-method-latency.model.js +4 -0
- package/models/log-method-latency.model.js.map +1 -0
- package/{src/models/log-subscription.model.ts → models/log-subscription.model.d.ts} +9 -11
- package/models/log-subscription.model.js +4 -0
- package/models/log-subscription.model.js.map +1 -0
- package/models/log.model.d.ts +17 -0
- package/models/log.model.js +4 -0
- package/models/log.model.js.map +1 -0
- package/{src/models/logged-in-users.model.ts → models/logged-in-users.model.d.ts} +5 -6
- package/models/logged-in-users.model.js +4 -0
- package/models/logged-in-users.model.js.map +1 -0
- package/{src/models/method-response.model.ts → models/method-response.model.d.ts} +6 -7
- package/models/method-response.model.js +4 -0
- package/models/method-response.model.js.map +1 -0
- package/models/method.model.d.ts +26 -0
- package/models/method.model.js +4 -0
- package/models/method.model.js.map +1 -0
- package/{src/models/monitor-cpu.model.ts → models/monitor-cpu.model.d.ts} +7 -9
- package/models/monitor-cpu.model.js +4 -0
- package/models/monitor-cpu.model.js.map +1 -0
- package/models/monitor-function.model.d.ts +14 -0
- package/models/monitor-function.model.js +4 -0
- package/models/monitor-function.model.js.map +1 -0
- package/models/monitor-memory.model.d.ts +15 -0
- package/models/monitor-memory.model.js +4 -0
- package/models/monitor-memory.model.js.map +1 -0
- package/models/monitor-mongo.model.d.ts +13 -0
- package/models/monitor-mongo.model.js +4 -0
- package/models/monitor-mongo.model.js.map +1 -0
- package/{src/models/notification.model.ts → models/notification.model.d.ts} +4 -6
- package/models/notification.model.js +4 -0
- package/models/notification.model.js.map +1 -0
- package/models/openai-usage-ledger.model.d.ts +30 -0
- package/models/openai-usage-ledger.model.js +4 -0
- package/models/openai-usage-ledger.model.js.map +1 -0
- package/models/pagination.model.d.ts +11 -0
- package/models/pagination.model.js +28 -0
- package/models/pagination.model.js.map +1 -0
- package/models/permission.model.d.ts +12 -0
- package/models/permission.model.js +4 -0
- package/models/permission.model.js.map +1 -0
- package/models/report-builder-dashboard-builder.model.d.ts +25 -0
- package/models/report-builder-dashboard-builder.model.js +4 -0
- package/models/report-builder-dashboard-builder.model.js.map +1 -0
- package/models/report-builder-library.model.d.ts +17 -0
- package/models/report-builder-library.model.js +4 -0
- package/models/report-builder-library.model.js.map +1 -0
- package/models/report-builder-report.model.d.ts +121 -0
- package/models/report-builder-report.model.js +4 -0
- package/models/report-builder-report.model.js.map +1 -0
- package/models/report-builder.model.d.ts +61 -0
- package/models/report-builder.model.js +4 -0
- package/models/report-builder.model.js.map +1 -0
- package/models/select-data-label.model.d.ts +9 -0
- package/models/select-data-label.model.js +4 -0
- package/models/select-data-label.model.js.map +1 -0
- package/models/server-message.model.d.ts +32 -0
- package/models/server-message.model.js +4 -0
- package/models/server-message.model.js.map +1 -0
- package/models/slow-query-report.model.d.ts +23 -0
- package/models/slow-query-report.model.js +4 -0
- package/models/slow-query-report.model.js.map +1 -0
- package/models/subscription.model.d.ts +31 -0
- package/models/subscription.model.js +4 -0
- package/models/subscription.model.js.map +1 -0
- package/models/support-ticket.model.d.ts +87 -0
- package/models/support-ticket.model.js +4 -0
- package/models/support-ticket.model.js.map +1 -0
- package/models/user-group.model.d.ts +20 -0
- package/models/user-group.model.js +4 -0
- package/models/user-group.model.js.map +1 -0
- package/{src/models/user-guide.model.ts → models/user-guide.model.d.ts} +4 -5
- package/models/user-guide.model.js +4 -0
- package/models/user-guide.model.js.map +1 -0
- package/models/user.model.d.ts +84 -0
- package/models/user.model.js +4 -0
- package/models/user.model.js.map +1 -0
- package/package.json +1 -1
- package/private/images/ResolveIO.png +0 -0
- package/public_api.js +127 -0
- package/public_api.js.map +1 -0
- package/publications/ai-terminal.d.ts +1 -0
- package/publications/ai-terminal.js +122 -0
- package/publications/ai-terminal.js.map +1 -0
- package/publications/app-settings.d.ts +2 -0
- package/publications/app-settings.js +28 -0
- package/publications/app-settings.js.map +1 -0
- package/publications/app-status.d.ts +2 -0
- package/publications/app-status.js +16 -0
- package/publications/app-status.js.map +1 -0
- package/publications/cron-jobs.d.ts +2 -0
- package/publications/cron-jobs.js +88 -0
- package/publications/cron-jobs.js.map +1 -0
- package/publications/customer-notifications.d.ts +2 -0
- package/publications/customer-notifications.js +161 -0
- package/publications/customer-notifications.js.map +1 -0
- package/publications/files.d.ts +2 -0
- package/publications/files.js +36 -0
- package/publications/files.js.map +1 -0
- package/publications/flags-update.d.ts +2 -0
- package/publications/flags-update.js +22 -0
- package/publications/flags-update.js.map +1 -0
- package/publications/flags.d.ts +2 -0
- package/publications/flags.js +22 -0
- package/publications/flags.js.map +1 -0
- package/publications/logs.d.ts +2 -0
- package/publications/logs.js +164 -0
- package/publications/logs.js.map +1 -0
- package/publications/notifications.d.ts +2 -0
- package/publications/notifications.js +16 -0
- package/publications/notifications.js.map +1 -0
- package/publications/report-builder-dashboard-builders.d.ts +2 -0
- package/publications/report-builder-dashboard-builders.js +42 -0
- package/publications/report-builder-dashboard-builders.js.map +1 -0
- package/publications/report-builder-libraries.d.ts +2 -0
- package/publications/report-builder-libraries.js +90 -0
- package/publications/report-builder-libraries.js.map +1 -0
- package/publications/report-builder-reports.d.ts +2 -0
- package/publications/report-builder-reports.js +50 -0
- package/publications/report-builder-reports.js.map +1 -0
- package/publications/super-admin.d.ts +2 -0
- package/publications/super-admin.js +16 -0
- package/publications/super-admin.js.map +1 -0
- package/publications/user-groups.d.ts +1 -0
- package/publications/user-groups.js +16 -0
- package/publications/user-groups.js.map +1 -0
- package/publications/user-guides.d.ts +1 -0
- package/publications/user-guides.js +16 -0
- package/publications/user-guides.js.map +1 -0
- package/resolveio-server-app.d.ts +70 -0
- package/resolveio-server-app.js +801 -0
- package/resolveio-server-app.js.map +1 -0
- package/server-app.d.ts +228 -0
- package/server-app.js +3566 -0
- package/server-app.js.map +1 -0
- package/services/codex-client.d.ts +128 -0
- package/services/codex-client.js +1629 -0
- package/services/codex-client.js.map +1 -0
- package/services/openai-client.d.ts +46 -0
- package/services/openai-client.js +318 -0
- package/services/openai-client.js.map +1 -0
- package/types/error-report.d.ts +25 -0
- package/types/error-report.js +4 -0
- package/types/error-report.js.map +1 -0
- package/types/slow-query-report.d.ts +27 -0
- package/types/slow-query-report.js +6 -0
- package/types/slow-query-report.js.map +1 -0
- package/util/ai-qa-policy.d.ts +124 -0
- package/util/ai-qa-policy.js +736 -0
- package/util/ai-qa-policy.js.map +1 -0
- package/util/ai-run-evidence-adapters.d.ts +109 -0
- package/util/ai-run-evidence-adapters.js +7234 -0
- package/util/ai-run-evidence-adapters.js.map +1 -0
- package/util/ai-run-evidence-dashboard.d.ts +88 -0
- package/util/ai-run-evidence-dashboard.js +343 -0
- package/util/ai-run-evidence-dashboard.js.map +1 -0
- package/util/ai-run-evidence-eval.d.ts +86 -0
- package/util/ai-run-evidence-eval.js +1018 -0
- package/util/ai-run-evidence-eval.js.map +1 -0
- package/util/ai-run-evidence.d.ts +244 -0
- package/util/ai-run-evidence.js +1096 -0
- package/util/ai-run-evidence.js.map +1 -0
- package/util/ai-runner-artifacts.d.ts +82 -0
- package/util/ai-runner-artifacts.js +713 -0
- package/util/ai-runner-artifacts.js.map +1 -0
- package/util/ai-runner-manager-autopilot.d.ts +210 -0
- package/util/ai-runner-manager-autopilot.js +642 -0
- package/util/ai-runner-manager-autopilot.js.map +1 -0
- package/util/ai-runner-manager-policy.d.ts +807 -0
- package/util/ai-runner-manager-policy.js +3501 -0
- package/util/ai-runner-manager-policy.js.map +1 -0
- package/util/ai-runner-qa-auth.d.ts +5 -0
- package/util/ai-runner-qa-auth.js +839 -0
- package/util/ai-runner-qa-auth.js.map +1 -0
- package/util/ai-runner-qa-tools.d.ts +26 -0
- package/util/ai-runner-qa-tools.js +3520 -0
- package/util/ai-runner-qa-tools.js.map +1 -0
- package/util/aicoder-runner-v6.d.ts +426 -0
- package/util/aicoder-runner-v6.js +2464 -0
- package/util/aicoder-runner-v6.js.map +1 -0
- package/util/common.d.ts +31 -0
- package/util/common.js +683 -0
- package/util/common.js.map +1 -0
- package/util/customer-portal-password.d.ts +13 -0
- package/util/customer-portal-password.js +209 -0
- package/util/customer-portal-password.js.map +1 -0
- package/util/error-reporter.d.ts +52 -0
- package/util/error-reporter.js +326 -0
- package/util/error-reporter.js.map +1 -0
- package/util/error-tracking.d.ts +13 -0
- package/util/error-tracking.js +120 -0
- package/util/error-tracking.js.map +1 -0
- package/util/openai-usage-cost.d.ts +6 -0
- package/util/openai-usage-cost.js +103 -0
- package/util/openai-usage-cost.js.map +1 -0
- package/util/report-builder-unwinds.d.ts +15 -0
- package/util/report-builder-unwinds.js +156 -0
- package/util/report-builder-unwinds.js.map +1 -0
- package/util/runner-process-janitor.d.ts +27 -0
- package/util/runner-process-janitor.js +208 -0
- package/util/runner-process-janitor.js.map +1 -0
- package/util/schema-report-builder.d.ts +6 -0
- package/util/schema-report-builder.js +481 -0
- package/util/schema-report-builder.js.map +1 -0
- package/util/slow-query-reporter.d.ts +28 -0
- package/util/slow-query-reporter.js +226 -0
- package/util/slow-query-reporter.js.map +1 -0
- package/util/subscription-dependency-context.d.ts +34 -0
- package/util/subscription-dependency-context.js +1283 -0
- package/util/subscription-dependency-context.js.map +1 -0
- package/util/support-runner-v5.d.ts +1426 -0
- package/util/support-runner-v5.js +7647 -0
- package/util/support-runner-v5.js.map +1 -0
- package/util/tokenizer.d.ts +5 -0
- package/util/tokenizer.js +41 -0
- package/util/tokenizer.js.map +1 -0
- package/workers/codex-runner.worker.d.ts +1 -0
- package/workers/codex-runner.worker.js +192 -0
- package/workers/codex-runner.worker.js.map +1 -0
- package/.nodemon.json +0 -5
- package/.vscode/settings.json +0 -21
- package/AGENTS.md +0 -195
- package/README.md +0 -22
- package/build_package.sh +0 -5
- package/compileDTS.pl +0 -64
- package/docs/ai-assistant-nightly-eval.md +0 -65
- package/docs/ai-assistant-preflight-checklist.md +0 -23
- package/docs/ai-assistant-report-builder-bridge-playbook.md +0 -115
- package/eslint-plugin-custom/index.js +0 -7
- package/eslint-plugin-custom/rules/no-filter-zero-index.js +0 -44
- package/eslint.config.js +0 -103
- package/gulpfile.js +0 -216
- package/methodAndPublicationListGenerator.py +0 -375
- package/mongodbensurers.js +0 -2
- package/mongostop.js +0 -3
- package/scripts/cleanup-bypassed-callmethod-logs.js +0 -616
- package/settings.development.json +0 -25
- package/settings.development.redacted.json +0 -25
- package/src/.env +0 -12
- package/src/ai/assistant-core-heuristics.ts +0 -379
- package/src/ai/resolveio-platform-intelligence-memory-corpus.ts +0 -185
- package/src/ai/resolveio-platform-intelligence-memory.ts +0 -325
- package/src/ai/resolveio-platform-intelligence.ts +0 -462
- package/src/client-server-app.ts +0 -12
- package/src/collections/ai-run.collection.ts +0 -117
- package/src/collections/ai-terminal-conversation.collection.ts +0 -91
- package/src/collections/ai-terminal-issue-report.collection.ts +0 -99
- package/src/collections/ai-terminal-message.collection.ts +0 -77
- package/src/collections/app-setting.collection.ts +0 -104
- package/src/collections/app-status.collection.ts +0 -58
- package/src/collections/communication-metric.collection.ts +0 -84
- package/src/collections/counter.collection.ts +0 -56
- package/src/collections/cron-job-history.collection.ts +0 -94
- package/src/collections/cron-job.collection.ts +0 -92
- package/src/collections/customer-notification.collection.ts +0 -131
- package/src/collections/customer-portal-password.collection.ts +0 -76
- package/src/collections/email-history.collection.ts +0 -134
- package/src/collections/email-verified.collection.ts +0 -62
- package/src/collections/file.collection.ts +0 -74
- package/src/collections/flag-update.collection.ts +0 -57
- package/src/collections/flag.collection.ts +0 -57
- package/src/collections/log-method-latency.collection.ts +0 -77
- package/src/collections/log-subscription.collection.ts +0 -80
- package/src/collections/log.collection.ts +0 -93
- package/src/collections/logged-in-users.collection.ts +0 -67
- package/src/collections/monitor-cpu.collection.ts +0 -65
- package/src/collections/monitor-function.collection.ts +0 -74
- package/src/collections/monitor-memory.collection.ts +0 -77
- package/src/collections/monitor-mongo.collection.ts +0 -71
- package/src/collections/notification.collection.ts +0 -57
- package/src/collections/openai-usage-ledger.collection.ts +0 -131
- package/src/collections/report-builder-dashboard-builder.collection.ts +0 -109
- package/src/collections/report-builder-library.collection.ts +0 -89
- package/src/collections/report-builder-report.collection.ts +0 -184
- package/src/collections/user-group.collection.ts +0 -89
- package/src/collections/user-guide.collection.ts +0 -57
- package/src/collections/user.collection.ts +0 -181
- package/src/cron/cron.ts +0 -117
- package/src/fixtures/cron-jobs.ts +0 -95
- package/src/fixtures/init.ts +0 -35
- package/src/http/auth.ts +0 -818
- package/src/http/health.ts +0 -7
- package/src/http/home.ts +0 -90
- package/src/http/slow-query-publication.ts +0 -49
- package/src/index.ts +0 -1
- package/src/managers/ai-assistant-codex-manager.manager.ts +0 -1131
- package/src/managers/ai-run-evidence.manager.ts +0 -264
- package/src/managers/communication-metric.manager.ts +0 -82
- package/src/managers/cron.manager.ts +0 -333
- package/src/managers/customer-notification-content.manager.ts +0 -236
- package/src/managers/diagnostic-manager-bootstrap.ts +0 -165
- package/src/managers/error-auto-fix.manager.ts +0 -2767
- package/src/managers/local-log.manager.ts +0 -113
- package/src/managers/method.manager.ts +0 -1857
- package/src/managers/mongo.manager.ts +0 -4575
- package/src/managers/monitor.manager.ts +0 -507
- package/src/managers/openai-usage-ledger.manager.ts +0 -112
- package/src/managers/slow-query-verifier.manager.ts +0 -3590
- package/src/managers/slow-query.manager.ts +0 -519
- package/src/managers/subscription.manager.ts +0 -3128
- package/src/managers/websocket.manager.ts +0 -746
- package/src/managers/worker-dispatcher.manager.ts +0 -1360
- package/src/managers/worker-server.manager.ts +0 -536
- package/src/methods/accounts.ts +0 -532
- package/src/methods/ai-terminal.ts +0 -29070
- package/src/methods/app-settings.ts +0 -114
- package/src/methods/aws.ts +0 -649
- package/src/methods/collections.ts +0 -641
- package/src/methods/counters.ts +0 -69
- package/src/methods/cron-jobs.ts +0 -2614
- package/src/methods/customer-notifications.ts +0 -458
- package/src/methods/diagnostics.ts +0 -616
- package/src/methods/flag-updates.ts +0 -7
- package/src/methods/flags.ts +0 -7
- package/src/methods/logs.ts +0 -657
- package/src/methods/mongo-explorer.ts +0 -1880
- package/src/methods/monitor.ts +0 -540
- package/src/methods/pdf.ts +0 -1236
- package/src/methods/publications.ts +0 -129
- package/src/methods/report-builder.ts +0 -3300
- package/src/methods/support.ts +0 -335
- package/src/models/ai-run.model.ts +0 -27
- package/src/models/ai-terminal-conversation.model.ts +0 -19
- package/src/models/ai-terminal-issue-report.model.ts +0 -21
- package/src/models/ai-terminal-message.model.ts +0 -24
- package/src/models/app-setting.model.ts +0 -17
- package/src/models/collection-document.model.ts +0 -24
- package/src/models/communication-metric.model.ts +0 -23
- package/src/models/cron-job-history.model.ts +0 -16
- package/src/models/cron-job.model.ts +0 -15
- package/src/models/customer-notification.model.ts +0 -28
- package/src/models/customer-portal-password.model.ts +0 -12
- package/src/models/dialog.model.ts +0 -25
- package/src/models/log-method-latency.model.ts +0 -11
- package/src/models/log.model.ts +0 -19
- package/src/models/method.model.ts +0 -25
- package/src/models/monitor-function.model.ts +0 -16
- package/src/models/monitor-memory.model.ts +0 -17
- package/src/models/monitor-mongo.model.ts +0 -15
- package/src/models/openai-usage-ledger.model.ts +0 -56
- package/src/models/pagination.model.ts +0 -35
- package/src/models/permission.model.ts +0 -14
- package/src/models/report-builder-dashboard-builder.model.ts +0 -29
- package/src/models/report-builder-library.model.ts +0 -20
- package/src/models/report-builder-report.model.ts +0 -136
- package/src/models/report-builder.model.ts +0 -68
- package/src/models/select-data-label.model.ts +0 -9
- package/src/models/server-message.model.ts +0 -31
- package/src/models/slow-query-report.model.ts +0 -23
- package/src/models/subscription.model.ts +0 -73
- package/src/models/support-ticket.model.ts +0 -104
- package/src/models/user-group.model.ts +0 -24
- package/src/models/user.model.ts +0 -96
- package/src/private/images/ResolveIO.png +0 -0
- package/src/publications/ai-terminal.ts +0 -73
- package/src/publications/app-settings.ts +0 -25
- package/src/publications/app-status.ts +0 -13
- package/src/publications/cron-jobs.ts +0 -40
- package/src/publications/customer-notifications.ts +0 -101
- package/src/publications/files.ts +0 -33
- package/src/publications/flags-update.ts +0 -19
- package/src/publications/flags.ts +0 -19
- package/src/publications/logs.ts +0 -163
- package/src/publications/notifications.ts +0 -13
- package/src/publications/report-builder-dashboard-builders.ts +0 -39
- package/src/publications/report-builder-libraries.ts +0 -41
- package/src/publications/report-builder-reports.ts +0 -47
- package/src/publications/super-admin.ts +0 -13
- package/src/publications/user-groups.ts +0 -12
- package/src/publications/user-guides.ts +0 -12
- package/src/resolveio-server-app.ts +0 -617
- package/src/server-app.ts +0 -3354
- package/src/services/codex-client.ts +0 -1231
- package/src/services/openai-client.ts +0 -265
- package/src/types/error-report.ts +0 -26
- package/src/types/js-tiktoken.d.ts +0 -11
- package/src/types/slow-query-report.ts +0 -28
- package/src/util/ai-qa-policy.ts +0 -925
- package/src/util/ai-run-evidence-adapters.ts +0 -8347
- package/src/util/ai-run-evidence-dashboard.ts +0 -323
- package/src/util/ai-run-evidence-eval.ts +0 -1057
- package/src/util/ai-run-evidence.ts +0 -1430
- package/src/util/ai-runner-artifacts.ts +0 -586
- package/src/util/ai-runner-manager-autopilot.ts +0 -961
- package/src/util/ai-runner-manager-policy.ts +0 -5011
- package/src/util/ai-runner-qa-auth.ts +0 -838
- package/src/util/ai-runner-qa-tools.ts +0 -3536
- package/src/util/aicoder-runner-v6.ts +0 -3121
- package/src/util/common.ts +0 -649
- package/src/util/customer-portal-password.ts +0 -183
- package/src/util/error-reporter.ts +0 -332
- package/src/util/error-tracking.ts +0 -79
- package/src/util/openai-usage-cost.ts +0 -114
- package/src/util/report-builder-unwinds.ts +0 -180
- package/src/util/runner-process-janitor.ts +0 -219
- package/src/util/schema-report-builder.ts +0 -448
- package/src/util/slow-query-reporter.ts +0 -216
- package/src/util/subscription-dependency-context.ts +0 -1096
- package/src/util/support-runner-v5.ts +0 -10040
- package/src/util/tokenizer.ts +0 -38
- package/src/workers/codex-runner.worker.ts +0 -142
- package/start_server.sh +0 -5
- package/tests/ai-assistant-corpus-build.ts +0 -484
- package/tests/ai-assistant-corpus-replay-e2e.ts +0 -774
- package/tests/ai-assistant-data-parity-e2e.ts +0 -1989
- package/tests/ai-assistant-eval-triage.ts +0 -831
- package/tests/ai-assistant-openai-e2e.ts +0 -1061
- package/tests/ai-assistant-openai-git-e2e.ts +0 -155
- package/tests/ai-assistant-preflight-matrix.ts +0 -215
- package/tests/ai-assistant-routing-eval.test.ts +0 -585
- package/tests/ai-assistant-snf-live-eval.ts +0 -975
- package/tests/ai-assistant-utils.test.ts +0 -4834
- package/tests/ai-manager-autopilot-snapshot.test.ts +0 -193
- package/tests/ai-manager-recovery-checkpoint.test.ts +0 -1383
- package/tests/ai-run-eval.test.ts +0 -132
- package/tests/ai-run-evidence.test.ts +0 -3773
- package/tests/ai-runner-contract.test.ts +0 -515
- package/tests/aicoder-runner-v6.test.ts +0 -822
- package/tests/error-reporter.test.ts +0 -145
- package/tests/method-publication-generator.test.ts +0 -46
- package/tests/report-builder-linking.test.ts +0 -79
- package/tests/resolveio-platform-intelligence.test.ts +0 -352
- package/tests/server-app-cron-owner.test.ts +0 -127
- package/tests/subscription-connect-race.test.ts +0 -158
- package/tests/subscription-dependency-context.test.ts +0 -324
- package/tests/subscription-manager-collection-tracking.test.ts +0 -86
- package/tests/subscription-manager-invalidation.test.ts +0 -86
- package/tests/support-runner-v5.test.ts +0 -3201
- package/tsconfig.json +0 -34
- /package/{src/private → private}/email-templates/enrollment.html +0 -0
- /package/{src/private → private}/email-templates/forgot-password.html +0 -0
- /package/{src/private → private}/email-templates/support-ticket-deleted.html +0 -0
- /package/{src/private → private}/email-templates/support-ticket-modified.html +0 -0
- /package/{src/private → private}/email-templates/support-ticket.html +0 -0
- /package/{src/public_api.ts → public_api.d.ts} +0 -0
|
@@ -1,1430 +0,0 @@
|
|
|
1
|
-
export type AIRunSource =
|
|
2
|
-
| 'support_ticket'
|
|
3
|
-
| 'aicoder_app'
|
|
4
|
-
| 'ai_assistant'
|
|
5
|
-
| 'qa_runner'
|
|
6
|
-
| 'unknown';
|
|
7
|
-
|
|
8
|
-
export type AIRunOutcomeLabel =
|
|
9
|
-
| 'accepted'
|
|
10
|
-
| 'rejected'
|
|
11
|
-
| 'qa_incomplete'
|
|
12
|
-
| 'qa_infra_failed'
|
|
13
|
-
| 'build_failed'
|
|
14
|
-
| 'release_blocked'
|
|
15
|
-
| 'manual_handoff'
|
|
16
|
-
| 'false_pass'
|
|
17
|
-
| 'stopped'
|
|
18
|
-
| 'unknown';
|
|
19
|
-
|
|
20
|
-
export type AIRunEventType =
|
|
21
|
-
| 'model_call'
|
|
22
|
-
| 'log'
|
|
23
|
-
| 'qa_infra'
|
|
24
|
-
| 'qa_compile'
|
|
25
|
-
| 'qa_route_probe'
|
|
26
|
-
| 'qa_business_assertion'
|
|
27
|
-
| 'scorecard'
|
|
28
|
-
| 'deploy'
|
|
29
|
-
| 'publish'
|
|
30
|
-
| 'hotfix'
|
|
31
|
-
| 'assistant_message'
|
|
32
|
-
| 'assistant_query'
|
|
33
|
-
| 'git_commit'
|
|
34
|
-
| 'usage'
|
|
35
|
-
| 'human_intervention';
|
|
36
|
-
|
|
37
|
-
export type AIRunGateStatus = 'pass' | 'fail' | 'warn' | 'blocked' | 'skipped';
|
|
38
|
-
|
|
39
|
-
export type AIQaCheckStatus = 'pass' | 'fail' | 'blocked' | 'warn' | 'skipped' | 'unknown';
|
|
40
|
-
|
|
41
|
-
export type AIQaCompileStatus = 'pass' | 'fail' | 'blocked' | 'stale' | 'skipped' | 'unknown';
|
|
42
|
-
|
|
43
|
-
export type AIQaOutcome =
|
|
44
|
-
| 'infra_failed'
|
|
45
|
-
| 'compile_failed'
|
|
46
|
-
| 'route_failed'
|
|
47
|
-
| 'route_only_pass'
|
|
48
|
-
| 'business_assertion_passed'
|
|
49
|
-
| 'business_assertion_failed'
|
|
50
|
-
| 'incomplete';
|
|
51
|
-
|
|
52
|
-
export interface AIRunEvent {
|
|
53
|
-
id?: string;
|
|
54
|
-
type: AIRunEventType;
|
|
55
|
-
source?: AIRunSource | string;
|
|
56
|
-
message?: string;
|
|
57
|
-
category?: string;
|
|
58
|
-
artifactPaths?: string[];
|
|
59
|
-
metadata?: Record<string, any>;
|
|
60
|
-
recordedAt?: Date | string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface AIRunGateResult {
|
|
64
|
-
key: string;
|
|
65
|
-
label: string;
|
|
66
|
-
status: AIRunGateStatus;
|
|
67
|
-
reason: string;
|
|
68
|
-
evidenceRefs: string[];
|
|
69
|
-
recordedAt: string;
|
|
70
|
-
metadata?: Record<string, any>;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export interface AIRunCost {
|
|
74
|
-
inputTokens: number;
|
|
75
|
-
cachedInputTokens: number;
|
|
76
|
-
outputTokens: number;
|
|
77
|
-
totalTokens: number;
|
|
78
|
-
estimatedUsd: number;
|
|
79
|
-
models: string[];
|
|
80
|
-
categories: Record<string, {
|
|
81
|
-
inputTokens: number;
|
|
82
|
-
cachedInputTokens: number;
|
|
83
|
-
outputTokens: number;
|
|
84
|
-
totalTokens: number;
|
|
85
|
-
estimatedUsd: number;
|
|
86
|
-
count: number;
|
|
87
|
-
}>;
|
|
88
|
-
sources?: Record<string, {
|
|
89
|
-
inputTokens: number;
|
|
90
|
-
cachedInputTokens: number;
|
|
91
|
-
outputTokens: number;
|
|
92
|
-
totalTokens: number;
|
|
93
|
-
estimatedUsd: number;
|
|
94
|
-
count: number;
|
|
95
|
-
manualCount: number;
|
|
96
|
-
untrackedCount: number;
|
|
97
|
-
}>;
|
|
98
|
-
surfaces?: Record<string, {
|
|
99
|
-
totalTokens: number;
|
|
100
|
-
estimatedUsd: number;
|
|
101
|
-
count: number;
|
|
102
|
-
}>;
|
|
103
|
-
manualEstimatedUsd?: number;
|
|
104
|
-
untrackedEstimatedUsd?: number;
|
|
105
|
-
untrackedWarnings?: string[];
|
|
106
|
-
wallTimeMs?: number;
|
|
107
|
-
retries?: number;
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export interface OpenAIUsageCostEntry {
|
|
111
|
-
model?: string;
|
|
112
|
-
category?: string;
|
|
113
|
-
id_request?: string;
|
|
114
|
-
idRequest?: string;
|
|
115
|
-
id_conversation?: string;
|
|
116
|
-
idConversation?: string;
|
|
117
|
-
timestamp?: Date | string;
|
|
118
|
-
input_tokens?: number;
|
|
119
|
-
inputTokens?: number;
|
|
120
|
-
cached_input_tokens?: number;
|
|
121
|
-
cachedInputTokens?: number;
|
|
122
|
-
output_tokens?: number;
|
|
123
|
-
outputTokens?: number;
|
|
124
|
-
total_tokens?: number;
|
|
125
|
-
totalTokens?: number;
|
|
126
|
-
cost_estimate?: number;
|
|
127
|
-
estimatedUsd?: number;
|
|
128
|
-
usage_source?: string;
|
|
129
|
-
usageSource?: string;
|
|
130
|
-
usage_surface?: string;
|
|
131
|
-
usageSurface?: string;
|
|
132
|
-
usage_phase?: string;
|
|
133
|
-
usagePhase?: string;
|
|
134
|
-
cost_basis?: string;
|
|
135
|
-
costBasis?: string;
|
|
136
|
-
is_manual?: boolean;
|
|
137
|
-
isManual?: boolean;
|
|
138
|
-
is_untracked?: boolean;
|
|
139
|
-
isUntracked?: boolean;
|
|
140
|
-
untracked_reason?: string;
|
|
141
|
-
untrackedReason?: string;
|
|
142
|
-
[key: string]: any;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export interface AIQaInfraCheck {
|
|
146
|
-
name: string;
|
|
147
|
-
status: AIQaCheckStatus;
|
|
148
|
-
message?: string;
|
|
149
|
-
path?: string;
|
|
150
|
-
durationMs?: number;
|
|
151
|
-
metadata?: Record<string, any>;
|
|
152
|
-
checkedAt?: Date | string;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export interface AIQaCompileResult {
|
|
156
|
-
status: AIQaCompileStatus;
|
|
157
|
-
command?: string;
|
|
158
|
-
artifactPath?: string;
|
|
159
|
-
message?: string;
|
|
160
|
-
durationMs?: number;
|
|
161
|
-
staleEvidence?: boolean;
|
|
162
|
-
recordedAt?: Date | string;
|
|
163
|
-
metadata?: Record<string, any>;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
export interface AIQaRouteProbe {
|
|
167
|
-
route: string;
|
|
168
|
-
status: AIQaCheckStatus;
|
|
169
|
-
screenshot?: string;
|
|
170
|
-
caption?: string;
|
|
171
|
-
shellOnly?: boolean;
|
|
172
|
-
authenticated?: boolean;
|
|
173
|
-
consoleErrors?: string[];
|
|
174
|
-
networkErrors?: string[];
|
|
175
|
-
message?: string;
|
|
176
|
-
recordedAt?: Date | string;
|
|
177
|
-
metadata?: Record<string, any>;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
export interface AIQaBusinessAssertion {
|
|
181
|
-
assertion: string;
|
|
182
|
-
status: AIQaCheckStatus;
|
|
183
|
-
workflow?: string;
|
|
184
|
-
route?: string;
|
|
185
|
-
action?: string;
|
|
186
|
-
expected?: string;
|
|
187
|
-
observed?: string;
|
|
188
|
-
dataProof?: string;
|
|
189
|
-
mongoDelta?: Record<string, any>;
|
|
190
|
-
artifactPaths?: string[];
|
|
191
|
-
message?: string;
|
|
192
|
-
recordedAt?: Date | string;
|
|
193
|
-
metadata?: Record<string, any>;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
export interface AIQaArtifact {
|
|
197
|
-
type: 'screenshot' | 'trace' | 'console_log' | 'network_log' | 'coverage_matrix' | 'seed_data' | 'script' | 'other';
|
|
198
|
-
path?: string;
|
|
199
|
-
url?: string;
|
|
200
|
-
title?: string;
|
|
201
|
-
caption?: string;
|
|
202
|
-
metadata?: Record<string, any>;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export interface AIQaRun {
|
|
206
|
-
outcome: AIQaOutcome;
|
|
207
|
-
infraChecks: AIQaInfraCheck[];
|
|
208
|
-
compile?: AIQaCompileResult;
|
|
209
|
-
routeProbes: AIQaRouteProbe[];
|
|
210
|
-
businessAssertions: AIQaBusinessAssertion[];
|
|
211
|
-
artifacts: AIQaArtifact[];
|
|
212
|
-
gateResults: AIRunGateResult[];
|
|
213
|
-
updatedAt: string;
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
export interface AIRun {
|
|
217
|
-
id?: string;
|
|
218
|
-
source: AIRunSource;
|
|
219
|
-
sourceIds: Record<string, string>;
|
|
220
|
-
title?: string;
|
|
221
|
-
status?: string;
|
|
222
|
-
phase?: string;
|
|
223
|
-
startedAt?: Date | string;
|
|
224
|
-
completedAt?: Date | string;
|
|
225
|
-
outcome: AIRunOutcomeLabel;
|
|
226
|
-
events: AIRunEvent[];
|
|
227
|
-
gates: AIRunGateResult[];
|
|
228
|
-
qa?: AIQaRun;
|
|
229
|
-
cost?: AIRunCost;
|
|
230
|
-
nextAction?: string;
|
|
231
|
-
warnings?: string[];
|
|
232
|
-
metadata?: Record<string, any>;
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
export interface AIRunTrainingExample {
|
|
236
|
-
runId: string;
|
|
237
|
-
source: AIRunSource;
|
|
238
|
-
inputSummary: string;
|
|
239
|
-
actionSummary: string;
|
|
240
|
-
outcome: AIRunOutcomeLabel;
|
|
241
|
-
evidence: string[];
|
|
242
|
-
cost?: AIRunCost;
|
|
243
|
-
metadata?: Record<string, any>;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
export interface AIQaEvaluationInput {
|
|
247
|
-
infraChecks?: AIQaInfraCheck[];
|
|
248
|
-
compile?: AIQaCompileResult;
|
|
249
|
-
routeProbes?: AIQaRouteProbe[];
|
|
250
|
-
businessAssertions?: AIQaBusinessAssertion[];
|
|
251
|
-
artifacts?: AIQaArtifact[];
|
|
252
|
-
now?: Date | string;
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
export interface AIRunOutcomeInput {
|
|
256
|
-
source?: AIRunSource;
|
|
257
|
-
status?: string;
|
|
258
|
-
phase?: string;
|
|
259
|
-
qa?: AIQaRun | AIQaEvaluationInput;
|
|
260
|
-
gates?: AIRunGateResult[];
|
|
261
|
-
scorecardPassed?: boolean;
|
|
262
|
-
scorecardStatus?: string;
|
|
263
|
-
deployStatus?: string;
|
|
264
|
-
publishStatus?: string;
|
|
265
|
-
sampleDataStatus?: string;
|
|
266
|
-
manualHandoff?: boolean;
|
|
267
|
-
stopped?: boolean;
|
|
268
|
-
rejected?: boolean;
|
|
269
|
-
explicitAccepted?: boolean;
|
|
270
|
-
terminal?: boolean;
|
|
271
|
-
now?: Date | string;
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
export interface AIRunOutcomeDecision {
|
|
275
|
-
outcome: AIRunOutcomeLabel;
|
|
276
|
-
reason: string;
|
|
277
|
-
nextAction: string;
|
|
278
|
-
gates: AIRunGateResult[];
|
|
279
|
-
warnings: string[];
|
|
280
|
-
recordedAt: string;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
function isoNow(value?: Date | string): string {
|
|
284
|
-
if (value instanceof Date) {
|
|
285
|
-
return value.toISOString();
|
|
286
|
-
}
|
|
287
|
-
const parsed = value ? new Date(value) : new Date();
|
|
288
|
-
if (Number.isFinite(parsed.getTime())) {
|
|
289
|
-
return parsed.toISOString();
|
|
290
|
-
}
|
|
291
|
-
return new Date().toISOString();
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
function cleanText(value: any, max = 1000): string {
|
|
295
|
-
return String(value || '').replace(/\s+/g, ' ').trim().slice(0, max);
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
function cleanUsageNumber(value: any): number {
|
|
299
|
-
const parsed = Number(value);
|
|
300
|
-
return Number.isFinite(parsed) ? parsed : 0;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function cleanUsageDate(value: any): Date | undefined {
|
|
304
|
-
if (!value) {
|
|
305
|
-
return undefined;
|
|
306
|
-
}
|
|
307
|
-
const date = value instanceof Date ? value : new Date(value);
|
|
308
|
-
return Number.isFinite(date.getTime()) ? date : undefined;
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
export function isCumulativeCodexUsageEntry(entry: OpenAIUsageCostEntry): boolean {
|
|
312
|
-
return cleanText(entry?.category, 180).toLowerCase().startsWith('ai-dashboard-codex:');
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
export function resolveOpenAIUsageThreadKey(entry: OpenAIUsageCostEntry): string {
|
|
316
|
-
const conversationId = cleanText(entry?.id_conversation ?? entry?.idConversation, 240);
|
|
317
|
-
if (conversationId) {
|
|
318
|
-
return conversationId;
|
|
319
|
-
}
|
|
320
|
-
return cleanText(entry?.id_request ?? entry?.idRequest, 240);
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
export function normalizeOpenAIUsageRowsForCosting<T extends OpenAIUsageCostEntry>(rows: T[] = []): T[] {
|
|
324
|
-
if (!Array.isArray(rows) || !rows.length) {
|
|
325
|
-
return [];
|
|
326
|
-
}
|
|
327
|
-
const sortedRows = rows
|
|
328
|
-
.map((row, index) => ({
|
|
329
|
-
...row,
|
|
330
|
-
_sortIndex: index
|
|
331
|
-
}))
|
|
332
|
-
.sort((a, b) => {
|
|
333
|
-
const timeA = cleanUsageDate(a.timestamp)?.getTime() || 0;
|
|
334
|
-
const timeB = cleanUsageDate(b.timestamp)?.getTime() || 0;
|
|
335
|
-
if (timeA !== timeB) {
|
|
336
|
-
return timeA - timeB;
|
|
337
|
-
}
|
|
338
|
-
const requestCompare = cleanText(a.id_request ?? a.idRequest, 240)
|
|
339
|
-
.localeCompare(cleanText(b.id_request ?? b.idRequest, 240));
|
|
340
|
-
if (requestCompare) {
|
|
341
|
-
return requestCompare;
|
|
342
|
-
}
|
|
343
|
-
const conversationCompare = cleanText(a.id_conversation ?? a.idConversation, 240)
|
|
344
|
-
.localeCompare(cleanText(b.id_conversation ?? b.idConversation, 240));
|
|
345
|
-
if (conversationCompare) {
|
|
346
|
-
return conversationCompare;
|
|
347
|
-
}
|
|
348
|
-
return cleanUsageNumber(a._sortIndex) - cleanUsageNumber(b._sortIndex);
|
|
349
|
-
});
|
|
350
|
-
const previousByThread = new Map<string, {
|
|
351
|
-
inputTokens: number;
|
|
352
|
-
cachedInputTokens: number;
|
|
353
|
-
outputTokens: number;
|
|
354
|
-
totalTokens: number;
|
|
355
|
-
estimatedUsd: number;
|
|
356
|
-
}>();
|
|
357
|
-
return sortedRows.map((row) => {
|
|
358
|
-
const inputTokens = cleanUsageNumber(row.input_tokens ?? row.inputTokens);
|
|
359
|
-
const cachedInputTokens = cleanUsageNumber(row.cached_input_tokens ?? row.cachedInputTokens);
|
|
360
|
-
const outputTokens = cleanUsageNumber(row.output_tokens ?? row.outputTokens);
|
|
361
|
-
const totalTokens = cleanUsageNumber(row.total_tokens ?? row.totalTokens ?? (inputTokens + outputTokens));
|
|
362
|
-
const estimatedUsd = cleanUsageNumber(row.cost_estimate ?? row.estimatedUsd);
|
|
363
|
-
const threadKey = isCumulativeCodexUsageEntry(row) ? resolveOpenAIUsageThreadKey(row) : '';
|
|
364
|
-
let normalizedInputTokens = inputTokens;
|
|
365
|
-
let normalizedCachedInputTokens = cachedInputTokens;
|
|
366
|
-
let normalizedOutputTokens = outputTokens;
|
|
367
|
-
let normalizedTotalTokens = totalTokens;
|
|
368
|
-
let normalizedEstimatedUsd = estimatedUsd;
|
|
369
|
-
if (threadKey) {
|
|
370
|
-
const previous = previousByThread.get(threadKey);
|
|
371
|
-
if (previous
|
|
372
|
-
&& inputTokens >= previous.inputTokens
|
|
373
|
-
&& cachedInputTokens >= previous.cachedInputTokens
|
|
374
|
-
&& outputTokens >= previous.outputTokens
|
|
375
|
-
&& totalTokens >= previous.totalTokens
|
|
376
|
-
&& estimatedUsd >= previous.estimatedUsd
|
|
377
|
-
) {
|
|
378
|
-
normalizedInputTokens = Math.max(0, inputTokens - previous.inputTokens);
|
|
379
|
-
normalizedCachedInputTokens = Math.max(0, cachedInputTokens - previous.cachedInputTokens);
|
|
380
|
-
normalizedOutputTokens = Math.max(0, outputTokens - previous.outputTokens);
|
|
381
|
-
normalizedTotalTokens = Math.max(0, totalTokens - previous.totalTokens);
|
|
382
|
-
normalizedEstimatedUsd = Math.max(0, estimatedUsd - previous.estimatedUsd);
|
|
383
|
-
}
|
|
384
|
-
previousByThread.set(threadKey, {
|
|
385
|
-
inputTokens,
|
|
386
|
-
cachedInputTokens,
|
|
387
|
-
outputTokens,
|
|
388
|
-
totalTokens,
|
|
389
|
-
estimatedUsd
|
|
390
|
-
});
|
|
391
|
-
}
|
|
392
|
-
const resolvedTotalTokens = normalizedTotalTokens || (normalizedInputTokens + normalizedOutputTokens);
|
|
393
|
-
const resolvedEstimatedUsd = Number(normalizedEstimatedUsd.toFixed(6));
|
|
394
|
-
return {
|
|
395
|
-
...row,
|
|
396
|
-
input_tokens: normalizedInputTokens,
|
|
397
|
-
inputTokens: normalizedInputTokens,
|
|
398
|
-
cached_input_tokens: normalizedCachedInputTokens,
|
|
399
|
-
cachedInputTokens: normalizedCachedInputTokens,
|
|
400
|
-
output_tokens: normalizedOutputTokens,
|
|
401
|
-
outputTokens: normalizedOutputTokens,
|
|
402
|
-
total_tokens: resolvedTotalTokens,
|
|
403
|
-
totalTokens: resolvedTotalTokens,
|
|
404
|
-
cost_estimate: resolvedEstimatedUsd,
|
|
405
|
-
estimatedUsd: resolvedEstimatedUsd
|
|
406
|
-
} as T;
|
|
407
|
-
});
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
function cleanList(values: any, limit = 20, max = 500): string[] {
|
|
411
|
-
if (!Array.isArray(values)) {
|
|
412
|
-
return [];
|
|
413
|
-
}
|
|
414
|
-
const result: string[] = [];
|
|
415
|
-
for (const value of values) {
|
|
416
|
-
const normalized = cleanText(value, max);
|
|
417
|
-
if (normalized && !result.includes(normalized)) {
|
|
418
|
-
result.push(normalized);
|
|
419
|
-
}
|
|
420
|
-
if (result.length >= limit) {
|
|
421
|
-
break;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
return result;
|
|
425
|
-
}
|
|
426
|
-
|
|
427
|
-
function normalizeCheckStatus(value: any): AIQaCheckStatus {
|
|
428
|
-
const normalized = cleanText(value, 40).toLowerCase().replace(/[_\s-]+/g, '_');
|
|
429
|
-
if (normalized === 'passed' || normalized === 'ok' || normalized === 'ready') {
|
|
430
|
-
return 'pass';
|
|
431
|
-
}
|
|
432
|
-
if (normalized === 'failed' || normalized === 'error' || normalized === 'fail') {
|
|
433
|
-
return 'fail';
|
|
434
|
-
}
|
|
435
|
-
if (normalized === 'blocked' || normalized === 'dependency_blocked') {
|
|
436
|
-
return 'blocked';
|
|
437
|
-
}
|
|
438
|
-
if (normalized === 'warning') {
|
|
439
|
-
return 'warn';
|
|
440
|
-
}
|
|
441
|
-
if (normalized === 'skipped' || normalized === 'not_applicable') {
|
|
442
|
-
return 'skipped';
|
|
443
|
-
}
|
|
444
|
-
return normalized === 'pass' || normalized === 'warn' ? normalized : 'unknown';
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
function normalizeCompileStatus(value: any): AIQaCompileStatus {
|
|
448
|
-
const normalized = cleanText(value, 40).toLowerCase().replace(/[_\s-]+/g, '_');
|
|
449
|
-
if (normalized === 'passed' || normalized === 'ok') {
|
|
450
|
-
return 'pass';
|
|
451
|
-
}
|
|
452
|
-
if (normalized === 'failed' || normalized === 'error') {
|
|
453
|
-
return 'fail';
|
|
454
|
-
}
|
|
455
|
-
if (normalized === 'blocked') {
|
|
456
|
-
return 'blocked';
|
|
457
|
-
}
|
|
458
|
-
if (normalized === 'stale' || normalized === 'stale_evidence') {
|
|
459
|
-
return 'stale';
|
|
460
|
-
}
|
|
461
|
-
if (normalized === 'skipped' || normalized === 'not_applicable') {
|
|
462
|
-
return 'skipped';
|
|
463
|
-
}
|
|
464
|
-
return normalized === 'pass' || normalized === 'fail' ? normalized : 'unknown';
|
|
465
|
-
}
|
|
466
|
-
|
|
467
|
-
function makeGate(
|
|
468
|
-
key: string,
|
|
469
|
-
label: string,
|
|
470
|
-
status: AIRunGateStatus,
|
|
471
|
-
reason: string,
|
|
472
|
-
evidenceRefs: string[] = [],
|
|
473
|
-
now?: Date | string,
|
|
474
|
-
metadata?: Record<string, any>
|
|
475
|
-
): AIRunGateResult {
|
|
476
|
-
return {
|
|
477
|
-
key,
|
|
478
|
-
label,
|
|
479
|
-
status,
|
|
480
|
-
reason: cleanText(reason, 1400),
|
|
481
|
-
evidenceRefs: cleanList(evidenceRefs, 20, 500),
|
|
482
|
-
recordedAt: isoNow(now),
|
|
483
|
-
...(metadata ? { metadata } : {})
|
|
484
|
-
};
|
|
485
|
-
}
|
|
486
|
-
|
|
487
|
-
function failedOrBlocked(status: AIQaCheckStatus | AIQaCompileStatus): boolean {
|
|
488
|
-
return status === 'fail' || status === 'blocked';
|
|
489
|
-
}
|
|
490
|
-
|
|
491
|
-
function passed(status: AIQaCheckStatus | AIQaCompileStatus): boolean {
|
|
492
|
-
return status === 'pass';
|
|
493
|
-
}
|
|
494
|
-
|
|
495
|
-
function normalizeInfraChecks(values: AIQaInfraCheck[] | undefined): AIQaInfraCheck[] {
|
|
496
|
-
return (Array.isArray(values) ? values : []).map((entry) => ({
|
|
497
|
-
...entry,
|
|
498
|
-
name: cleanText(entry?.name, 120) || 'infra_check',
|
|
499
|
-
status: normalizeCheckStatus(entry?.status),
|
|
500
|
-
message: cleanText(entry?.message, 1000),
|
|
501
|
-
path: cleanText(entry?.path, 500)
|
|
502
|
-
}));
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
function normalizeRouteProbes(values: AIQaRouteProbe[] | undefined): AIQaRouteProbe[] {
|
|
506
|
-
return (Array.isArray(values) ? values : []).map((entry) => ({
|
|
507
|
-
...entry,
|
|
508
|
-
route: cleanText(entry?.route, 500) || '/',
|
|
509
|
-
status: normalizeCheckStatus(entry?.status),
|
|
510
|
-
screenshot: cleanText(entry?.screenshot, 500),
|
|
511
|
-
caption: cleanText(entry?.caption, 1000),
|
|
512
|
-
message: cleanText(entry?.message, 1000),
|
|
513
|
-
consoleErrors: cleanList(entry?.consoleErrors, 30, 500),
|
|
514
|
-
networkErrors: cleanList(entry?.networkErrors, 30, 500)
|
|
515
|
-
}));
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
function normalizeBusinessAssertions(values: AIQaBusinessAssertion[] | undefined): AIQaBusinessAssertion[] {
|
|
519
|
-
return (Array.isArray(values) ? values : []).map((entry) => ({
|
|
520
|
-
...entry,
|
|
521
|
-
assertion: cleanText(entry?.assertion, 1000) || 'business assertion',
|
|
522
|
-
status: normalizeCheckStatus(entry?.status),
|
|
523
|
-
workflow: cleanText(entry?.workflow, 400),
|
|
524
|
-
route: cleanText(entry?.route, 500),
|
|
525
|
-
action: cleanText(entry?.action, 500),
|
|
526
|
-
expected: cleanText(entry?.expected, 1000),
|
|
527
|
-
observed: cleanText(entry?.observed, 1000),
|
|
528
|
-
dataProof: cleanText(entry?.dataProof, 1400),
|
|
529
|
-
artifactPaths: cleanList(entry?.artifactPaths, 30, 500),
|
|
530
|
-
message: cleanText(entry?.message, 1000)
|
|
531
|
-
}));
|
|
532
|
-
}
|
|
533
|
-
|
|
534
|
-
function collectBusinessAssertionArtifactPaths(assertions: AIQaBusinessAssertion[]): string[] {
|
|
535
|
-
const paths: string[] = [];
|
|
536
|
-
for (const assertion of assertions) {
|
|
537
|
-
for (const artifactPath of assertion.artifactPaths || []) {
|
|
538
|
-
if (artifactPath && !paths.includes(artifactPath)) {
|
|
539
|
-
paths.push(artifactPath);
|
|
540
|
-
}
|
|
541
|
-
}
|
|
542
|
-
}
|
|
543
|
-
return paths;
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
export function buildAIQaRun(input: AIQaEvaluationInput = {}): AIQaRun {
|
|
547
|
-
const now = isoNow(input.now);
|
|
548
|
-
const infraChecks = normalizeInfraChecks(input.infraChecks);
|
|
549
|
-
const compile = input.compile
|
|
550
|
-
? {
|
|
551
|
-
...input.compile,
|
|
552
|
-
status: normalizeCompileStatus(input.compile.status),
|
|
553
|
-
command: cleanText(input.compile.command, 500),
|
|
554
|
-
artifactPath: cleanText(input.compile.artifactPath, 500),
|
|
555
|
-
message: cleanText(input.compile.message, 1000)
|
|
556
|
-
}
|
|
557
|
-
: undefined;
|
|
558
|
-
const routeProbes = normalizeRouteProbes(input.routeProbes);
|
|
559
|
-
const businessAssertions = normalizeBusinessAssertions(input.businessAssertions);
|
|
560
|
-
const artifacts = Array.isArray(input.artifacts) ? input.artifacts : [];
|
|
561
|
-
const gateResults: AIRunGateResult[] = [];
|
|
562
|
-
|
|
563
|
-
const failedInfra = infraChecks.filter((check) => failedOrBlocked(check.status));
|
|
564
|
-
if (failedInfra.length) {
|
|
565
|
-
gateResults.push(makeGate(
|
|
566
|
-
'qa_infra',
|
|
567
|
-
'QA infrastructure',
|
|
568
|
-
'blocked',
|
|
569
|
-
`QA infrastructure failed before model/business validation: ${failedInfra.map((check) => `${check.name}: ${check.message || check.status}`).join('; ')}`,
|
|
570
|
-
failedInfra.map((check) => check.path || '').filter(Boolean),
|
|
571
|
-
now,
|
|
572
|
-
{ failed_checks: failedInfra.map((check) => check.name) }
|
|
573
|
-
));
|
|
574
|
-
return { outcome: 'infra_failed', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
575
|
-
}
|
|
576
|
-
if (infraChecks.length) {
|
|
577
|
-
gateResults.push(makeGate('qa_infra', 'QA infrastructure', 'pass', 'QA infrastructure preflight checks passed.', [], now));
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
if (compile && (failedOrBlocked(compile.status) || compile.status === 'stale' || compile.staleEvidence === true)) {
|
|
581
|
-
gateResults.push(makeGate(
|
|
582
|
-
'qa_compile',
|
|
583
|
-
'Compile/build',
|
|
584
|
-
'fail',
|
|
585
|
-
compile.status === 'stale' || compile.staleEvidence === true
|
|
586
|
-
? 'Compile/build evidence is stale and cannot be used for acceptance.'
|
|
587
|
-
: (compile.message || 'Compile/build failed before browser QA.'),
|
|
588
|
-
compile.artifactPath ? [compile.artifactPath] : [],
|
|
589
|
-
now,
|
|
590
|
-
{ command: compile.command || '' }
|
|
591
|
-
));
|
|
592
|
-
return { outcome: 'compile_failed', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
593
|
-
}
|
|
594
|
-
if (compile && passed(compile.status)) {
|
|
595
|
-
gateResults.push(makeGate('qa_compile', 'Compile/build', 'pass', 'Compile/build evidence passed.', compile.artifactPath ? [compile.artifactPath] : [], now));
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
const failedRouteProbes = routeProbes.filter((probe) => failedOrBlocked(probe.status) || probe.shellOnly === true);
|
|
599
|
-
if (failedRouteProbes.length) {
|
|
600
|
-
gateResults.push(makeGate(
|
|
601
|
-
'qa_route_probe',
|
|
602
|
-
'Browser route probe',
|
|
603
|
-
'fail',
|
|
604
|
-
`Browser route probe failed or showed shell-only UI: ${failedRouteProbes.map((probe) => `${probe.route}: ${probe.message || probe.caption || probe.status}`).join('; ')}`,
|
|
605
|
-
failedRouteProbes.map((probe) => probe.screenshot || '').filter(Boolean),
|
|
606
|
-
now
|
|
607
|
-
));
|
|
608
|
-
return { outcome: 'route_failed', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
609
|
-
}
|
|
610
|
-
if (routeProbes.some((probe) => passed(probe.status))) {
|
|
611
|
-
gateResults.push(makeGate(
|
|
612
|
-
'qa_route_probe',
|
|
613
|
-
'Browser route probe',
|
|
614
|
-
'pass',
|
|
615
|
-
'Browser route reached authenticated application content. This is not business acceptance by itself.',
|
|
616
|
-
routeProbes.map((probe) => probe.screenshot || '').filter(Boolean),
|
|
617
|
-
now
|
|
618
|
-
));
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
const failedBusinessAssertions = businessAssertions.filter((assertion) => failedOrBlocked(assertion.status));
|
|
622
|
-
if (failedBusinessAssertions.length) {
|
|
623
|
-
gateResults.push(makeGate(
|
|
624
|
-
'qa_business_assertion',
|
|
625
|
-
'Business assertion',
|
|
626
|
-
'fail',
|
|
627
|
-
`Issue-specific workflow assertion failed: ${failedBusinessAssertions.map((assertion) => assertion.message || assertion.observed || assertion.assertion).join('; ')}`,
|
|
628
|
-
collectBusinessAssertionArtifactPaths(failedBusinessAssertions),
|
|
629
|
-
now
|
|
630
|
-
));
|
|
631
|
-
return { outcome: 'business_assertion_failed', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
const passedBusinessAssertions = businessAssertions.filter((assertion) => passed(assertion.status));
|
|
635
|
-
if (passedBusinessAssertions.length) {
|
|
636
|
-
gateResults.push(makeGate(
|
|
637
|
-
'qa_business_assertion',
|
|
638
|
-
'Business assertion',
|
|
639
|
-
'pass',
|
|
640
|
-
'At least one issue-specific workflow/data assertion passed.',
|
|
641
|
-
collectBusinessAssertionArtifactPaths(passedBusinessAssertions),
|
|
642
|
-
now,
|
|
643
|
-
{ passed_assertions: passedBusinessAssertions.map((assertion) => assertion.assertion) }
|
|
644
|
-
));
|
|
645
|
-
return { outcome: 'business_assertion_passed', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
if (routeProbes.some((probe) => passed(probe.status))) {
|
|
649
|
-
gateResults.push(makeGate(
|
|
650
|
-
'qa_business_assertion',
|
|
651
|
-
'Business assertion',
|
|
652
|
-
'blocked',
|
|
653
|
-
'Browser route loaded, but no issue-specific business assertion passed. Route-only proof cannot accept the run.',
|
|
654
|
-
[],
|
|
655
|
-
now
|
|
656
|
-
));
|
|
657
|
-
return { outcome: 'route_only_pass', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
658
|
-
}
|
|
659
|
-
|
|
660
|
-
gateResults.push(makeGate(
|
|
661
|
-
'qa_business_assertion',
|
|
662
|
-
'Business assertion',
|
|
663
|
-
'blocked',
|
|
664
|
-
'No issue-specific QA assertion was recorded.',
|
|
665
|
-
[],
|
|
666
|
-
now
|
|
667
|
-
));
|
|
668
|
-
return { outcome: 'incomplete', infraChecks, compile, routeProbes, businessAssertions, artifacts, gateResults, updatedAt: now };
|
|
669
|
-
}
|
|
670
|
-
|
|
671
|
-
function normalizeQaRun(input?: AIQaRun | AIQaEvaluationInput): AIQaRun | undefined {
|
|
672
|
-
if (!input) {
|
|
673
|
-
return undefined;
|
|
674
|
-
}
|
|
675
|
-
if ((input as AIQaRun).outcome && Array.isArray((input as AIQaRun).gateResults)) {
|
|
676
|
-
return input as AIQaRun;
|
|
677
|
-
}
|
|
678
|
-
return buildAIQaRun(input as AIQaEvaluationInput);
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
function statusLooksFailed(value: any): boolean {
|
|
682
|
-
const normalized = cleanText(value, 120).toLowerCase();
|
|
683
|
-
return !!normalized && /(fail|failed|error|blocked|missing|empty|stale|skipped|not ready|not_ready|could not|cannot)/i.test(normalized);
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
function statusLooksPassed(value: any): boolean {
|
|
687
|
-
const normalized = cleanText(value, 120).toLowerCase();
|
|
688
|
-
return !!normalized && /(pass|passed|success|complete|completed|ready|published|deployed|live|merged)/i.test(normalized);
|
|
689
|
-
}
|
|
690
|
-
|
|
691
|
-
function addGateOnce(gates: AIRunGateResult[], gate: AIRunGateResult): void {
|
|
692
|
-
if (gates.some((entry) => entry.key === gate.key && entry.status === gate.status && entry.reason === gate.reason)) {
|
|
693
|
-
return;
|
|
694
|
-
}
|
|
695
|
-
gates.push(gate);
|
|
696
|
-
}
|
|
697
|
-
|
|
698
|
-
export function classifyAIRunOutcome(input: AIRunOutcomeInput = {}): AIRunOutcomeDecision {
|
|
699
|
-
const now = isoNow(input.now);
|
|
700
|
-
const gates = Array.isArray(input.gates) ? [...input.gates] : [];
|
|
701
|
-
const warnings: string[] = [];
|
|
702
|
-
const qa = normalizeQaRun(input.qa);
|
|
703
|
-
if (qa) {
|
|
704
|
-
for (const gate of qa.gateResults) {
|
|
705
|
-
addGateOnce(gates, gate);
|
|
706
|
-
}
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
const supportParkedByStatus = input.source === 'support_ticket'
|
|
710
|
-
&& (input.manualHandoff === true || input.stopped === true || /stop|stopped|cancel|cancelled|paused|handoff/i.test(`${input.status || ''} ${input.phase || ''}`));
|
|
711
|
-
if (supportParkedByStatus) {
|
|
712
|
-
const blockedSupportAutoloopNoProgressGate = gates.find((gate) => gate.key === 'support_autoloop_no_progress' && gate.status === 'blocked');
|
|
713
|
-
if (blockedSupportAutoloopNoProgressGate) {
|
|
714
|
-
return {
|
|
715
|
-
outcome: 'manual_handoff',
|
|
716
|
-
reason: `Support autoloop parked before another repair loop because no new evidence was recorded: ${blockedSupportAutoloopNoProgressGate.reason}`,
|
|
717
|
-
nextAction: 'Collect new material evidence, rerun read-only diagnosis or issue-class proof, then resume only if the blocker fingerprint changes.',
|
|
718
|
-
gates,
|
|
719
|
-
warnings,
|
|
720
|
-
recordedAt: now
|
|
721
|
-
};
|
|
722
|
-
}
|
|
723
|
-
const blockedSupportAutoloopApprovalGate = gates.find((gate) => gate.key === 'support_autoloop_approval_block' && gate.status === 'blocked');
|
|
724
|
-
if (blockedSupportAutoloopApprovalGate) {
|
|
725
|
-
const nextAction = cleanText(blockedSupportAutoloopApprovalGate.metadata?.nextAction, 160)
|
|
726
|
-
|| cleanText(blockedSupportAutoloopApprovalGate.metadata?.action, 160);
|
|
727
|
-
const elapsedReapproval = blockedSupportAutoloopApprovalGate.metadata?.requiresElapsedReapproval === true;
|
|
728
|
-
return {
|
|
729
|
-
outcome: 'manual_handoff',
|
|
730
|
-
reason: `Support autoloop parked before another repair loop because approval/scope is blocked: ${blockedSupportAutoloopApprovalGate.reason}`,
|
|
731
|
-
nextAction: elapsedReapproval
|
|
732
|
-
? 'Approve continued runtime beyond the current wall-clock boundary or park the ticket for manual review; do not run another model/code/QA continuation until that decision is recorded.'
|
|
733
|
-
: nextAction
|
|
734
|
-
? `Run ${nextAction} or revise the blocked scope, then resume the approved autoloop toward A-grade QA/business proof.`
|
|
735
|
-
: 'Approve the blocked support autonomy scope or revise the diagnosis, owner files, planned change, estimate, or classification before the autoloop continues.',
|
|
736
|
-
gates,
|
|
737
|
-
warnings,
|
|
738
|
-
recordedAt: now
|
|
739
|
-
};
|
|
740
|
-
}
|
|
741
|
-
const blockedSupportAutonomyApprovalGate = gates.find((gate) => gate.key === 'support_autonomy_approval' && gate.status === 'blocked');
|
|
742
|
-
if (blockedSupportAutonomyApprovalGate) {
|
|
743
|
-
return {
|
|
744
|
-
outcome: 'manual_handoff',
|
|
745
|
-
reason: `Support autonomy is waiting on operator approval or revised intake/diagnosis scope: ${blockedSupportAutonomyApprovalGate.reason}`,
|
|
746
|
-
nextAction: blockedSupportAutonomyApprovalGate.metadata?.approvalAction
|
|
747
|
-
? `Use ${blockedSupportAutonomyApprovalGate.metadata.approvalAction} or revise the blocked scope, then allow the runner to continue until A-grade QA/business proof.`
|
|
748
|
-
: 'Approve the bounded support autonomy request or revise classification, estimate, owner files, or diagnosis scope before product-code repair.',
|
|
749
|
-
gates,
|
|
750
|
-
warnings,
|
|
751
|
-
recordedAt: now
|
|
752
|
-
};
|
|
753
|
-
}
|
|
754
|
-
const blockedSupportProductRepairDispatchGate = gates.find((gate) => gate.key === 'support_product_repair_dispatch_guard' && gate.status === 'blocked');
|
|
755
|
-
if (blockedSupportProductRepairDispatchGate) {
|
|
756
|
-
return {
|
|
757
|
-
outcome: 'manual_handoff',
|
|
758
|
-
reason: `Support product-code repair dispatch is blocked by the approval/scope guard: ${blockedSupportProductRepairDispatchGate.reason}`,
|
|
759
|
-
nextAction: blockedSupportProductRepairDispatchGate.metadata?.nextAction
|
|
760
|
-
? `Run ${blockedSupportProductRepairDispatchGate.metadata.nextAction} before product-code repair continues.`
|
|
761
|
-
: 'Approve the current support autonomy scope or revise the diagnosis/owner-file set before product-code repair continues.',
|
|
762
|
-
gates,
|
|
763
|
-
warnings,
|
|
764
|
-
recordedAt: now
|
|
765
|
-
};
|
|
766
|
-
}
|
|
767
|
-
const blockedSupportHumanDecisionGate = gates.find((gate) => gate.key === 'support_human_decision_request' && gate.status === 'blocked');
|
|
768
|
-
if (blockedSupportHumanDecisionGate) {
|
|
769
|
-
return {
|
|
770
|
-
outcome: 'manual_handoff',
|
|
771
|
-
reason: `Support run is waiting on a specific operator decision: ${blockedSupportHumanDecisionGate.reason}`,
|
|
772
|
-
nextAction: blockedSupportHumanDecisionGate.metadata?.preferredChoiceId
|
|
773
|
-
? `Choose ${blockedSupportHumanDecisionGate.metadata.preferredChoiceId} or an equivalent safe console action, then resume the runner.`
|
|
774
|
-
: 'Answer the requested support runner decision, then resume the runner.',
|
|
775
|
-
gates,
|
|
776
|
-
warnings,
|
|
777
|
-
recordedAt: now
|
|
778
|
-
};
|
|
779
|
-
}
|
|
780
|
-
}
|
|
781
|
-
|
|
782
|
-
if (input.manualHandoff === true) {
|
|
783
|
-
return {
|
|
784
|
-
outcome: 'manual_handoff',
|
|
785
|
-
reason: 'Run requires manual handoff.',
|
|
786
|
-
nextAction: 'Ask a human operator to resolve the blocked run.',
|
|
787
|
-
gates,
|
|
788
|
-
warnings,
|
|
789
|
-
recordedAt: now
|
|
790
|
-
};
|
|
791
|
-
}
|
|
792
|
-
if (input.stopped === true || /stop|stopped|cancel|cancelled|paused/i.test(`${input.status || ''} ${input.phase || ''}`)) {
|
|
793
|
-
return {
|
|
794
|
-
outcome: 'stopped',
|
|
795
|
-
reason: 'Run was stopped before accepted evidence was recorded.',
|
|
796
|
-
nextAction: 'Resume or restart only if the request is still active.',
|
|
797
|
-
gates,
|
|
798
|
-
warnings,
|
|
799
|
-
recordedAt: now
|
|
800
|
-
};
|
|
801
|
-
}
|
|
802
|
-
if (input.rejected === true) {
|
|
803
|
-
return {
|
|
804
|
-
outcome: 'rejected',
|
|
805
|
-
reason: 'Run was explicitly rejected.',
|
|
806
|
-
nextAction: 'Start a repair run from the failing evidence.',
|
|
807
|
-
gates,
|
|
808
|
-
warnings,
|
|
809
|
-
recordedAt: now
|
|
810
|
-
};
|
|
811
|
-
}
|
|
812
|
-
|
|
813
|
-
const blockedHotfixCommitGate = gates.find((gate) => gate.key === 'hotfix_commit_proof' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
814
|
-
if (blockedHotfixCommitGate) {
|
|
815
|
-
return {
|
|
816
|
-
outcome: 'release_blocked',
|
|
817
|
-
reason: `Hotfix cannot be treated as durable until GitHub commit proof passes: ${blockedHotfixCommitGate.reason}`,
|
|
818
|
-
nextAction: 'Commit and push the hotfix to GitHub, record sourceCommitSha/githubCommitUrl/gitCommitStatus/gitPushStatus, then rerun the smallest release gate.',
|
|
819
|
-
gates,
|
|
820
|
-
warnings,
|
|
821
|
-
recordedAt: now
|
|
822
|
-
};
|
|
823
|
-
}
|
|
824
|
-
const blockedNoBlindLoopGate = gates.find((gate) => gate.key === 'manager_no_blind_loop_policy' && gate.status === 'blocked');
|
|
825
|
-
if (blockedNoBlindLoopGate) {
|
|
826
|
-
return {
|
|
827
|
-
outcome: 'manual_handoff',
|
|
828
|
-
reason: `Manager parked the run to avoid a blind loop: ${blockedNoBlindLoopGate.reason}`,
|
|
829
|
-
nextAction: 'Collect new material evidence or approve the specific recovery decision before any more model/code repair.',
|
|
830
|
-
gates,
|
|
831
|
-
warnings,
|
|
832
|
-
recordedAt: now
|
|
833
|
-
};
|
|
834
|
-
}
|
|
835
|
-
const blockedSupportAutoloopNoProgressGate = gates.find((gate) => gate.key === 'support_autoloop_no_progress' && gate.status === 'blocked');
|
|
836
|
-
if (input.source === 'support_ticket' && blockedSupportAutoloopNoProgressGate) {
|
|
837
|
-
return {
|
|
838
|
-
outcome: 'manual_handoff',
|
|
839
|
-
reason: `Support autoloop parked before another repair loop because no new evidence was recorded: ${blockedSupportAutoloopNoProgressGate.reason}`,
|
|
840
|
-
nextAction: 'Collect new material evidence, rerun read-only diagnosis or issue-class proof, then resume only if the blocker fingerprint changes.',
|
|
841
|
-
gates,
|
|
842
|
-
warnings,
|
|
843
|
-
recordedAt: now
|
|
844
|
-
};
|
|
845
|
-
}
|
|
846
|
-
const blockedSupportDiagnosisBeforeRepairGate = gates.find((gate) => gate.key === 'support_diagnosis_before_repair' && gate.status === 'blocked');
|
|
847
|
-
if (blockedSupportDiagnosisBeforeRepairGate) {
|
|
848
|
-
return {
|
|
849
|
-
outcome: 'manual_handoff',
|
|
850
|
-
reason: `Support repair is parked until root-cause diagnosis validates: ${blockedSupportDiagnosisBeforeRepairGate.reason}`,
|
|
851
|
-
nextAction: 'Run read-only support diagnosis, record support_diagnosis_gate with owner_files and before/action/after proof, then retry only the owner-scoped repair.',
|
|
852
|
-
gates,
|
|
853
|
-
warnings,
|
|
854
|
-
recordedAt: now
|
|
855
|
-
};
|
|
856
|
-
}
|
|
857
|
-
const blockedSupportOwnerFileScopeGate = gates.find((gate) => gate.key === 'support_owner_file_scope' && gate.status === 'blocked');
|
|
858
|
-
if (blockedSupportOwnerFileScopeGate) {
|
|
859
|
-
return {
|
|
860
|
-
outcome: 'manual_handoff',
|
|
861
|
-
reason: `Support repair exceeded the diagnosed owner-file scope: ${blockedSupportOwnerFileScopeGate.reason}`,
|
|
862
|
-
nextAction: 'Revise the SupportDiagnosisGate with evidence for each new owner file, update failing_path/proof_plan, then run only the bounded owner-scoped repair.',
|
|
863
|
-
gates,
|
|
864
|
-
warnings,
|
|
865
|
-
recordedAt: now
|
|
866
|
-
};
|
|
867
|
-
}
|
|
868
|
-
const blockedSupportIntakeRevisionGate = gates.find((gate) => gate.key === 'support_intake_revision_contract' && gate.status === 'blocked');
|
|
869
|
-
if (input.source === 'support_ticket' && blockedSupportIntakeRevisionGate) {
|
|
870
|
-
const requiredOperatorAction = cleanText(blockedSupportIntakeRevisionGate.metadata?.requiredOperatorAction, 160);
|
|
871
|
-
return {
|
|
872
|
-
outcome: 'manual_handoff',
|
|
873
|
-
reason: `Support intake/classification changed after approval: ${blockedSupportIntakeRevisionGate.reason}`,
|
|
874
|
-
nextAction: requiredOperatorAction
|
|
875
|
-
? `Run ${requiredOperatorAction} to approve the revised intake/scope before product-code repair continues.`
|
|
876
|
-
: 'Approve the revised support intake/scope before product-code repair continues.',
|
|
877
|
-
gates,
|
|
878
|
-
warnings,
|
|
879
|
-
recordedAt: now
|
|
880
|
-
};
|
|
881
|
-
}
|
|
882
|
-
const blockedSupportAutoloopApprovalGate = gates.find((gate) => gate.key === 'support_autoloop_approval_block' && gate.status === 'blocked');
|
|
883
|
-
if (input.source === 'support_ticket' && blockedSupportAutoloopApprovalGate) {
|
|
884
|
-
const nextAction = cleanText(blockedSupportAutoloopApprovalGate.metadata?.nextAction, 160)
|
|
885
|
-
|| cleanText(blockedSupportAutoloopApprovalGate.metadata?.action, 160);
|
|
886
|
-
const elapsedReapproval = blockedSupportAutoloopApprovalGate.metadata?.requiresElapsedReapproval === true;
|
|
887
|
-
return {
|
|
888
|
-
outcome: 'manual_handoff',
|
|
889
|
-
reason: `Support autoloop parked before another repair loop because approval/scope is blocked: ${blockedSupportAutoloopApprovalGate.reason}`,
|
|
890
|
-
nextAction: elapsedReapproval
|
|
891
|
-
? 'Approve continued runtime beyond the current wall-clock boundary or park the ticket for manual review; do not run another model/code/QA continuation until that decision is recorded.'
|
|
892
|
-
: nextAction
|
|
893
|
-
? `Run ${nextAction} or revise the blocked scope, then resume the approved autoloop toward A-grade QA/business proof.`
|
|
894
|
-
: 'Approve the blocked support autonomy scope or revise the diagnosis, owner files, planned change, estimate, or classification before the autoloop continues.',
|
|
895
|
-
gates,
|
|
896
|
-
warnings,
|
|
897
|
-
recordedAt: now
|
|
898
|
-
};
|
|
899
|
-
}
|
|
900
|
-
const blockedSupportAutonomyApprovalGate = gates.find((gate) => gate.key === 'support_autonomy_approval' && gate.status === 'blocked');
|
|
901
|
-
if (input.source === 'support_ticket' && blockedSupportAutonomyApprovalGate) {
|
|
902
|
-
return {
|
|
903
|
-
outcome: 'manual_handoff',
|
|
904
|
-
reason: `Support autonomy is waiting on operator approval or revised intake/diagnosis scope: ${blockedSupportAutonomyApprovalGate.reason}`,
|
|
905
|
-
nextAction: blockedSupportAutonomyApprovalGate.metadata?.approvalAction
|
|
906
|
-
? `Use ${blockedSupportAutonomyApprovalGate.metadata.approvalAction} or revise the blocked scope, then allow the runner to continue until A-grade QA/business proof.`
|
|
907
|
-
: 'Approve the bounded support autonomy request or revise classification, estimate, owner files, or diagnosis scope before product-code repair.',
|
|
908
|
-
gates,
|
|
909
|
-
warnings,
|
|
910
|
-
recordedAt: now
|
|
911
|
-
};
|
|
912
|
-
}
|
|
913
|
-
const blockedSupportProductRepairDispatchGate = gates.find((gate) => gate.key === 'support_product_repair_dispatch_guard' && gate.status === 'blocked');
|
|
914
|
-
if (input.source === 'support_ticket' && blockedSupportProductRepairDispatchGate) {
|
|
915
|
-
return {
|
|
916
|
-
outcome: 'manual_handoff',
|
|
917
|
-
reason: `Support product-code repair dispatch is blocked by the approval/scope guard: ${blockedSupportProductRepairDispatchGate.reason}`,
|
|
918
|
-
nextAction: blockedSupportProductRepairDispatchGate.metadata?.nextAction
|
|
919
|
-
? `Run ${blockedSupportProductRepairDispatchGate.metadata.nextAction} before product-code repair continues.`
|
|
920
|
-
: 'Approve the current support autonomy scope or revise the diagnosis/owner-file set before product-code repair continues.',
|
|
921
|
-
gates,
|
|
922
|
-
warnings,
|
|
923
|
-
recordedAt: now
|
|
924
|
-
};
|
|
925
|
-
}
|
|
926
|
-
const blockedSupportHumanDecisionGate = gates.find((gate) => gate.key === 'support_human_decision_request' && gate.status === 'blocked');
|
|
927
|
-
if (input.source === 'support_ticket' && blockedSupportHumanDecisionGate) {
|
|
928
|
-
return {
|
|
929
|
-
outcome: 'manual_handoff',
|
|
930
|
-
reason: `Support run is waiting on a specific operator decision: ${blockedSupportHumanDecisionGate.reason}`,
|
|
931
|
-
nextAction: blockedSupportHumanDecisionGate.metadata?.preferredChoiceId
|
|
932
|
-
? `Choose ${blockedSupportHumanDecisionGate.metadata.preferredChoiceId} or an equivalent safe console action, then resume the runner.`
|
|
933
|
-
: 'Answer the requested support runner decision, then resume the runner.',
|
|
934
|
-
gates,
|
|
935
|
-
warnings,
|
|
936
|
-
recordedAt: now
|
|
937
|
-
};
|
|
938
|
-
}
|
|
939
|
-
const blockedSupportPostApprovalResumeAttemptGate = gates.find((gate) => gate.key === 'support_post_approval_resume_attempt' && gate.status === 'blocked');
|
|
940
|
-
if (input.source === 'support_ticket' && blockedSupportPostApprovalResumeAttemptGate) {
|
|
941
|
-
const nextAction = cleanText(blockedSupportPostApprovalResumeAttemptGate.metadata?.nextAction, 160);
|
|
942
|
-
const failureClass = cleanText(blockedSupportPostApprovalResumeAttemptGate.metadata?.failureClass, 160);
|
|
943
|
-
return {
|
|
944
|
-
outcome: 'manual_handoff',
|
|
945
|
-
reason: `Approved support autoloop resume did not start: ${blockedSupportPostApprovalResumeAttemptGate.reason}`,
|
|
946
|
-
nextAction: nextAction
|
|
947
|
-
? `Review ${failureClass || 'resume blocker'} and run ${nextAction} only after the blocker fingerprint changes; product repair and customer reply remain blocked.`
|
|
948
|
-
: 'Review the approved autoloop resume blocker and require a changed blocker fingerprint before another retry.',
|
|
949
|
-
gates,
|
|
950
|
-
warnings,
|
|
951
|
-
recordedAt: now
|
|
952
|
-
};
|
|
953
|
-
}
|
|
954
|
-
const blockedSupportPostApprovalAutostartGate = gates.find((gate) => gate.key === 'support_post_approval_autostart' && gate.status === 'blocked');
|
|
955
|
-
if (input.source === 'support_ticket' && blockedSupportPostApprovalAutostartGate) {
|
|
956
|
-
const nextAction = cleanText(blockedSupportPostApprovalAutostartGate.metadata?.nextAction, 160);
|
|
957
|
-
const canRetryWithoutReapproval = blockedSupportPostApprovalAutostartGate.metadata?.canRetryWithoutReapproval === true;
|
|
958
|
-
const safeRetryAction = cleanText(blockedSupportPostApprovalAutostartGate.metadata?.safeRetryAction, 160);
|
|
959
|
-
return {
|
|
960
|
-
outcome: 'manual_handoff',
|
|
961
|
-
reason: `Support autonomy was approved, but the post-approval autostart did not begin: ${blockedSupportPostApprovalAutostartGate.reason}`,
|
|
962
|
-
nextAction: canRetryWithoutReapproval && safeRetryAction === 'run_autoloop'
|
|
963
|
-
? 'Retry the approved auto-improve loop under the same approval/scope fingerprint; no product repair or customer reply is allowed until the loop starts and records proof.'
|
|
964
|
-
: nextAction === 'resolve_autostart_blocker'
|
|
965
|
-
? 'Resolve the autostart blocker or clear the active run, then rerun runSupportTicketAutoImproveLoopManual under the approved scope until A-grade PR proof.'
|
|
966
|
-
: 'Review the post-approval autostart result, then resume the approved auto-improve loop without changing scope.',
|
|
967
|
-
gates,
|
|
968
|
-
warnings,
|
|
969
|
-
recordedAt: now
|
|
970
|
-
};
|
|
971
|
-
}
|
|
972
|
-
|
|
973
|
-
if (qa?.outcome === 'infra_failed') {
|
|
974
|
-
return {
|
|
975
|
-
outcome: 'qa_infra_failed',
|
|
976
|
-
reason: 'QA infrastructure failed before product validation.',
|
|
977
|
-
nextAction: 'Repair QA harness dependencies, ports, browser, Mongo, or startup before another model repair loop.',
|
|
978
|
-
gates,
|
|
979
|
-
warnings,
|
|
980
|
-
recordedAt: now
|
|
981
|
-
};
|
|
982
|
-
}
|
|
983
|
-
if (qa?.outcome === 'compile_failed') {
|
|
984
|
-
return {
|
|
985
|
-
outcome: 'build_failed',
|
|
986
|
-
reason: 'Compile/build evidence failed or was stale.',
|
|
987
|
-
nextAction: 'Repair compile/build first, then rerun QA from the same failed step.',
|
|
988
|
-
gates,
|
|
989
|
-
warnings,
|
|
990
|
-
recordedAt: now
|
|
991
|
-
};
|
|
992
|
-
}
|
|
993
|
-
if (qa?.outcome === 'route_failed') {
|
|
994
|
-
return {
|
|
995
|
-
outcome: 'qa_incomplete',
|
|
996
|
-
reason: 'Browser route probe failed before business proof.',
|
|
997
|
-
nextAction: 'Repair route/auth/startup issue and rerun the same browser route probe.',
|
|
998
|
-
gates,
|
|
999
|
-
warnings,
|
|
1000
|
-
recordedAt: now
|
|
1001
|
-
};
|
|
1002
|
-
}
|
|
1003
|
-
const blockedAICoderJourneyContractGate = gates.find((gate) => gate.key === 'aicoder_journey_contract' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
1004
|
-
if (blockedAICoderJourneyContractGate) {
|
|
1005
|
-
const claimedSuccess = input.explicitAccepted === true || input.scorecardPassed === true || statusLooksPassed(input.scorecardStatus) || statusLooksPassed(`${input.status || ''} ${input.phase || ''}`);
|
|
1006
|
-
return {
|
|
1007
|
-
outcome: claimedSuccess ? 'false_pass' : 'qa_incomplete',
|
|
1008
|
-
reason: claimedSuccess
|
|
1009
|
-
? `AICoder run claimed success without a valid Journey Contract: ${blockedAICoderJourneyContractGate.reason}`
|
|
1010
|
-
: `AICoder workflow is blocked until the Journey Contract validates: ${blockedAICoderJourneyContractGate.reason}`,
|
|
1011
|
-
nextAction: 'Generate or repair docs/APP_JOURNEY_CONTRACT.md, validate first/next/last workflow/data story/QA assertions, then rerun workflow build and workflow QA.',
|
|
1012
|
-
gates,
|
|
1013
|
-
warnings,
|
|
1014
|
-
recordedAt: now
|
|
1015
|
-
};
|
|
1016
|
-
}
|
|
1017
|
-
const blockedSupportNextActionContractGate = gates.find((gate) => gate.key === 'support_next_action_contract' && gate.status === 'blocked');
|
|
1018
|
-
if (
|
|
1019
|
-
blockedSupportNextActionContractGate
|
|
1020
|
-
&& qa?.outcome !== 'business_assertion_passed'
|
|
1021
|
-
&& input.scorecardPassed !== true
|
|
1022
|
-
&& !statusLooksPassed(input.scorecardStatus)
|
|
1023
|
-
) {
|
|
1024
|
-
return {
|
|
1025
|
-
outcome: 'manual_handoff',
|
|
1026
|
-
reason: `Support manager cannot safely continue without a valid next-action contract: ${blockedSupportNextActionContractGate.reason}`,
|
|
1027
|
-
nextAction: 'Record one validated next-action contract with safeToAutoRun, canRunWithoutCodexMonitor, codexFallbackRequired, preconditions, stop conditions, and success evidence before another autonomous recovery.',
|
|
1028
|
-
gates,
|
|
1029
|
-
warnings,
|
|
1030
|
-
recordedAt: now
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
1033
|
-
const blockedSupportIssueClassProbePlanGate = gates.find((gate) => gate.key === 'support_issue_class_probe_plan' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
1034
|
-
if (input.source === 'support_ticket' && blockedSupportIssueClassProbePlanGate) {
|
|
1035
|
-
const claimedSuccess = input.explicitAccepted === true
|
|
1036
|
-
|| input.scorecardPassed === true
|
|
1037
|
-
|| statusLooksPassed(input.scorecardStatus)
|
|
1038
|
-
|| statusLooksPassed(`${input.status || ''} ${input.phase || ''}`);
|
|
1039
|
-
return {
|
|
1040
|
-
outcome: claimedSuccess ? 'false_pass' : 'qa_incomplete',
|
|
1041
|
-
reason: claimedSuccess
|
|
1042
|
-
? `Support run claimed success without a valid issue-class probe plan: ${blockedSupportIssueClassProbePlanGate.reason}`
|
|
1043
|
-
: `Support business proof is blocked until the issue-class probe plan validates: ${blockedSupportIssueClassProbePlanGate.reason}`,
|
|
1044
|
-
nextAction: 'Generate or repair the Support IssueClassProbePlan from the diagnosis proof_plan, then rerun issue-specific business proof QA.',
|
|
1045
|
-
gates,
|
|
1046
|
-
warnings,
|
|
1047
|
-
recordedAt: now
|
|
1048
|
-
};
|
|
1049
|
-
}
|
|
1050
|
-
const blockedAssistantAnswerActionabilityGate = gates.find((gate) => gate.key === 'assistant_answer_actionability' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
1051
|
-
if (input.source === 'ai_assistant' && blockedAssistantAnswerActionabilityGate) {
|
|
1052
|
-
const claimedSuccess = input.explicitAccepted === true
|
|
1053
|
-
|| statusLooksPassed(`${input.status || ''} ${input.phase || ''}`);
|
|
1054
|
-
return {
|
|
1055
|
-
outcome: claimedSuccess ? 'false_pass' : 'qa_incomplete',
|
|
1056
|
-
reason: claimedSuccess
|
|
1057
|
-
? `Assistant answer was marked accepted without a valid actionability contract: ${blockedAssistantAnswerActionabilityGate.reason}`
|
|
1058
|
-
: `Assistant answer is blocked until actionability evidence validates: ${blockedAssistantAnswerActionabilityGate.reason}`,
|
|
1059
|
-
nextAction: 'Record verified query/date/permission/citation/confidence evidence and one assistant actionability contract before answering or drafting customer-facing text.',
|
|
1060
|
-
gates,
|
|
1061
|
-
warnings,
|
|
1062
|
-
recordedAt: now
|
|
1063
|
-
};
|
|
1064
|
-
}
|
|
1065
|
-
if (qa?.outcome === 'route_only_pass' || qa?.outcome === 'incomplete') {
|
|
1066
|
-
return {
|
|
1067
|
-
outcome: input.scorecardPassed === true ? 'false_pass' : 'qa_incomplete',
|
|
1068
|
-
reason: input.scorecardPassed === true
|
|
1069
|
-
? 'Scorecard or workflow status passed without issue-specific business assertion proof.'
|
|
1070
|
-
: 'QA has not recorded issue-specific business assertion proof.',
|
|
1071
|
-
nextAction: 'Add before/action/after workflow proof with screenshot/data assertions before acceptance.',
|
|
1072
|
-
gates,
|
|
1073
|
-
warnings,
|
|
1074
|
-
recordedAt: now
|
|
1075
|
-
};
|
|
1076
|
-
}
|
|
1077
|
-
if (qa?.outcome === 'business_assertion_failed') {
|
|
1078
|
-
return {
|
|
1079
|
-
outcome: input.terminal === true ? 'rejected' : 'qa_incomplete',
|
|
1080
|
-
reason: 'Issue-specific business assertion failed.',
|
|
1081
|
-
nextAction: 'Repair the product/data defect and rerun the failing assertion.',
|
|
1082
|
-
gates,
|
|
1083
|
-
warnings,
|
|
1084
|
-
recordedAt: now
|
|
1085
|
-
};
|
|
1086
|
-
}
|
|
1087
|
-
|
|
1088
|
-
const hasBusinessPass = qa?.outcome === 'business_assertion_passed';
|
|
1089
|
-
const scorecardPassed = input.scorecardPassed === true || statusLooksPassed(input.scorecardStatus);
|
|
1090
|
-
const releaseBlockers: string[] = [];
|
|
1091
|
-
if (statusLooksFailed(input.deployStatus)) {
|
|
1092
|
-
releaseBlockers.push(`deploy=${cleanText(input.deployStatus, 120)}`);
|
|
1093
|
-
}
|
|
1094
|
-
if (statusLooksFailed(input.publishStatus)) {
|
|
1095
|
-
releaseBlockers.push(`publish=${cleanText(input.publishStatus, 120)}`);
|
|
1096
|
-
}
|
|
1097
|
-
if (statusLooksFailed(input.sampleDataStatus)) {
|
|
1098
|
-
releaseBlockers.push(`sample_data=${cleanText(input.sampleDataStatus, 120)}`);
|
|
1099
|
-
}
|
|
1100
|
-
if (releaseBlockers.length && (scorecardPassed || hasBusinessPass)) {
|
|
1101
|
-
addGateOnce(gates, makeGate(
|
|
1102
|
-
'release',
|
|
1103
|
-
'Release/deploy',
|
|
1104
|
-
'fail',
|
|
1105
|
-
`Final acceptance is blocked after QA/scorecard because release gates failed: ${releaseBlockers.join(', ')}.`,
|
|
1106
|
-
[],
|
|
1107
|
-
now
|
|
1108
|
-
));
|
|
1109
|
-
return {
|
|
1110
|
-
outcome: 'release_blocked',
|
|
1111
|
-
reason: `Release gates failed after QA/scorecard: ${releaseBlockers.join(', ')}.`,
|
|
1112
|
-
nextAction: 'Repair deploy/publish/sample-data coverage before marking the run accepted.',
|
|
1113
|
-
gates,
|
|
1114
|
-
warnings,
|
|
1115
|
-
recordedAt: now
|
|
1116
|
-
};
|
|
1117
|
-
}
|
|
1118
|
-
const failedSupportPrCreationGate = gates.find((gate) => gate.key === 'support_pr_creation_result' && (gate.status === 'fail' || gate.status === 'blocked'));
|
|
1119
|
-
if (input.source === 'support_ticket' && failedSupportPrCreationGate) {
|
|
1120
|
-
return {
|
|
1121
|
-
outcome: 'release_blocked',
|
|
1122
|
-
reason: `Support PR creation is blocked after proof-ready work: ${failedSupportPrCreationGate.reason}`,
|
|
1123
|
-
nextAction: failedSupportPrCreationGate.metadata?.nextAction === 'repair_pr_creation_blocker'
|
|
1124
|
-
? 'Repair the PR creation/release-safety blocker or route to platform repair; do not rerun product-code repair unless new issue evidence changes.'
|
|
1125
|
-
: 'Check PR creation status before another repair loop.',
|
|
1126
|
-
gates,
|
|
1127
|
-
warnings,
|
|
1128
|
-
recordedAt: now
|
|
1129
|
-
};
|
|
1130
|
-
}
|
|
1131
|
-
const blockedSupportAutopilotCompletionGate = gates.find((gate) => gate.key === 'support_autopilot_completion_contract' && gate.status === 'blocked');
|
|
1132
|
-
if (input.source === 'support_ticket' && blockedSupportAutopilotCompletionGate) {
|
|
1133
|
-
const nextAction = cleanText(blockedSupportAutopilotCompletionGate.metadata?.nextAction, 160);
|
|
1134
|
-
const missingEvidence = Array.isArray(blockedSupportAutopilotCompletionGate.metadata?.missingCompletionEvidence)
|
|
1135
|
-
? blockedSupportAutopilotCompletionGate.metadata.missingCompletionEvidence
|
|
1136
|
-
.map((entry: any) => cleanText(entry, 240))
|
|
1137
|
-
.filter(Boolean)
|
|
1138
|
-
: [];
|
|
1139
|
-
const outcome = nextAction === 'create_pr'
|
|
1140
|
-
? 'release_blocked'
|
|
1141
|
-
: (input.explicitAccepted === true || scorecardPassed || statusLooksPassed(`${input.status || ''} ${input.phase || ''}`) || hasBusinessPass)
|
|
1142
|
-
? 'false_pass'
|
|
1143
|
-
: 'qa_incomplete';
|
|
1144
|
-
return {
|
|
1145
|
-
outcome,
|
|
1146
|
-
reason: `Approved support autopilot has not reached A-grade PR proof: ${blockedSupportAutopilotCompletionGate.reason}`,
|
|
1147
|
-
nextAction: nextAction === 'create_pr'
|
|
1148
|
-
? 'Create the proof-backed support PR; merge, release, deploy, and customer reply remain separately gated.'
|
|
1149
|
-
: nextAction === 'run_business_proof_qa'
|
|
1150
|
-
? 'Run issue-specific business proof QA until AIQaBusinessAssertion, before/action/after proof, and screenshot/trace evidence pass.'
|
|
1151
|
-
: nextAction === 'run_a_grade_pr_review'
|
|
1152
|
-
? 'Run strict A-grade PR review; do not merge, release, deploy, or send the customer reply until execution, artifact, pull_request, business-proof, and screenshot/trace evidence pass.'
|
|
1153
|
-
: 'Continue only the bounded owner-scoped support workflow until PR readiness or a new blocker/scope change.',
|
|
1154
|
-
gates,
|
|
1155
|
-
warnings: missingEvidence.length
|
|
1156
|
-
? [...warnings, ...missingEvidence.map((entry) => `missing_completion_evidence:${entry}`)]
|
|
1157
|
-
: warnings,
|
|
1158
|
-
recordedAt: now
|
|
1159
|
-
};
|
|
1160
|
-
}
|
|
1161
|
-
const blockedSupportReleaseCustomerGate = gates.find((gate) => gate.key === 'support_release_customer_acceptance' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
1162
|
-
if (input.source === 'support_ticket' && blockedSupportReleaseCustomerGate) {
|
|
1163
|
-
const nextAction = cleanText(blockedSupportReleaseCustomerGate.metadata?.nextAction, 160);
|
|
1164
|
-
return {
|
|
1165
|
-
outcome: 'release_blocked',
|
|
1166
|
-
reason: `Support PR proof is ready, but release/customer acceptance is incomplete: ${blockedSupportReleaseCustomerGate.reason}`,
|
|
1167
|
-
nextAction: nextAction === 'draft_or_review_proof_backed_customer_reply'
|
|
1168
|
-
? 'Draft or review the proof-backed customer reply from the accepted QA/release evidence; do not rerun product-code repair unless new issue evidence appears.'
|
|
1169
|
-
: 'Complete the release/hotfix gate for the A-grade PR, then generate or review the proof-backed customer reply.',
|
|
1170
|
-
gates,
|
|
1171
|
-
warnings,
|
|
1172
|
-
recordedAt: now
|
|
1173
|
-
};
|
|
1174
|
-
}
|
|
1175
|
-
|
|
1176
|
-
const blockedAICoderNextActionContractGate = gates.find((gate) => gate.key === 'aicoder_next_action_contract' && (gate.status === 'blocked' || gate.status === 'fail'));
|
|
1177
|
-
if (input.source === 'aicoder_app' && blockedAICoderNextActionContractGate) {
|
|
1178
|
-
const claimedSuccess = input.explicitAccepted === true
|
|
1179
|
-
|| input.scorecardPassed === true
|
|
1180
|
-
|| statusLooksPassed(input.scorecardStatus)
|
|
1181
|
-
|| statusLooksPassed(`${input.status || ''} ${input.phase || ''}`);
|
|
1182
|
-
return {
|
|
1183
|
-
outcome: claimedSuccess ? 'false_pass' : 'manual_handoff',
|
|
1184
|
-
reason: claimedSuccess
|
|
1185
|
-
? `AICoder run claimed success without a manager-safe next-action contract: ${blockedAICoderNextActionContractGate.reason}`
|
|
1186
|
-
: `AICoder manager cannot safely continue without a manager-safe next-action contract: ${blockedAICoderNextActionContractGate.reason}`,
|
|
1187
|
-
nextAction: 'Record one validated AICoder next-action contract with safeToAutoRun, canRunWithoutCodexMonitor, codexFallbackRequired, stop conditions, and success evidence before another autonomous loop.',
|
|
1188
|
-
gates,
|
|
1189
|
-
warnings,
|
|
1190
|
-
recordedAt: now
|
|
1191
|
-
};
|
|
1192
|
-
}
|
|
1193
|
-
|
|
1194
|
-
if (scorecardPassed && !hasBusinessPass) {
|
|
1195
|
-
warnings.push('scorecard_pass_without_business_assertion');
|
|
1196
|
-
addGateOnce(gates, makeGate(
|
|
1197
|
-
'business_assertion_required',
|
|
1198
|
-
'Business assertion',
|
|
1199
|
-
'blocked',
|
|
1200
|
-
'Scorecard passed, but no issue-specific business assertion proof was recorded.',
|
|
1201
|
-
[],
|
|
1202
|
-
now
|
|
1203
|
-
));
|
|
1204
|
-
return {
|
|
1205
|
-
outcome: 'false_pass',
|
|
1206
|
-
reason: 'Scorecard-only proof is not acceptance.',
|
|
1207
|
-
nextAction: 'Record issue-specific workflow/data proof, then reclassify the run.',
|
|
1208
|
-
gates,
|
|
1209
|
-
warnings,
|
|
1210
|
-
recordedAt: now
|
|
1211
|
-
};
|
|
1212
|
-
}
|
|
1213
|
-
|
|
1214
|
-
const statusPhase = `${input.status || ''} ${input.phase || ''}`;
|
|
1215
|
-
if ((input.explicitAccepted === true || statusLooksPassed(statusPhase) || scorecardPassed) && hasBusinessPass) {
|
|
1216
|
-
return {
|
|
1217
|
-
outcome: 'accepted',
|
|
1218
|
-
reason: 'Run has terminal success signal and issue-specific business assertion proof.',
|
|
1219
|
-
nextAction: 'No repair action required.',
|
|
1220
|
-
gates,
|
|
1221
|
-
warnings,
|
|
1222
|
-
recordedAt: now
|
|
1223
|
-
};
|
|
1224
|
-
}
|
|
1225
|
-
|
|
1226
|
-
if (statusLooksFailed(statusPhase)) {
|
|
1227
|
-
return {
|
|
1228
|
-
outcome: 'rejected',
|
|
1229
|
-
reason: 'Run ended with a failure status and no accepted proof.',
|
|
1230
|
-
nextAction: 'Classify the failing gate and rerun the smallest repair step.',
|
|
1231
|
-
gates,
|
|
1232
|
-
warnings,
|
|
1233
|
-
recordedAt: now
|
|
1234
|
-
};
|
|
1235
|
-
}
|
|
1236
|
-
|
|
1237
|
-
return {
|
|
1238
|
-
outcome: 'unknown',
|
|
1239
|
-
reason: 'Run does not have enough normalized evidence for a terminal label.',
|
|
1240
|
-
nextAction: 'Ingest QA, deploy, assistant, usage, and commit evidence before using this run for training.',
|
|
1241
|
-
gates,
|
|
1242
|
-
warnings,
|
|
1243
|
-
recordedAt: now
|
|
1244
|
-
};
|
|
1245
|
-
}
|
|
1246
|
-
|
|
1247
|
-
export function buildAIRun(input: Omit<AIRun, 'outcome' | 'gates'> & {
|
|
1248
|
-
outcome?: AIRunOutcomeLabel;
|
|
1249
|
-
gates?: AIRunGateResult[];
|
|
1250
|
-
scorecardPassed?: boolean;
|
|
1251
|
-
deployStatus?: string;
|
|
1252
|
-
publishStatus?: string;
|
|
1253
|
-
sampleDataStatus?: string;
|
|
1254
|
-
manualHandoff?: boolean;
|
|
1255
|
-
stopped?: boolean;
|
|
1256
|
-
rejected?: boolean;
|
|
1257
|
-
explicitAccepted?: boolean;
|
|
1258
|
-
terminal?: boolean;
|
|
1259
|
-
now?: Date | string;
|
|
1260
|
-
}): AIRun {
|
|
1261
|
-
const decision = input.outcome
|
|
1262
|
-
? {
|
|
1263
|
-
outcome: input.outcome,
|
|
1264
|
-
gates: input.gates || [],
|
|
1265
|
-
warnings: input.warnings || [],
|
|
1266
|
-
nextAction: input.nextAction || '',
|
|
1267
|
-
reason: '',
|
|
1268
|
-
recordedAt: isoNow(input.now)
|
|
1269
|
-
}
|
|
1270
|
-
: classifyAIRunOutcome({
|
|
1271
|
-
source: input.source,
|
|
1272
|
-
status: input.status,
|
|
1273
|
-
phase: input.phase,
|
|
1274
|
-
qa: input.qa,
|
|
1275
|
-
gates: input.gates,
|
|
1276
|
-
scorecardPassed: input.scorecardPassed,
|
|
1277
|
-
deployStatus: input.deployStatus,
|
|
1278
|
-
publishStatus: input.publishStatus,
|
|
1279
|
-
sampleDataStatus: input.sampleDataStatus,
|
|
1280
|
-
manualHandoff: input.manualHandoff,
|
|
1281
|
-
stopped: input.stopped,
|
|
1282
|
-
rejected: input.rejected,
|
|
1283
|
-
explicitAccepted: input.explicitAccepted,
|
|
1284
|
-
terminal: input.terminal,
|
|
1285
|
-
now: input.now
|
|
1286
|
-
});
|
|
1287
|
-
return {
|
|
1288
|
-
id: input.id,
|
|
1289
|
-
source: input.source || 'unknown',
|
|
1290
|
-
sourceIds: input.sourceIds || {},
|
|
1291
|
-
title: input.title,
|
|
1292
|
-
status: input.status,
|
|
1293
|
-
phase: input.phase,
|
|
1294
|
-
startedAt: input.startedAt,
|
|
1295
|
-
completedAt: input.completedAt,
|
|
1296
|
-
outcome: decision.outcome,
|
|
1297
|
-
events: Array.isArray(input.events) ? input.events : [],
|
|
1298
|
-
gates: decision.gates,
|
|
1299
|
-
qa: normalizeQaRun(input.qa),
|
|
1300
|
-
cost: input.cost,
|
|
1301
|
-
nextAction: decision.nextAction,
|
|
1302
|
-
warnings: decision.warnings,
|
|
1303
|
-
metadata: input.metadata
|
|
1304
|
-
};
|
|
1305
|
-
}
|
|
1306
|
-
|
|
1307
|
-
export function buildAIRunCost(entries: OpenAIUsageCostEntry[] = []): AIRunCost {
|
|
1308
|
-
const cost: AIRunCost = {
|
|
1309
|
-
inputTokens: 0,
|
|
1310
|
-
cachedInputTokens: 0,
|
|
1311
|
-
outputTokens: 0,
|
|
1312
|
-
totalTokens: 0,
|
|
1313
|
-
estimatedUsd: 0,
|
|
1314
|
-
models: [],
|
|
1315
|
-
categories: {},
|
|
1316
|
-
sources: {},
|
|
1317
|
-
surfaces: {},
|
|
1318
|
-
manualEstimatedUsd: 0,
|
|
1319
|
-
untrackedEstimatedUsd: 0,
|
|
1320
|
-
untrackedWarnings: []
|
|
1321
|
-
};
|
|
1322
|
-
for (const entry of normalizeOpenAIUsageRowsForCosting(entries)) {
|
|
1323
|
-
const category = cleanText(entry.category, 120) || 'unknown';
|
|
1324
|
-
const source = cleanText(entry.usage_source ?? entry.usageSource, 80) || 'unknown';
|
|
1325
|
-
const surface = cleanText(entry.usage_surface ?? entry.usageSurface, 80) || 'unknown';
|
|
1326
|
-
const isManual = entry.is_manual === true || entry.isManual === true || source === 'manual_codex';
|
|
1327
|
-
const isUntracked = entry.is_untracked === true || entry.isUntracked === true;
|
|
1328
|
-
const untrackedReason = cleanText(entry.untracked_reason ?? entry.untrackedReason, 500);
|
|
1329
|
-
const model = cleanText(entry.model, 120);
|
|
1330
|
-
const inputTokens = Number(entry.input_tokens ?? entry.inputTokens ?? 0) || 0;
|
|
1331
|
-
const cachedInputTokens = Number(entry.cached_input_tokens ?? entry.cachedInputTokens ?? 0) || 0;
|
|
1332
|
-
const outputTokens = Number(entry.output_tokens ?? entry.outputTokens ?? 0) || 0;
|
|
1333
|
-
const totalTokens = Number(entry.total_tokens ?? entry.totalTokens ?? (inputTokens + outputTokens)) || 0;
|
|
1334
|
-
const estimatedUsd = Number(entry.cost_estimate ?? entry.estimatedUsd ?? 0) || 0;
|
|
1335
|
-
cost.inputTokens += inputTokens;
|
|
1336
|
-
cost.cachedInputTokens += cachedInputTokens;
|
|
1337
|
-
cost.outputTokens += outputTokens;
|
|
1338
|
-
cost.totalTokens += totalTokens;
|
|
1339
|
-
cost.estimatedUsd += estimatedUsd;
|
|
1340
|
-
if (isManual) {
|
|
1341
|
-
cost.manualEstimatedUsd = Number(cost.manualEstimatedUsd || 0) + estimatedUsd;
|
|
1342
|
-
}
|
|
1343
|
-
if (isUntracked) {
|
|
1344
|
-
cost.untrackedEstimatedUsd = Number(cost.untrackedEstimatedUsd || 0) + estimatedUsd;
|
|
1345
|
-
const warning = untrackedReason || `${source} usage is an estimate outside managed runner telemetry.`;
|
|
1346
|
-
if (warning && !cost.untrackedWarnings?.includes(warning)) {
|
|
1347
|
-
cost.untrackedWarnings?.push(warning);
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
if (model && !cost.models.includes(model)) {
|
|
1351
|
-
cost.models.push(model);
|
|
1352
|
-
}
|
|
1353
|
-
if (!cost.categories[category]) {
|
|
1354
|
-
cost.categories[category] = {
|
|
1355
|
-
inputTokens: 0,
|
|
1356
|
-
cachedInputTokens: 0,
|
|
1357
|
-
outputTokens: 0,
|
|
1358
|
-
totalTokens: 0,
|
|
1359
|
-
estimatedUsd: 0,
|
|
1360
|
-
count: 0
|
|
1361
|
-
};
|
|
1362
|
-
}
|
|
1363
|
-
cost.categories[category].inputTokens += inputTokens;
|
|
1364
|
-
cost.categories[category].cachedInputTokens += cachedInputTokens;
|
|
1365
|
-
cost.categories[category].outputTokens += outputTokens;
|
|
1366
|
-
cost.categories[category].totalTokens += totalTokens;
|
|
1367
|
-
cost.categories[category].estimatedUsd += estimatedUsd;
|
|
1368
|
-
cost.categories[category].count += 1;
|
|
1369
|
-
if (!cost.sources?.[source]) {
|
|
1370
|
-
cost.sources![source] = {
|
|
1371
|
-
inputTokens: 0,
|
|
1372
|
-
cachedInputTokens: 0,
|
|
1373
|
-
outputTokens: 0,
|
|
1374
|
-
totalTokens: 0,
|
|
1375
|
-
estimatedUsd: 0,
|
|
1376
|
-
count: 0,
|
|
1377
|
-
manualCount: 0,
|
|
1378
|
-
untrackedCount: 0
|
|
1379
|
-
};
|
|
1380
|
-
}
|
|
1381
|
-
cost.sources[source].inputTokens += inputTokens;
|
|
1382
|
-
cost.sources[source].cachedInputTokens += cachedInputTokens;
|
|
1383
|
-
cost.sources[source].outputTokens += outputTokens;
|
|
1384
|
-
cost.sources[source].totalTokens += totalTokens;
|
|
1385
|
-
cost.sources[source].estimatedUsd += estimatedUsd;
|
|
1386
|
-
cost.sources[source].count += 1;
|
|
1387
|
-
if (isManual) {
|
|
1388
|
-
cost.sources[source].manualCount += 1;
|
|
1389
|
-
}
|
|
1390
|
-
if (isUntracked) {
|
|
1391
|
-
cost.sources[source].untrackedCount += 1;
|
|
1392
|
-
}
|
|
1393
|
-
if (!cost.surfaces?.[surface]) {
|
|
1394
|
-
cost.surfaces![surface] = {
|
|
1395
|
-
totalTokens: 0,
|
|
1396
|
-
estimatedUsd: 0,
|
|
1397
|
-
count: 0
|
|
1398
|
-
};
|
|
1399
|
-
}
|
|
1400
|
-
cost.surfaces[surface].totalTokens += totalTokens;
|
|
1401
|
-
cost.surfaces[surface].estimatedUsd += estimatedUsd;
|
|
1402
|
-
cost.surfaces[surface].count += 1;
|
|
1403
|
-
}
|
|
1404
|
-
cost.estimatedUsd = Number(cost.estimatedUsd.toFixed(6));
|
|
1405
|
-
cost.manualEstimatedUsd = Number(Number(cost.manualEstimatedUsd || 0).toFixed(6));
|
|
1406
|
-
cost.untrackedEstimatedUsd = Number(Number(cost.untrackedEstimatedUsd || 0).toFixed(6));
|
|
1407
|
-
for (const category of Object.keys(cost.categories)) {
|
|
1408
|
-
cost.categories[category].estimatedUsd = Number(cost.categories[category].estimatedUsd.toFixed(6));
|
|
1409
|
-
}
|
|
1410
|
-
for (const source of Object.keys(cost.sources || {})) {
|
|
1411
|
-
cost.sources![source].estimatedUsd = Number(cost.sources![source].estimatedUsd.toFixed(6));
|
|
1412
|
-
}
|
|
1413
|
-
for (const surface of Object.keys(cost.surfaces || {})) {
|
|
1414
|
-
cost.surfaces![surface].estimatedUsd = Number(cost.surfaces![surface].estimatedUsd.toFixed(6));
|
|
1415
|
-
}
|
|
1416
|
-
return cost;
|
|
1417
|
-
}
|
|
1418
|
-
|
|
1419
|
-
export function redactAIRunTrainingExample(example: AIRunTrainingExample): AIRunTrainingExample {
|
|
1420
|
-
const redact = (value: string): string => cleanText(value, 5000)
|
|
1421
|
-
.replace(/mongodb(?:\+srv)?:\/\/[^\s"'<>]+/ig, '[redacted-mongo-url]')
|
|
1422
|
-
.replace(/\b(?:sk|ghp|xoxb|AKIA)[A-Za-z0-9_\-]{12,}\b/g, '[redacted-secret]')
|
|
1423
|
-
.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z]{2,}\b/ig, '[redacted-email]');
|
|
1424
|
-
return {
|
|
1425
|
-
...example,
|
|
1426
|
-
inputSummary: redact(example.inputSummary),
|
|
1427
|
-
actionSummary: redact(example.actionSummary),
|
|
1428
|
-
evidence: cleanList(example.evidence, 80, 5000).map(redact)
|
|
1429
|
-
};
|
|
1430
|
-
}
|