|
50166
|
1777
|
43
|
2026-05-18T07:20:42.306336+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088842306_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"20","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50167
|
1778
|
41
|
2026-05-18T07:20:45.816786+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088845816_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.31648937,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.32646278,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.33643618,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.3464096,"top":0.3320032,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.35771278,"top":0.33040702,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3650266,"top":0.33040702,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.37367022,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.38231382,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.3932846,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4019282,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4105718,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.42154256,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4325133,"top":0.123703115,"width":0.024268618,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.45910904,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.47007978,"top":0.123703115,"width":0.029587766,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.59375,"top":0.123703115,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"20","depth":4,"bounds":{"left":0.5561835,"top":0.14844373,"width":0.010305851,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.56848407,"top":0.14844373,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"bounds":{"left":0.5777925,"top":0.14844373,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.5894282,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"bounds":{"left":0.5994016,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.6090425,"top":0.14684756,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.6163564,"top":0.14684756,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50165
|
NULL
|
NULL
|
NULL
|
|
50169
|
NULL
|
0
|
2026-05-18T07:20:48.456783+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088848456_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5071500552290652761
|
-8348254866154213426
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
PhostormVIewINavicareCodeLaravel• Preparation tor Kell... In 4n 40mFV faVsco.js~%9 pipedrive-sdk-pocvAskJiminnyReportActivityServiceTest vProject® ActivityController.phpE custom.logE laravel.log4 SF [jiminny@localhost]4 console (STAGING]Cascadeộ sonar-project.propertiesconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpA HS_local (jiminny@localhost]A console [PROD]f users [PROD]© TestPipedriveOfficialSakCommand.phpMigrating to Pipedrive= test.ov© Kernel.phpconsole lEU<> Untitled Diagram.xmlus vetur.confio.isc createrlaybookcreatedevent.ong©) AcuivityLeadConverted.pnpTy: AutoyPlaygroundd8jiminnya.status = comnletediM+ WEBHOOK FILTERING_MPLEMENTATION.mopnp api.ono x" TeamController.php> ib External Librariesv E® Scratches and Consoles237ANo wuad. to_bin (-641F2acb-26b8-4261-8726-6f5279dadbe'* .20 a020 A1 418 X2 X6 A V• docker exec docker_lamp_1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19c) IntearationApp/Service.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.pho238AND a.deleted_at IS NULLv M Database ConsolesC) PlanhatactivityListener.php(C)AskAnythinaPromptService.php© AutomatedReportsRepository.php239AND EXISTS(Found Pipedrive account for team: Pipedrive, Inc.~ AEUSELECT 1 FROM tracks tphp api y2.ohdC) RequestGenerateReport.Job.ohvA console [EU)241WHERE t.activity_id = a.idTest PASSAutAuth initzatization: Client inttialized successfully in 219.21msA DEAL RISKS [EU]C) AutomatedReportResult.oho(C) AutomatedRenort.ohoAND t.type IN ('audio', 'video')A DI [EU]Ds tozen trengeai opgrations® CreateTeamRequest.php© UserInvitationDTO.phpA EU [EU]&Iminny @localnostorganiza245ORDER BY a.actual_start_time DESCLIMIT 25;A console ljiminny@localhost]Srouter->arouodr'middleware'= 'auth:aoi' static- U liminnyolocalnostA2 A5 X3 X16 A$router->group(['prefix'HS_Jocal [jiminny@localhost]Srouter->aroundi'orefix'/settings'], static function (Router Srouter): V 248& St liminny@localhostations'], static function (Router $r 249)333P'V', LOrganizationController::class, 'store'])A zoho_dev [jiminny@localhost]Test zatide with oB token -ErrorCONCAT(u.id, CASE WHEN U.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,Thoughts>zations.store');~ A PROD& console PRODI$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']]]A console_1 [PROD]4DPROD> AQA> ₫OAiselect * from teams where id = 19select * from crm_configurations where provider = 'pipedrive';SELECTu.emanLsa.*,t.owner 1d FROM social accounts saJOIN users u on u.id = sa.sociable_idJOin teams t 1..n<->1: on t.1d = U.team_1dWHERE U.team_id = 19 and sa.provider = 'pipedrive";The token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so I can continue testing the v2 SDK method mappinas.LPAIPRODV A STAGINGIconsole STAGNGconsole " STAGNGIduranus STAGINGIH):// IntegrationsSnouter->group(['maddleware' => 'permission:" . PermissionEnum: :MANAGE_INTEÇ: 258 vSELECT * FROM social_accpunts WHERE id = 1116;[IntegrationController::class, 'all']) l->m1ddLeware miadleware:'permission:. PermissionEnum::READ_INTEGRATIONS->name ( name: 'api.intearations.index'):3 files +211 -28>Ask anything (*AL)+ <>Code SWE-1.6100% LzP&• Mon 18 May 10:20:48+0 ..ServicesToe|v M DatahaccV AEU# consolev A jiminny@localhostA HS_local4 SF 564 msV A PROD« console 1$ 879 msfiil users 2 s 554 msV A STAGING& console 2 s 11 ms# Dockeral .Reject all Accept allOutputi jiminny.social_accounts xAW 1row vcsvu|d L $0 1! sociable_idprovider_user_idI provider_user_tokenprovider_refresh_tokenI expiresM refresh token eynines• provider! stateD auth_scoperetry_aftercreated atupdated_at1116241195557315034113:[TELEGRAM_TOKEN]b2bfc1779088398<nuih»pipedriveconnectedv1u:AQIBAHj-LzTNK2yUUUaLq¿fzhWb9crUNKTpk4FLQ9гjnХqp_6АEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkіG9wĐBBwagbzBtАgEAMGgЄCSqGSIb3DQEHATАeBgLghkgBZQMEAS4wEQQMnG8KNcZLIjEnLRPxAgEQgDsGPIcKjsMU7QeL36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqSOinp-5G4JE7frJURMV8VTw_fY14g:GHS08DKUsBg30JM398MH8fcbTQmzCrXaVo2GbZEd6nn(base, deals:full, activities:full,contacts:full, search:read2023-09-08 09:44:292026-05-15 15-44•311 row retrieved starting from 1 in 447 ms (execution: 23 ms, fetching: 424 ms)W Windsurf Teams 258:25 UTF-8 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50168
|
1777
|
44
|
2026-05-18T07:20:48.485729+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088848485_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-800414232206848492
|
-8204135277817253938
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKER (docker-compose)DOCKER81DEV (-zsh)О ₴211DOCKER (docker-compose)docker_lamp_11 2026-05-1807:17:09,317 INFO spawned:'artisan-schedule_00' with pid 18754docker_lamp_11 2026-05-1807:17:10,344 INFO success: artisan-schedule_00 entered RUNNIstate, process hasstayedup for › than 1 seconds (startsecs)docker_lamp_1docker_lamp_112026-05-18 07:18:18 Running ['artisan'meeting-bot:schedule-bot] .. 15S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:18:34 Running ['artisan'dialers:monitor-activities]11s DONEdocker_lamp_11/fd/1', '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2>81docker_1amp_12026-05-18 07:18:45 Running ['artisan'jiminny:monitor-social-accountSJ13S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:18:59 Running ['artisan' mailbox:skip-lists:refresh]11s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan'mailbox:skip-lists:refresh> */proc/1/fd/1'2>&1docker_lamp_112026-05-18 07:19:10 Running ['artisan'mailbox:batch:process--max-batches=15J10s DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' mailbox:batch:process --max-batches=15 > '/proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:19:21 Running ['artisan' conference:monitor:count] .. 14s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' conference:monitor:count › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:19:35 Running ['artisan'mailbox:batch:retry-failed --max-batches=15] in background39.01ms DONEdocker_lamp_1• ('/usr/local/bin/php' 'artisan'mailbox:batch:retry-failedtches=15 › '/proc/1/fd/1' 2>&1 ; '/usr/local/bin/php''artisan'schedule: finish--max-ba"framework/schedule-390defd641effba0f73a895e426ded4cf2ba7f11" "$?") > '/dev/null' 2>&1 &docker_lamp_12026-05-18 07:19:35 Running ['artisan' crm:autolog-delayed]Dispatched autologdelayed jobs forallapplicable teams:docker_1amp_1docker_lamp_11..24s DONEl '/usr/local/bin/php' 'artisan' crm:autolog-delayed › '/proc/1/fd/1'2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:runRun• Preparation for Refi... in 4 h 40 mAPP (-zsh)*3PROD (ssh)'do-release-upgrade'to upgrade to it.100%8• Mon 18 May 10:20:48screenpipe"T81- *4PROD*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX W7 Exr(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSIONView in Docker Desktop@ View ConfigEnable Watch...
|
50166
|
NULL
|
NULL
|
NULL
|
|
50170
|
1777
|
45
|
2026-05-18T07:20:51.017919+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088851017_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
6675262513308431630
|
-8249100941824643122
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp• Preparation for Refi... in 4 h 40 m100% C8• Mon 18 May 10:20:50DOCKER (docker-compose)181DOCKER81DEV (-zsh)О ₴211DOCKER (docker-compose)docker_lamp_11 2026-05-1807:17:09,317 INFO spawned:'artisan-schedule_00' with pid 18docker_lamp_11 2026-05-1807:17:10,344 INFO success: artisan-schedule_00 entered RUNNIstate, process hasstayedup for › than 1 seconds (startsecs)docker_lamp_1docker_lamp_112026-05-18 07:18:18 Running ['artisan'meeting-bot:schedule-bot] .. 15S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:18:34 Running ['artisan'dialers:monitor-activities]11s DONEdocker_lamp_11/fd/1', '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2>81docker_1amp_12026-05-18 07:18:45 Running ['artisan'jiminny:monitor-social-accountSJ13S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:18:59 Running ['artisan' mailbox:skip-lists:refresh]11s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan'mailbox:skip-lists:refresh> */proc/1/fd/1'2>&1docker_lamp_112026-05-18 07:19:10 Running ['artisan'mailbox:batch:process--max-batches=15J10s DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' mailbox:batch:process --max-batches=15 > '/proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:19:21 Running ['artisan' conference:monitor:count] .. 14s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' conference:monitor:count › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:19:35 Running ['artisan'mailbox:batch:retry-failed --max-batches=15] in background39.01ms DONEdocker_lamp_1• ('/usr/local/bin/php' 'artisan'mailbox:batch:retry-failedtches=15 › '/proc/1/fd/1' 2>&1 ; '/usr/local/bin/php''artisan'schedule: finish--max-ba"framework/schedule-390defd641effba0f73a895e426ded4cf2ba7f11" "$?") > '/dev/null' 2>&1 &docker_lamp_12026-05-18 07:19:35 Running ['artisan' crm:autolog-delayed]Dispatched autologdelayed jobs forallapplicable teams:docker_1amp_1docker_lamp_11..24s DONEl '/usr/local/bin/php' 'artisan' crm:autolog-delayed › '/proc/1/fd/1'2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:runAPP (-zsh)*3ffmpegRunY2PROD (ssh)'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX W7 ExT(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50171
|
NULL
|
0
|
2026-05-18T07:21:03.040438+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088863040_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-1577758971485965071
|
-8168044961700007986
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp• 0• Preparation for Refi... in 4h 39 m100%8• Mon 18 May 10:21:02DOCKER (docker-compose)T81DOCKER81DEV (-zsh)О ₴211DOCKER (docker-compose)docker_lamp_11 2026-05-1807:17:09,317 INFO spawned:'artisan-schedule_00' with pid 18754docker_lamp_11 2026-05-1807:17:10,344 INFO success: artisan-schedule_00 entered RUNNIstate, process hasstayedup for › than 1 seconds (startsecs)docker_lamp_1docker_lamp_12026-05-18 07:18:18 Running ['artisan'meeting-bot:schedule-bot] .. 15S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:18:34 Running ['artisan'dialers:monitor-activities]11s DONEdocker_lamp_11/fd/1', '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2>81docker_1amp_12026-05-18 07:18:45 Running ['artisan'jiminny:monitor-social-accountSJ13S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:18:59 Running ['artisan' mailbox:skip-lists:refresh]11s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan'mailbox:skip-lists:refresh> */proc/1/fd/1'2>&1docker_lamp_112026-05-18 07:19:10 Running ['artisan'mailbox:batch:process--max-batches=15J10s DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' mailbox:batch:process --max-batches=15 > '/proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:19:21 Running ['artisan' conference:monitor:count] .. 14s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' conference:monitor:count › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:19:35 Running ['artisan'mailbox:batch:retry-failed --max-batches=15] in background39.01ms DONEdocker_lamp_1• ('/usr/local/bin/php' 'artisan'mailbox:batch:retry-failedtches=15 › '/proc/1/fd/1' 2>&1 ; '/usr/local/bin/php''artisan'schedule: finish--max-ba"framework/schedule-390defd641effba0f73a895e426ded4cf2ba7f11" "$?") > '/dev/null' 2>&1 &docker_lamp_12026-05-18 07:19:35 Running ['artisan' crm:autolog-delayed]Dispatched autologdelayed jobs forallapplicable teams:docker_1amp_1docker_lamp_11..24s DONEl '/usr/local/bin/php' 'artisan' crm:autolog-delayed › '/proc/1/fd/1'2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:runAPP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX W7 Exr(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
50170
|
NULL
|
NULL
|
NULL
|
|
50173
|
1780
|
0
|
2026-05-18T07:21:08.443866+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088868443_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.31648937,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.32646278,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.33643618,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.3464096,"top":0.3320032,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.35771278,"top":0.33040702,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3650266,"top":0.33040702,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50169
|
NULL
|
NULL
|
NULL
|
|
50172
|
1779
|
0
|
2026-05-18T07:21:08.467210+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088868467_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"20","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50175
|
1780
|
1
|
2026-05-18T07:21:15.622292+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088875622_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4347459024378658302
|
-4214236038424313910
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
PhostormFV faVsco.js~VIewINavicareCodeLaravel%9 pipedrive-sdk-pocvProjectộ sonar-project.properties= test.ov<> Untitled Diagram.xmlus vetur.confio.ism. WEBHOOK FILTERING_MPLEMENTATION.mo> ib External Librariesv E® Scratches and Consolesv M Database Consoles~ AEUA console [EU)A DEAL RISKS [EU]A DI [EU]A EU [EU]&Iminny @localnostA console ljiminny@localhost]- U liminnyolocalnostHS_Jocal [jiminny@localhost]& St liminny@localhostA zoho_dev [jiminny@localhost]~ A PROD& console PRODIA console_1 [PROD]4DPROD> AQA• 4 ФAiLPAIPRODV A STAGINGIconsole STAGNGconsole " STAGNGduranus STAGINGI• Preparation tor Kell. In 4h 33 m100% Lz&• Mon 18 May 10:21:15® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpE custom.logE laravel.logA HS_local (jiminny@localhost]© Kernel.php4 SF [jiminny@localhost] xA console [STAGING]* console (PRODIf users [PROD]console lEU© TestPipedriveOfficialSakCommand.phpCascadeMigrating to Pipedrive+0 ..c createrlaybookcreatedevent.ong©) AcuivityLeadConverted.pnpH):// Integrationssrouten->group('middlewane' →> 'permission:" PermissionEnum: MANAGE.INTEC258 v[IntegrationController: :Class, 'all']) lapi/259>mldd Leware miadleware:'permission:PermissionEnum: :READ INTEGRATTONS 26€->name ( name: 'api.intearations.index'):ПaШII3 files +211 -28>Reject all Accept allSELEC * FRO social accounts WHERE 10 = 1001Caccade 92171Command &IUPDATE social_accounts SET provider_user_token = 'eipedcivel WHERE id = 1116;<> Code SWE-1.6ServicesToe|v M DatahaccV AEU# consolev A jiminny@localhostA HS_local4, SF 564 msV A PROD« console 1$ 879 msfiil users 2 s 554 msV A STAGING& console 2 s 11 ms# Dockerpnp api.ono x" TeamController.phpc) IntearationApp/Service.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.phoC) PlanhatactivityListener.php(C)AskAnythinaPromptService.php(C) AutomatedReportsRepository.ohp237239php api_y2.ohdC) RequestGenerateReport.Job.ohv241Ty: AutoyPlaygroundd8jiminnyastatus ="comnletedANo wuad. to_bin (-641F2acb-26b8-4261-8726-6f52979dadbe'*= .20020 A1 A18 22 X7 A VAND a.deleted_at IS NULLAND EXISTS (SELECT 1 FROM tracks tWHERE t.activity_id = a.idAND t.type IN ('audio', 'video')C) AutomatedReportResult.oho(C) AutomatedRenort.oho® CreateTeamRequest.php© UserInvitationDTO.phporganizaSrouter->arouodr'middleware'= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix'Srouter->aroundi'orefix'/settings'], static function (Router Srouter): V 248ations'], static function (Router $r 249)333P'V', LOrganizationController::class, 'store'])zations.store');ORDER BY a.actual_start_time DESCLIMIT 25;• docker exec docker_lamp_1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test PASSAutAuth initzatization: Client inttialized successfully in 219.21msDs tozen trengeai opgrationsТоксn 1 og rd: 2202: 03-18 07.T3к2....Test zatide with oB token -Error$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']]]select * from teams where id = 19select * from crm_configurations where provider = 'pipedrive';SELECTCONCAT(u.id, CASE WHEN U.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,u.emanLsa.*,t.owner 1d FROM socal accounts saJOIN users u on u.id = sa.sociable_idJOin teams t 1..n<->1: on t.1d = U.team1dWHERE U. team_id = 19 and sa.provider = 'Ripedcive':ThouahtsThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so I can continue testing the v2 SDK method mappinas.al .Outputi jiminny.social_accounts xAW 1row v# Q MAФcsvu|d L $0 1! sociable_idprovider_user_idI provider_user_tokenprovider_refresh_tokenI expiresM refresh token eynines• provider! stateI auth_scopeu retry aftercreated atn undated at1116241195557315034113:[TELEGRAM_TOKEN]b2bfc1779088398<nuih»pipedriveconnectedv1u:AQIBAHj-LzTNK2yUUUaLq¿fzhWb9crUNKTpk4FLQ9гjnХqp_6АEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkіG9wĐBBwagbzBtАgEAMGgЄCSqGSIb3DQEHATАeBgLghkgBZQMEAS4wEQQMnG8KNcZLIjEnLRPxAgEQgDsGPIcKjsMU7QeL36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqSOinp-5G4JE7frJURMV8VTw_fY14g:GHS08DKUsBg30JM398MH8fcbTQmzCrXaVo2GbZEd6nn(base, deals:full, activities:full,contacts:full, search:read2023-09-08 09:44:292026-05-15 15-44•31W Windsurf Teams 260:60 (9 chars) UTF-8 4 spaces...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50174
|
1779
|
1
|
2026-05-18T07:21:15.622316+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088875622_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1667126322185874327
|
-8321519584708284726
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp• Preparation for Refi... in 4h 39 mDOCKER (docker-compose)О 82DOCKER81DEV (-zsh)11DOCKER (docker-compose)docker_lamp_12026-05-18 07:18:34 Running ['artisan' dialers:monitor-activities]11s DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:18:45 Running ['artisan' jiminny:monitor-social-accounts]13s DONEdocker_lamp_1" '/usr/local/bin/php' 'artisan'jiminny:monitor-social-accounts > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:18:59 Running ['artisan'mailbox:skip-lists:refresh]11S DONEdocker_lamp_111/fd/1'• '/usr/local/bin/php' 'artisan'mailbox:skip-lists:refresh> "/proc/2>&1docker_lamp_12026-05-18 07:19:10 Running ['artisan'mailbox:batch:process --max-batches=15]10sdocker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 >*/proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:19:21 Running ['artisan' conference:monitor:count] .. 14s DONEdocker_lamp_1 | , '/usr/local/bin/php' 'artisan' conference:monitor:count > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:19:35Running ['artisan'mailbox:batch:retry-failed --max-batches=15]in background39.01ms DONEdocker_lamp_11 ('/usr/local/bin/php' 'artisan'mailbox:batch:retry-failed'/proc/1/fd/1' 2>&1 ; '/usr/local/bin/php' 'artisan'rk/schedule-390defd641effba0f73a895e426ded4cf2ba7f11" "$?") > '/dev/null' 2>&1 &docker_lamp_12026-05-18 07:19:35 Running ['artisan' crm:autolog-delayed] Dispatched autolog delayed jobs for all applicable teams:docker_lamp_1l.......24s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan'crm: autolog-delayed› '/proc/1/fd/1'2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_1amp_12026-05-18 07:21:06 Running ['artisan'meeting-bot:schedule-bot]...2sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:21:09 Running ['artisan' dialers:monitor-activities].2S DONEdocker_lamp_1" '/usr/local/bin/php' 'artisan' dialers:monitor-activities > */proc/1/fd/1' 2>&1APP (-zsh)*3RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 Ext(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|100%8• Mon 18 May 10:21:15screenpipe"T81PRODSTAGEFRONTENDEXTENSIONView in Docker Desktop@ View ConfigEnable Watch...
|
50172
|
NULL
|
NULL
|
NULL
|
|
50176
|
1779
|
2
|
2026-05-18T07:21:18.187079+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088878187_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"20","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"7","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive' \nWHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive' \nWHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50177
|
1780
|
2
|
2026-05-18T07:21:30.133302+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088890133_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.31648937,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.32646278,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.33643618,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.3464096,"top":0.3320032,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.35771278,"top":0.33040702,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3650266,"top":0.33040702,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.37367022,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.38231382,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.3932846,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4019282,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4105718,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.42154256,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4325133,"top":0.123703115,"width":0.024268618,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.45910904,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.47007978,"top":0.123703115,"width":0.029587766,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.59375,"top":0.123703115,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"21","depth":4,"bounds":{"left":0.5571808,"top":0.14844373,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"bounds":{"left":0.5688165,"top":0.14844373,"width":0.00731383,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"bounds":{"left":0.578125,"top":0.14844373,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.58976066,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"7","depth":4,"bounds":{"left":0.59973407,"top":0.14844373,"width":0.0076462766,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.6090425,"top":0.14684756,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.6163564,"top":0.14684756,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token\nWHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token\nWHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"bounds":{"left":0.011968086,"top":0.047885075,"width":0.024268618,"height":0.024740623},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50175
|
NULL
|
NULL
|
NULL
|
|
50178
|
1779
|
3
|
2026-05-18T07:21:48.503361+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088908503_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"21","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"1","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND \nWHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND \nWHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
idle
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50176
|
NULL
|
NULL
|
NULL
|
|
50181
|
1780
|
3
|
2026-05-18T07:21:59.691440+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088919691_m2.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7962651264686056251
|
-7483856360197085818
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
PhostormFV faVsco.js~VIewINavicare%9 pipedrive-sdk-pocvProjectO composer.jsoncomooser lock0 dependency-checker.json0 dev.json=ids.txtE infection.json.distM+ INSTALL.mdM+ INTERNAL_WEBHOOK_SETUP.mdEjiminny_storageM+licenses.mdM Makefilepackage-lock. son=phostan.neon.distE phpstan-baseline.neon< phounit.xmlM+ PIPEDRIVE V2 MIGRATION_ PLAN.moTe raw sal querv.saML README.mdso sonar-oroiect.oropertiesE test.py<> Untited Diadram.xmliI vetur.config.jsMI WEBHOOK FILTERING IMPLEMENTATION.mo› ib External Librariesv = Scratches and Consoles~ D Database ConsolesVASUA console (EU]A DEAL RISKS [EU]A DI [EU]A EU (EU]vAjiminny@localhostA console ljiminny@localhost]A DI [jiminny@localhost]A HS_local [jiminny@localhost]&sr TiminnyolocalnostlA zoho_dev [jiminny@localhost]V A PROD& console PRODII& console 1 PRODI4DI PRODCodeLaravelKeractor> A QAI> A QAI PRODSTAGINGA console [STAGINGIA console 1 StAGiNG)#uranus STAGINGI> D Extensions) M Scratches*C. :, FOR, LIMIT, LOCK, ORDER, WHERE or 'T' expected, got ''® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpE custom.logE laravel.logA HS_local (jiminny@localhost]© Kernel.php4 SF [iminny@localhost] X4 console (STAGING]A console (PROD]f users [PROD]© TestPipedriveOfficialSakCommand.phpc createrlaybookcreatedevent.ongTx: AutovPaygrounddajiminny~SELECT * FROM activities WHERE uuid to bint • 458e€915-b914C21 A2 418 V2 Y8 Ac) IntearationApp/Service.phpC) PlanhatactivityListener.phppnp api.ono xTeamController.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.pho(C)AskAnythinaPromptService.php© AutomatedReportsRepository.phpC) RequestGenerateReport.Job.ohv222select * from leads;(C)AutomatedReportResult.ohv® CreateTeamRequest.php(C) AutomatedRenort.oho© UserInvitationDTO.php224226228SELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuicSELECT * FROM activities WHERE id IN (16,422003);SELECT * FROM activities where status = 'failed';SELECT * FROM tracks WHERE activity_id = 422003;organizaSrouter->aroundf'middleware= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix''/settings'], static function (Router Srouter): V232ations'l, static function Router Sroz:->post(uri: '/*. [OrganizationController: :class,"store"Dzations.store');SELECT$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']] 237H):// IntegrationsSrouter->group(['middleware' => 'permission:' . PermissionEnum: :MANAGE_INTEGR 242$router->get( uri: '/integrations', [IntegrationController: :class,'all']) /api/ 244->m1ddLeware miadleware:'permission:• PermissionEnum::READ_INTEGRATIONS 245'ap1.1nteqrations.1ndex'FROM activities aJOIN users u 1.n<->1: ON a.user_id = u.idWHEREa.status = 'compleredAND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = v.uuidAND a.deleted at IS NULlAND EXISTS(SELECT 1 FROM tracks tWHERE t.activity_id = a.idAND t.type IN ('audio'.'video')ORDER BY a,actual start time DESCLIMIT 254// Slack API for getting slack channels listsrouter->qete ur'{notificationProvider}/channels', [Controllers|Notification249select * from teams where id = 19;select * from crm_configurations where provider = 'pipedrive':CONCAT(u.id, CASE WHEN v.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,u.email,// Team actions. XXX: These all need moving out to their own controllers.Srouter->arouodorefix'zations'], static function (Router Srouter,s:Internal Kiosk. This whole section will be moved out to a senarate file->prefix( uri: 'kiosk')'can:kiosk,' . User: :class)->group(static function (Router Srouter): void {...});> Srouter -greus (' msetemare' → ('authiapst )1, statio function (Routen trouter)2577250 v-263t.owner_id FROM social_accounts saJOIN users u on u.id = sa.sociable idJOIN teams t 1.n<->1: on t.id = u.team_idWHERE u.team_id = 19 and sa.provider = 'pipedrive':SELECT * FROM social accounts WHERE id = 1116:UPDATE social_accounts SET provider_user_token = 'pipedrive'AND provider_refresh_token = 'pipedrive'AND expires = 123AND state> $router->group(['middleware' >> l'api']], static function (Router $router): void 264WHERE id = 1116;> $router->group(['prefix' => 'user'], static function (Router $router): void {...}• Preparation tor Kell. In 4h 33 m100% 5• Mon 18 May 10:21:59+0 ..CascadeMigrating to PipedriveRead api.php #L325-334D api.phpThouahts>Read api.php #L725-734Thouahts>D api.phpThoughts >• docker exec docker lamp 1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test 1: OAuth InitializationPASS - OAuthInitialization: Client initialized successfully in 219.21msTe token tiengeRi opeToken is expired: YESTest zat Gewbeaswith DB token --ErronCall to undefined method Pinedrivelversionsiv2\AniDealsAni..getA11Dealsow+1 -11+1-1leals using getAllDeals() in (selapsed)ms", selapsed) ;) catch (=xceptron se2) 1selapsed = round((microtime(true) - $startTime) * 1000, 2);ommandi: ites tGetDea ls (Object (Pipedrivelversionslv2/ Configuration))pa/coycoescelcodonn/Concnla/Commande/Crm/Toctpinodriuon44?rio1C/kChmmand..nhn.0hAThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so | can continue testing the v2 SDK method mappings.Tenl aee2 4iles 1911-28>* Reject allAccent allAsk anvthina (*4L)SWE-1.6NN Windeurf Toame 262015 UITC.9...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50179
|
1779
|
4
|
2026-05-18T07:21:59.691500+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088919691_m1.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
4013489942575271730
|
-7483500116281160310
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0Preparation for Refi... in 4 h 39 m100% <78• Mon 18 May 10:21:59DOCKER (docker-compose)O 82T81DOCKER81DEV (-zsh)T1DOCKER (docker-compose)73757df8fba)since 2026-02-17 15:09:59(delay: bs)docker_lamp_1| Team AircallDemo (7980e5eb-b11c-4cee-9c21-8bb29ba85f3b) is not yet assignedan owner.skipping...docker_1amp_11 [HubSpot] Syncing objects for GoStudent UAT (b2d49a54-b645-4637-a7ae-a86cfce6e8e4) since 2026-02-17 15:09:59 (delay: 1s)docker_lamp_1I [HubSpot] Syncing objects for JustCall (c6b9d6b0-b48d-4832-a68c-a57d60651888) since2026-02-17 15:07:41 (delay: 1s)docker_lamp_1I Team Twilio Video (c334ca55-b230-411c-b10e-31c8204bd07b) is not yet assignedanowner.skipping...docker_lamp_11 Team MyTest Account 3000 (dbc9990d-b35f-4e38-9550-22cdd6059514) is notyet assignedan owner. skipping.docker_lamp_1I Team test (7997eb70-8aa4-491a-870d-311977568df4) is not yet assignedanowner.skipping...docker_1amp_1I Team Test (Se06dcee-0613-470e-9a77-2c283198f3bf) is not yet assigned anowner.skipping...docker_lamp_1I Team test ogg auto sync (da44776e-306f-427a-83d8-a1b4baa5537e) is not yet assigned an owner. skipping...docker_lamp_1I Team Tourlaner (d9b71080-388b-4cf5-8175-aa0f29bee635) is not yet assignedan owner.skipping….docker_lamp_1I Dispatched 4 HubSpot sync jobsdocker_lamp_1docker_lamp_1.••1s DONE• '/usr/local/bin/php' 'artisan'crm: sync-hubspot-objects > */proc/1/fd/1'2>81docker_1amp_1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:run2026-05-18 07:21:27 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects1S DONEdocker_lamp_12026-05-18 07:21:29 Jiminny \Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects45.31mS DONEdocker_1amp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects22.79ms DONEdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny (JobsICrm\SyncHubspotObjects20.63msDONEView in Docker Desktopo View ConfigEnable WatchAPP (-zsh)*3screenpipe"PROD (ssh)Run'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X T3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parentsukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|...
|
50176
|
NULL
|
NULL
|
NULL
|
|
50180
|
1779
|
5
|
2026-05-18T07:22:01.065337+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088921065_m1.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"23","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"22","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"17","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT * FROM teams WHERE id = 1;\n\nselect * from crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 283;\nSELECT * FROM crm_fields WHERE id = 2234;\nSELECT * FROM crm_field_values WHERE crm_field_id = 2234;\n\nselect * from crm_profiles where user_id = 143;\n\nselect * from record_types where crm_configuration_id = 39; # 0121K000001MHElQAO,0121K000001MHEqQAO\nselect * from business_processes where crm_configuration_id = 39;\n# 01941000000H669AAC, 01941000000H66JAAS\n\nselect * from record_type_field_values\n where record_type_id IN (24);\n\nselect * from crm_field_values where id IN (2730);\n\nselect * from crm_configurations where id = 39;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce'; #1035\n\n\nselect * from users where team_id = 1; # 222 group 3\nSELECT * FROM activities WHERE user_id = 222 order by id desc;\nselect * from sidekick_settings where team_id = 1;\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\n\nselect * from activities where crm_configuration_id = 2\nand provider = 'ms-teams' and id = 608765;\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id = '59523413338';\n\nselect * from sidekick_settings where team_id = 2;\n\nSELECT * FROM activities WHERE id = 608660;\nselect * from activity_summary_logs where activity_id = 608660;\nselect * from ai_prompts where transcription_id = 11214;\n\n# ********************************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('ed78a437-2804-450e-ab2f-56ab1c641346') = uuid;\n# id: 608818, crm: 59628809737\nSELECT * FROM activities WHERE uuid_to_bin('36b06e55-afdd-4782-8dee-c624cd0af191') = uuid;\n# id: 608821, crm: 59632069252\nSELECT ce.start_time, ce.end_time, a.id, a.uuid, crm_provider_id, calendar_event_id, title,\nplaybook_category_id, user_id, lead_id, contact_id, account_id, opportunity_id,\nscheduled_start_time, scheduled_end_time, actual_start_time, actual_end_time, a.created_at\nFROM activities a\njoin calendar_events ce on a.calendar_event_id = ce.id\nWHERE a.id IN (608818, 608821);\n\nselect * from users where team_id = 1;\nselect * from team_settings where team_id = 1;\nselect * from crm_profiles where crm_configuration_id = 39 order by user_id;\n\nselect * from team_features where team_id = 1;\n\nselect * from users where team_id = 2;\n\nSELECT * FROM activities WHERE uuid_to_bin('ec7647e9-5225-458b-b475-f31aa2769204') = uuid; # 612639\n# Preslava N. Ivanova, grou id 3\n\nSELECT * FROM opportunities WHERE uuid_to_bin('a2928fe5-aec5-46cb-85d9-7654c89e46a6') = uuid;\n\nselect * from activities where opportunity_id = 344 and actual_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00';\n\nselect\n a.id,\n a.type,\n a.scheduled_start_time,\n a.actual_start_time,\n a.created_at,\n a.opportunity_id,\n a.status\nFROM activities a\nWHERE opportunity_id = 344\nand status IN ('completed', 'received', 'delivered')\nand (\n (a.actual_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00')\nOR (a.created_at between '2024-10-11 00:00:00' and '2024-10-12 00:00:00')\nOR (a.scheduled_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00'))\n;\n\nSELECT * FROM users WHERE id = 222;\n\nSELECT * FROM crm_profiles WHERE user_id = 222;\nselect * from crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 281;\n\nselect * from group_deal_risk_types;\n\nselect * from opportunities where team_id = 1;\n\nSELECT * FROM opportunities WHERE id = 315;\nSELECT * FROM crm_field_data WHERE object_id = 315;\nselect * from crm_field_data where object_id = 260;\n\nselect * from generic_ai_prompts where subject_id = 315;\n\nselect * from teams; # 36, 21, 121, james.graham@bullhorn.jiminny.com\nSELECT * FROM social_accounts WHERE sociable_id = 121 and provider = 'bullhorn';\n\n# ************************************************************************************\nselect * from teams where id = 1;\nselect * from crm_configurations where id = 39;\nselect * from users where team_id = 1;\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 1;\n# 1 - 00541000004281rAAA\n# 204 - 0052g000003freeAAA\n# 429 - 0052g000003qGOiAAM\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce';\n\nselect * from activities where type = 'softphone'\nand created_at > '2024-12-11 15:24:36' order by id desc;\n\nselect * from activity_providers where team_id = 1;\nselect * from activity_provider_users where activity_provider_id = 328;\n\nselect * from opportunities where crm_configuration_id = 39\nAND account_id = 178 AND is_closed = false\norder by created_at DESC;\n\nselect * from contacts where id = 3952;\nselect * from accounts where id = 178;\n\n# ************************************************************************************\nselect * from teams where id = 36;\nselect * from crm_configurations where id = 21;\nselect * from users where team_id = 36;\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 36;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 36\nand sa.provider = 'bullhorn';\n\nselect * from social_accounts where id = 348;\nUPDATE social_accounts SET\nprovider_user_token = '21442_6802599_91:41179a58-21e7-4d7c-ad58-56bb666b2f65',\nprovider_refresh_token = '21442_6802599_91:01c6b335-3f2a-42e4-85ff-8a08fa65fceb',\nexpires = 1733998131,\nstate = 'connected'\nWHERE id = 348;\n\n# ************************************************************************************\nselect * from teams where id = 31;\nselect * from crm_configurations where id = 18;\n\nselect * from users where team_id = 31; # 257\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 31;\n\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 31\nand sa.provider = 'close';\n\nselect * from contacts where crm_configuration_id = 18;\n\n# ********************** NEPTUNE **************************************************************\nselect * from teams;\nselect * from users where id IN (1030, 1035, 1052);\nselect * from crm_configurations;\n\nselect * from users where team_id = 65; # 257\nselect * from team_settings where team_id = 65; # 257\nselect * from invitations where team_id = 65; # 257\nselect * from users where email = 'integration-account@jiminny.com'; # 257\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 65;\n\nselect * from crm_configurations where id = 53;\nselect * from accounts where crm_configuration_id = 53 order by id desc;\nselect * from leads where crm_configuration_id = 53 order by id desc;\nselect * from contacts where crm_configuration_id = 53 order by id desc;\nselect * from opportunities where crm_configuration_id = 53 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 53 order by id desc;\nselect * from crm_fields where crm_configuration_id = 53 order by id desc;\nselect * from crm_field_values where crm_field_id = 3341 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 53 order by id desc;\nselect * from stages where crm_configuration_id = 53 order by id desc;\n\n\nselect * from crm_profiles where crm_configuration_id = 13;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 65\nand sa.provider = 'integration-app';\n\nselect * from contacts where crm_configuration_id = 13;\n\nselect * from social_accounts where sociable_id = 283;\n\nSELECT * FROM opportunities WHERE crm_provider_id = '006O400000E9bzeIAB';\n\nselect * from activity_providers where team_id = 65;\nSELECT * FROM activities WHERE crm_configuration_id IN (51, 52, 53);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 65\n;\n\n# ***************************** STAGING ********************************************\nSELECT * FROM teams;\nSELECT * FROM teams WHERE id = 88;\nSELECT * FROM teams WHERE id = 89;\nselect * from team_settings where team_id = 89;\nSELECT * FROM users WHERE team_id = 89;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 89;\n\nselect * from users;\nSELECT * FROM social_accounts WHERE sociable_id = 1761;\nSELECT * FROM crm_configurations WHERE id = 70;\nselect * from accounts where crm_configuration_id = 70 order by id desc;\nselect * from leads where crm_configuration_id = 70 order by id desc;\nselect * from contacts where crm_configuration_id = 70 order by id desc;\nselect * from opportunities where crm_configuration_id = 70 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 70 order by id desc;\nselect * from crm_fields where crm_configuration_id = 70 order by id desc;\nselect * from crm_field_values where crm_field_id = 3536 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 70 order by id desc;\nselect * from stages where crm_configuration_id = 70 order by id desc;\nselect * from business_processes where crm_configuration_id = 70 order by id desc;\nselect * from business_process_stages where business_process_id = 34;\n\nselect * from contacts where id = 10468;\n\nselect * from crm_layouts where crm_configuration_id = 70;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 388;\nSELECT * FROM crm_fields WHERE id IN (3533,3534,3535);\n\nselect * from activities where crm_configuration_id = 70\nand (account_id IS NOT NULL or lead_id IS NOT NULL or contact_id IS NOT NULL or opportunity_id IS NOT NULL) order by id desc;\n\nSELECT * FROM activities WHERE uuid_to_bin('2e10b60f-8a61-41c5-a3d4-28835353dc65') = uuid;\nSELECT * FROM activities where crm_configuration_id = 69 ;\n\nSELECT * FROM users WHERE email LIKE '%jiminny_web_sa2@jiminny.com%';\nSELECT * FROM activities WHERE uuid_to_bin('5a150c93-40fc-42ec-b3bd-c1d328e09f6e') = uuid;\nSELECT * FROM opportunities WHERE id = 385;\n\nselect * from participants p\njoin activities a on p.activity_id = a.id\nwhere a.crm_configuration_id = 70\nand (p.lead_id IS NOT NULL or p.contact_id IS NOT NULL);\nSELECT * FROM participants WHERE id = 1013638;\n\nselect * from teams where id = 90;\nselect * from users where team_id = 90;\nselect * from social_accounts where social_accounts.sociable_id IN (1960,1760);\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 71;\nselect * from invitations where team_id = 90;\n\nselect * from crm_configurations where id = 71;\nselect * from accounts where crm_configuration_id = 71 order by id desc;\nselect * from leads where crm_configuration_id = 71 order by id desc;\nselect * from contacts where crm_configuration_id = 71 order by id desc;\nselect * from opportunities where crm_configuration_id = 71 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 71 order by id desc;\nselect * from crm_fields where crm_configuration_id = 71 order by id desc;\nselect * from crm_field_values where crm_field_id = 3341 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 71 order by id desc;\nselect * from stages where crm_configuration_id = 71 order by id desc;\n\nselect * from users order by secondary_email desc;\nselect u.id, u.email, u.status, sa.id, sa.provider_user_id from social_accounts sa\n join users u on sa.sociable_id = u.id\nwhere sa.provider = 'google' and u.email LIKE 'aneliya%';\n\nselect * from failed_jobs order by id desc;\n\nselect * from users where email = 'ben.allwright@learningpeople.co.uk' or secondary_email = 'ben.allwright@learningpeople.co.uk';\n\nselect * from teams;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 39;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 39 and object_type = 'task';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce';\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('c38b3895-fd0f-4b1f-9fb2-c170dba137c6') = uuid;\nSELECT * FROM crm_configurations WHERE id = 70;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1;\nselect * from users where team_id = 1;\n\nselect o.id, o.name,o.close_date, u.id, u.name, u.group_id, r.id, r.display_name, g.name, g.scope from opportunities o\njoin users u on o.user_id = u.id\njoin groups g on u.group_id = g.id\njoin role_user ru on u.id = ru.user_id\njoin roles r on ru.role_id = r.id\nwhere o.crm_configuration_id = 39 and close_date > '2024-01-01 00:00:00';\n\nselect * from role_user where user_id = 143;\nselect * from roles;\n\nselect * from role_user;\nselect * from groups where id = 9;\nselect * from scope_groups where group_id = 9;\n\n# ************************************************************************************\nselect * from teams where id = 36;\nselect * from crm_configurations;\nSELECT * FROM social_accounts WHERE sociable_id = 121;\n\nhttps://crmsandbox.zoho.com/crm/jiminnyw4/tab/Leads/4776201000005049105\nhttps://crmsandbox.zoho.com/crm/\n\nhttps://crm.zoho.com/crm/org3469620/tab/Leads/230045000229559080\n https://crm.zoho.com/crm/\n org3469620\n\nSELECT * FROM activities WHERE uuid_to_bin('03382d20-c8bc-48e7-a3d4-90b52fa5ceab') = uuid;\n\nselect * from users where email LIKE \"%mobile_automation_%\";\nselect * from social_accounts where sociable_id IN (2228);\nselect * from crm_profiles where user_id IN (2222,2223,2226,2227);\n\nselect * from teams order by id desc;\nSELECT * FROM users WHERE id = 2229;\nSELECT * FROM crm_profiles WHERE user_id = 2229;\nselect * from opportunities where crm_configuration_id = 88;\nselect * from crm_fields where crm_configuration_id = 88;\nselect * from crm_profiles where crm_configuration_id = 88;\n\nSELECT * FROM teams WHERE id = 1;\n\nSELECT * FROM users WHERE id = 143;\nSELECT * FROM users WHERE uuid_to_bin('fde193d3-06a2-4e1a-8895-62b94039215d') = uuid;\nSELECT * FROM teams WHERE uuid_to_bin('73385071-a756-42ae-9c73-8b53f2309467') = uuid;\n\nhttps://app.staging.jiminny.com/ondemand?\n min_duration=1\n &\n only_recorded=1\n &\n user_id%5B%5D=641f1acb-16b8-42d1-8726-df52979dad0e\n &\n sequence_number=2\n\n select * from users where team_id = 1 and email like '%stoyan%'\n\nselect * from coaching_feedbacks;\n\nselect * from teams;\nSELECT * FROM users WHERE team_id = 36;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 19\nand sa.provider = 'pipedrive';\n\nselect * from users where id = 143;\n\nSELECT * FROM users WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\nSELECT * FROM teams WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\nSELECT * FROM activity_shares WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\n\nselect * from users where team_id = 2;\nselect * from activities where crm_configuration_id = 39\nand activities.scheduled_start_time BETWEEN '2025-04-09 00:00:00' AND '2025-04-09 23:59:59'\nAND user_id = 143\norder by id desc;\n\n# ************************************************************************************\nselect * from teams where id = 142; # 2312, 126\nselect * from team_settings;\nselect * from users where team_id = 142; # 21642\nSELECT * FROM social_accounts WHERE sociable_id = 21642;\nSELECT * FROM crm_profiles cp join users u ON u.id = cp.user_id WHERE team_id = 142;\nselect * from crm_profiles where id IN (93);\nselect * from invitations;\nselect * from team_features where team_id = 1;\n\nSELECT * FROM crm_configurations WHERE id = 126;\nselect * from accounts where crm_configuration_id = 126 order by id desc;\nselect * from leads where crm_configuration_id = 126 order by id desc;\nselect * from contacts where crm_configuration_id = 126 order by id desc;\nselect * from opportunities where crm_configuration_id = 126 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 126 order by id desc;\nselect * from crm_fields where crm_configuration_id = 126 # 11060\n# and type IN ('picklist', 'status')\n# and object_type = 'task'\norder by id desc;\n# 5731,5732,5733\nselect DISTINCT crm_field_id from crm_field_values where crm_field_id IN (11151,12239,12215,12185,12175,12165,12144,12137,12127,12109,12107,12105,12103,12092,12037,12005,12003,11987,11969,11958,11951,11942,11931,11924,11921,11917,11915,11901,11893,11883,11872,11870,11868,11866,11839,11833,11821,11793,11780,11777,11769,11757,11737,11735,11656,11645,11638,11629,11618,11611,11602,11591,11584,11581,11558,11544,11543,11534,11532,11529,11527,11503,11497,11493,11488,11470,11468,11457,11455,11397,11387,11372,11363,11348,11323,11318,11309,11301,11300,11292,11290,11286,11284,11256,11252,11242,11237,11233,11219,11176,11160) order by id desc;\nselect * from crm_layouts where crm_configuration_id = 126 order by id desc;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id in (300,299,298);\nselect * from stages where crm_configuration_id = 126 order by id desc;\nselect * from business_processes where crm_configuration_id = 126 order by id desc;\nselect * from business_process_stages where business_process_id IN (76,75,74,73);\nselect * from playbooks where team_id = 142;\nselect * from playbook_layouts where playbook_id IN (108);\nSELECT * FROM playbook_categories WHERE playbook_id IN (108);\n\nselect * from teams where id = 130;\nSELECT * FROM social_accounts WHERE sociable_id = 2291;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 2\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities\n WHERE crm_configuration_id = 110;\n\nselect * from teams;\nselect * from crm_configurations;\n\nSELECT * FROM activities WHERE id = 628773;\nSELECT * FROM crm_profiles WHERE user_id = 1460;\nSELECT * FROM social_accounts WHERE sociable_id = 2291;\n\nselect * from teams;\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from teams where id = 145;\nselect * from crm_configurations where id = 129;\nselect * from social_accounts where sociable_id = 2317;\nSELECT * FROM activities WHERE uuid_to_bin('8dbab184-a333-4268-ad57-fb41f8d53a9a') = uuid;\n\nselect * from teams where id = 1;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 280;\nSELECT * FROM crm_layout_entities WHERE id = 5507;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 39 and object_type IN ('event');\n\nselect * from teams;\nselect * from activities where crm_configuration_id = 14;\n\nSELECT * FROM social_accounts where provider = 'copper';\n\nselect * from activities where id = 628467;\nselect * from participants where activity_id = 628467;\n\nSELECT * FROM contacts WHERE id = 3969;\nSELECT * FROM accounts WHERE id = 177;\n\nSELECT * FROM activities WHERE uuid_to_bin('4eb54c77-cfa3-2bd4-84a7-9ed46a21c988') = uuid;\n\n# ********************* BH\nselect * from teams where id = 36;\nSELECT * FROM crm_configurations WHERE id = 21;\nselect * from activities where crm_configuration_id = 21 and id = 607901;\nselect * from activities where crm_configuration_id = 21;\n\nselect * roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 226;\n\nselect * from migrations order by id desc;\n\n# mercury\n# neptune\n# earth\n\nselect * from teams;\nselect * from teams where id = 19;\nselect * from teams where id = 27;\nselect * from users where team_id = 27;\nSELECT * FROM crm_configurations WHERE id = 42;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 19\nand sa.provider = 'pipedrive';\n\nselect * from activities where id = 631461;\nSELECT * FROM crm_field_values WHERE crm_field_id = 180;\n\nselect * from teams where id = 2;\nSELECT * FROM social_accounts WHERE sociable_id = 89;\n\nSELECT * FROM activities WHERE uuid_to_bin('ba0c029a-bc14-4e17-8603-64174acebcbb') = uuid; # 634273\nselect * from activity_summary_logs where activity_id = 634273;\n\nselect * from sidekick_settings where team_id = 2;\n\nselect * from teams; # 2, 2\nSELECT * FROM crm_configurations WHERE team_id = 2; # 2\nselect * from team_features where team_id = 2;\nselect * from features;\nSELECT * FROM opportunities WHERE crm_configuration_id = 2 and crm_provider_id = '51317301383';\nSELECT * FROM opportunities WHERE crm_configuration_id = 2 order by id desc;\n\nselect * from automated_reports order by id desc;\nselect * from automated_report_results order by id desc;\nselect * from users where team_id = 1 and id IN (7160, 3248);\nselect * from migrations order by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1052 and sa.provider = 'hubspot';\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 565;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 175;\nselect * from playbook_categories where playbook_id = 175;\nselect * from users where team_id = 1052;\nselect * from users where id = 7160;\nselect * from crm_profiles where user_id = 7160;\nselect * from features;\nselect\n *\n# id, uuid, type, provider, playbook_category_id, user_id, lead_id, contact_id, account_id, opportunity_id, stage_id,\n# crm_configuration_id, crm_provider_id, transcription_id, status\nfrom activities where crm_configuration_id = 1 and type = 'conference'\n# and crm_provider_id IS NOT NULL\nand provider != 'uploader' and actual_start_time IS NOT NULL\nORDER by id desc;\nselect * from activities where id = 54747783; # 00UO400000pCzojMAC\n\nselect p.id, p.activity_type, pc.id, pc.name\nFROM playbooks p\njoin playbook_categories pc on p.id = pc.playbook_id\nwhere p.team_id = 1 and p.activity_type = 'event';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 1 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id = 4;\n\nselect * from crm_layouts cl join playbook_layouts pl on cl.id = pl.layout_id\nwhere crm_configuration_id = 1 and pl.playbook_id = 175;\n\nselect * from teams;\nSELECT r.* FROM automated_reports r\njoin teams t on r.team_id = t.id\nWHERE r.frequency = 'daily'\n and r.status = 1\nAND t.status = 'active'\nAND (r.expires_at >= now() OR r.expires_at IS NULL);\n\nselect * from automated_report_results where report_id IN (18, 33);\n\nselect * from activity_searches where id = 10932;\nselect * from activity_search_filters where activity_search_id = 10932;\nselect * from automated_reports order by id desc;\nselect * from automated_report_results order by id desc;\nselect * from automated_reports where id IN (55);\nselect * from automated_report_results where id IN (81);\nselect * from users where id IN (10633, 13987, 11985);\nselect * from users where group_id IN (3710);\n\nSELECT * FROM automated_reports WHERE uuid_to_bin('18a06a75-afd2-476f-aadc-14d4057bdda2') = uuid;\nSELECT * FROM automated_report_results WHERE uuid_to_bin('582d4b50-8cd3-42a9-9819-d676ff8f3b43') = uuid;\n\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\nSELECT * FROM automated_report_results WHERE uuid_to_bin('82e74956-6144-4cd1-a3d3-af985c3070a4') = uuid;\n\nselect * from teams where id = 1029;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1029 and sa.provider = 'pipedrive';\n\n[\n {\n \"user_id\": \"23460 (owner)\",\n \"email\": \"integration-account@pipedrive.jiminny.com\",\n \"id\": 69,\n \"sociable_id\": 23460,\n \"provider_user_id\": \"19555731\",\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,\n \"refresh_token_expires\": null,\n \"provider\": \"pipedrive\",\n \"state\": \"connected\",\n \"auth_scope\": \"base,deals:full,activities:full,contacts:full,search:read\",\n \"retry_after\": null,\n \"created_at\": \"2025-04-16 08:23:28\",\n \"updated_at\": \"2026-05-18 07:13:18\",\n \"provider_user_token_encrypted\": \"eyJpdiI6Ik9oYzBwcTVteWN4ajBRaDdMb0FjWGc9PSIsInZhbHVlIjoiQUNMbjU5UHR2Q1RnbWRXMEU1TUx6UVpRU3gzdVc5WktmTE4rVlhXa3lRaGhyUUlZMVZRWEJuR0JaWWhZZXNPRlBuanhuYU5MVHZ5TG9NTVVjNjJSUUpZZ2VhbGYxbHg0UzJEdTVmQjNFZnJRZkMwYjd0N2RMZ05GRS9IR3c2K0NoVjBjYTA5UG12SkxHeDlDMGVNN3ptUWUzblFiTngyYzR1eUpHSEYrdEwvZm0yZklGYjBSNEtTR2ZGazhLM1hqT3lVbjFobDNPZ0d3anFlcjhKcXpERlZGOVN1YmFyNDIvM1BFRDFMYnp4WEI4TGVLM2xYcy9CL0RDOWlQNHI3N0NwWnJPMWRtZllmM2ZKeE9TV2NBeDZxL2M1YnlSVzd3ZW96T3F1QmtBYXBHYkUraGcvdCtRajlYZXBjVVBSdFlMUjVPVDVJbDdyenVoWjMrbVJvU3ZZR1dQZ3pqQ3F3aDF2U2xPZWZIN3BCWVFLNXpxQUtDb2pIK0xHc1E3SklSM3Q0VkNSbm9oK2pFK3hLaW54T1dWbEVneUp0RGhhdVBuOFI4MXROc3dZWnFnTUpiaDVMMnZ4QmlRM3k4QWFlMVFWUFYvdGhJQzZBYnhBQmhWa2ZKN1ZhSnhpaExxbmlTemgzUWw3aXJtWjlSMlhmd0lWMDNDN1N3My9Ua0hCL2xqY3RkVFhMSjFJMDRjOE5DWlgrZ3FMVXN6RWlwUE5GWERZdG1xVjVxOFlLRGs2VVJKS3FLeWRxQjYxdDh4Z2JJNXhlWEZ3dkQ4SGtybDNUcndzblFHeVJNRkYraFh2UDFIUTdMQ1BZa3dEU1dBbzk5K0dyT2RNVFBZZUJpRytSck5pYlI1YUZyMmhUNEZCdWxHYmJLREtzbUpjVkhvV0RoejJpbm1SWHlNaXE5M0RhcS94UW9EdFoweWF3bVFVY0dTZWFPSXBmOCtDYndia215cmtyZU1oT0Exam1CV2tPblNhYjY4clVEeUs3anVHUmNHeS9YLzRha1VhbGl3N3lwaDlzZnRhQUZta2s4eFllNHgzRklSRmNyazJ4dlBDMnByNCtBRjNaVjJCTT0iLCJtYWMiOiJkYTQxZDY1OTY2ZTljMTgyZWRhNGEzMGZjZDc2MjBjN2NlNzU2YTViNGQxNWE1NTI2ZmI1MWQyYjQ2ODYxZmEwIiwidGFnIjoiIn0=\",\n \"provider_refresh_token_encrypted\": \"eyJpdiI6Imt2bGxlSmxUK05GMjF0dEtPaTMrUlE9PSIsInZhbHVlIjoiUXZHTElZRXkreHFxUU02SnZ4eVBacG9WWTRlVkd0USszV3JyVFlpU2ZaY25GSWo2WFcrRzNlbFRlUXRQczNwSXRCcEdvZEpveG9jMzBDSTgwdnZLQnc9PSIsIm1hYyI6ImQxYWI0NzU5Nzg5MDI4YWVhZmQ4Mjg1YzhkZDQzMjRkYWYwYTdhZTY5MDMxMjc0OWNiYjY0Nzc3NDQ0MTEyY2EiLCJ0YWciOiIifQ==\",\n \"encryption_key\": \"0x01020300786192D9D96DD60D3D1EBC9DFAEE5F0C45EE80165CF3F3D2B3B627026AA7CFC7CA0128DD463535D32EE491ADBADF8B07596B0000006E306C06092A864886F70D010706A05F305D020100305806092A864886F70D010701301E060960864801650304012E3011040C7FB1319048ECB2EA3F23B995020110802B52D22F5EAD341AB238FBBCB6093156E443876A664BA5555D722565C2B2D04422C868CD7350555E3CC74221\",\n \"sociable_type\": \"user\",\n \"owner_id\": 23460\n },\n {\n \"user_id\": \"23463\",\n \"email\": \"jiminny_web_sa@pipedrive.jiminny.com\",\n \"id\": 72,\n \"sociable_id\": 23463,\n \"provider_user_id\": \"23270841\",\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:txqCuWLeVhgwiaFqXIvQWWrtrnFIy_4lT3VCr-sRB4g6_2lK8KcQ_6ka_qFmZhr-IeIAKmAImx6H1iIKx4Ab7XZ5MnKIh03GKbHjI0n0rGT9UYkeH21jKOxJvKaSX_TyLbxFPR6irPQyvqcpBClXI52gVJH01KzZy_dMTHFXhhDLOIhEpSrQXHG7Qo8q7OuBeSPZrU1ALi9kmAm4GTpzGTbzfl-hUt9IAfPunJOCyv3mf2Tl-MT8EyQgOFPrsP3yz9UlSyVhb40zO_bCnUrqNxjwgm_E6vgpVrwULTQbHe-43Dq-TRetjceUzT88GBgVJ0UdxXP5BRBVXcL5ir8-9ZTMaNU\",\n \"provider_refresh_token\": \"5034113:23270841:34790b44838f5fd422c2d2c82e00f1ecf2178ad1\",\n \"expires\": 1753837219,\n \"refresh_token_expires\": null,\n \"provider\": \"pipedrive\",\n \"state\": \"full-refresh\",\n \"auth_scope\": \"base,deals:full,activities:full,contacts:full,search:read\",\n \"retry_after\": null,\n \"created_at\": \"2025-04-16 10:41:12\",\n \"updated_at\": \"2025-07-30 01:00:17\",\n \"provider_user_token_encrypted\": \"eyJpdiI6InVEVEl2SzIxMjd1bkNDWG9lY3YvQ0E9PSIsInZhbHVlIjoiRlJLbDZ3ZHo2dHMxUWQwdGU2YUZjV3lPWHlxQTJ0eWh4S0RTMjlSaThVcktoaWhXcTd2UXl4Mjg4bW5UUnZCZEQ5NXpuQTVKOURiMDNIa3l3K0lSWCt5azRBOEdHbitWQXhxeEpMVUZ1dnF2NVl1TTZLelZOaGNvRlBLeGpIWlpoRGloUEprd2xoNUFPcTlLcUd3WVlUU2svR1NOeXBYQ2NnMWhnK1V2aytOeVVMNzJGdVZXMU1JS3BSaGNCcmxkVjEwQ01mQXNBdWNhS1lMZWZobnZwcHBkN1R4bUVDRUNYdnNtSVJkdG5MdkN3djJBT0hMRDl1MHFGbnl4WU13ejBkUWsrdUljWkZhcTJlN0JDSGdTVzlPY0FGMUJlZi9WRGpkMUk5R20wblYwSk9VR2FuaHpLTzJNeitMbnF1V1NEMUUxRmYzaDRGZDMyaXd3Z0FjQno4SzVoYjUyTmV3UXNpRlF4TGZKNVl3dUFqdGhKVWJjRVlUUXRGalBpaXJvSGJmbS8rd25aQ2Zvc05saHRDRjlHV1VEUFFiRU5xbWRVNkxFSXV0RUZyaUlYNWMwMmhnZ0Y1VUQ4eEFkY2QyWXpnR0NidkVJSWdjVGljUjA3NDdpZW9WUHhtSlpGSGdNU2hRUTA5ZW03RGpiRFdrdytkOHJXSUxlazZNaG9iaUg2NFZYdEc3YklMeFZvblBzWmVRSDcvN2M4WUNtL3h4S2IrUW00cXhialBia3BJcW5XallBNlV5WWdhcE1ZVFBBM3RSSUVBamYvOGZEQWM5a2FJMGwyWkRSU3dlTEtPemZlQ3RXRGNDcEdYRHdMNTlTQVg2SUdUN0hVaXdZT1dUOUlrVzkrZHFBemhwWXg1cm4rSy9UOHUzcnNSM2dISlhBRTEyVUNyTkZYaFJYUlN1a2RKVHhhM2dHckR3a1JGaVZ2Wk9BVnhTclVpSEhwWTVpQTlJbXVkOUxSTGpRbDk0a1VtbE9QMVAvN3VlVEhJUHd2elowd0laNVIzZ3M3N0ZOK0NDakIwQ2FicGxoMDBhTXI0VUppUmFOZHdlWUdGV21NNFQ4RU1nY0dnWT0iLCJtYWMiOiI0ZTU4ZmJkNTdkYmY0NGE4NTJjZjlhNDExNzE2YjhlOWM2NTA5OGY2MDA4OTcyZDVlOTljY2JjZDhmMjBhMDUyIiwidGFnIjoiIn0=\",\n \"provider_refresh_token_encrypted\": \"eyJpdiI6IkJGMkdRVHRKM2VTcitKNGcvQWJtUGc9PSIsInZhbHVlIjoicmFyRkxPZ1Rybm1ORXlEVjJ2TXFGTzJtM3hWaFhnUVVHN2ZlR1lRM0I5d3ozbnZTcU5EdzJqRkI2elhyNWhlenRTUXV3bjk0N1JXeklDMVAyUzBKcHc9PSIsIm1hYyI6ImJhODVjMGQyZDE3Y2ExNjc2OWVjYWJiNmFjYWVkODIyMTMyNWVhYTExMTgwYTEyMTU0MzUzZGE1YjQ5YzQ5ZjEiLCJ0YWciOiIifQ==\",\n \"encryption_key\": \"0x01020300788C37CDF66ABE9301A68D5D4866AC0C197E04EEE4D904F20A59991322EBAE252301BEF4B24FF01359E934E5654617E4EEAC0000006E306C06092A864886F70D010706A05F305D020100305806092A864886F70D010701301E060960864801650304012E3011040CEB00EF45BDEA999A5558889E020110802B925F372F7BEFAF0B45E48686113D1DA430ECFCC07B1F61BA6828CC44235278EDB05C486E8068D0BE737D91\",\n \"sociable_type\": \"user\",\n \"owner_id\": 23460\n }\n]","depth":4,"on_screen":true,"value":"SELECT * FROM teams WHERE id = 1;\n\nselect * from crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 283;\nSELECT * FROM crm_fields WHERE id = 2234;\nSELECT * FROM crm_field_values WHERE crm_field_id = 2234;\n\nselect * from crm_profiles where user_id = 143;\n\nselect * from record_types where crm_configuration_id = 39; # 0121K000001MHElQAO,0121K000001MHEqQAO\nselect * from business_processes where crm_configuration_id = 39;\n# 01941000000H669AAC, 01941000000H66JAAS\n\nselect * from record_type_field_values\n where record_type_id IN (24);\n\nselect * from crm_field_values where id IN (2730);\n\nselect * from crm_configurations where id = 39;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce'; #1035\n\n\nselect * from users where team_id = 1; # 222 group 3\nSELECT * FROM activities WHERE user_id = 222 order by id desc;\nselect * from sidekick_settings where team_id = 1;\nselect * from teams where id = 1;\nselect * from team_features where team_id = 1;\n\nselect * from activities where crm_configuration_id = 2\nand provider = 'ms-teams' and id = 608765;\n\nSELECT * FROM activities WHERE crm_configuration_id = 2 and crm_provider_id = '59523413338';\n\nselect * from sidekick_settings where team_id = 2;\n\nSELECT * FROM activities WHERE id = 608660;\nselect * from activity_summary_logs where activity_id = 608660;\nselect * from ai_prompts where transcription_id = 11214;\n\n# ********************************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('ed78a437-2804-450e-ab2f-56ab1c641346') = uuid;\n# id: 608818, crm: 59628809737\nSELECT * FROM activities WHERE uuid_to_bin('36b06e55-afdd-4782-8dee-c624cd0af191') = uuid;\n# id: 608821, crm: 59632069252\nSELECT ce.start_time, ce.end_time, a.id, a.uuid, crm_provider_id, calendar_event_id, title,\nplaybook_category_id, user_id, lead_id, contact_id, account_id, opportunity_id,\nscheduled_start_time, scheduled_end_time, actual_start_time, actual_end_time, a.created_at\nFROM activities a\njoin calendar_events ce on a.calendar_event_id = ce.id\nWHERE a.id IN (608818, 608821);\n\nselect * from users where team_id = 1;\nselect * from team_settings where team_id = 1;\nselect * from crm_profiles where crm_configuration_id = 39 order by user_id;\n\nselect * from team_features where team_id = 1;\n\nselect * from users where team_id = 2;\n\nSELECT * FROM activities WHERE uuid_to_bin('ec7647e9-5225-458b-b475-f31aa2769204') = uuid; # 612639\n# Preslava N. Ivanova, grou id 3\n\nSELECT * FROM opportunities WHERE uuid_to_bin('a2928fe5-aec5-46cb-85d9-7654c89e46a6') = uuid;\n\nselect * from activities where opportunity_id = 344 and actual_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00';\n\nselect\n a.id,\n a.type,\n a.scheduled_start_time,\n a.actual_start_time,\n a.created_at,\n a.opportunity_id,\n a.status\nFROM activities a\nWHERE opportunity_id = 344\nand status IN ('completed', 'received', 'delivered')\nand (\n (a.actual_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00')\nOR (a.created_at between '2024-10-11 00:00:00' and '2024-10-12 00:00:00')\nOR (a.scheduled_start_time between '2024-10-11 00:00:00' and '2024-10-12 00:00:00'))\n;\n\nSELECT * FROM users WHERE id = 222;\n\nSELECT * FROM crm_profiles WHERE user_id = 222;\nselect * from crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 281;\n\nselect * from group_deal_risk_types;\n\nselect * from opportunities where team_id = 1;\n\nSELECT * FROM opportunities WHERE id = 315;\nSELECT * FROM crm_field_data WHERE object_id = 315;\nselect * from crm_field_data where object_id = 260;\n\nselect * from generic_ai_prompts where subject_id = 315;\n\nselect * from teams; # 36, 21, 121, james.graham@bullhorn.jiminny.com\nSELECT * FROM social_accounts WHERE sociable_id = 121 and provider = 'bullhorn';\n\n# ************************************************************************************\nselect * from teams where id = 1;\nselect * from crm_configurations where id = 39;\nselect * from users where team_id = 1;\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 1;\n# 1 - 00541000004281rAAA\n# 204 - 0052g000003freeAAA\n# 429 - 0052g000003qGOiAAM\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce';\n\nselect * from activities where type = 'softphone'\nand created_at > '2024-12-11 15:24:36' order by id desc;\n\nselect * from activity_providers where team_id = 1;\nselect * from activity_provider_users where activity_provider_id = 328;\n\nselect * from opportunities where crm_configuration_id = 39\nAND account_id = 178 AND is_closed = false\norder by created_at DESC;\n\nselect * from contacts where id = 3952;\nselect * from accounts where id = 178;\n\n# ************************************************************************************\nselect * from teams where id = 36;\nselect * from crm_configurations where id = 21;\nselect * from users where team_id = 36;\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 36;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 36\nand sa.provider = 'bullhorn';\n\nselect * from social_accounts where id = 348;\nUPDATE social_accounts SET\nprovider_user_token = '21442_6802599_91:41179a58-21e7-4d7c-ad58-56bb666b2f65',\nprovider_refresh_token = '21442_6802599_91:01c6b335-3f2a-42e4-85ff-8a08fa65fceb',\nexpires = 1733998131,\nstate = 'connected'\nWHERE id = 348;\n\n# ************************************************************************************\nselect * from teams where id = 31;\nselect * from crm_configurations where id = 18;\n\nselect * from users where team_id = 31; # 257\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 31;\n\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 31\nand sa.provider = 'close';\n\nselect * from contacts where crm_configuration_id = 18;\n\n# ********************** NEPTUNE **************************************************************\nselect * from teams;\nselect * from users where id IN (1030, 1035, 1052);\nselect * from crm_configurations;\n\nselect * from users where team_id = 65; # 257\nselect * from team_settings where team_id = 65; # 257\nselect * from invitations where team_id = 65; # 257\nselect * from users where email = 'integration-account@jiminny.com'; # 257\nselect u.email, cp.* from users u\njoin crm_profiles cp on u.id = cp.user_id\nwhere u.team_id = 65;\n\nselect * from crm_configurations where id = 53;\nselect * from accounts where crm_configuration_id = 53 order by id desc;\nselect * from leads where crm_configuration_id = 53 order by id desc;\nselect * from contacts where crm_configuration_id = 53 order by id desc;\nselect * from opportunities where crm_configuration_id = 53 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 53 order by id desc;\nselect * from crm_fields where crm_configuration_id = 53 order by id desc;\nselect * from crm_field_values where crm_field_id = 3341 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 53 order by id desc;\nselect * from stages where crm_configuration_id = 53 order by id desc;\n\n\nselect * from crm_profiles where crm_configuration_id = 13;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 65\nand sa.provider = 'integration-app';\n\nselect * from contacts where crm_configuration_id = 13;\n\nselect * from social_accounts where sociable_id = 283;\n\nSELECT * FROM opportunities WHERE crm_provider_id = '006O400000E9bzeIAB';\n\nselect * from activity_providers where team_id = 65;\nSELECT * FROM activities WHERE crm_configuration_id IN (51, 52, 53);\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 65\n;\n\n# ***************************** STAGING ********************************************\nSELECT * FROM teams;\nSELECT * FROM teams WHERE id = 88;\nSELECT * FROM teams WHERE id = 89;\nselect * from team_settings where team_id = 89;\nSELECT * FROM users WHERE team_id = 89;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 89;\n\nselect * from users;\nSELECT * FROM social_accounts WHERE sociable_id = 1761;\nSELECT * FROM crm_configurations WHERE id = 70;\nselect * from accounts where crm_configuration_id = 70 order by id desc;\nselect * from leads where crm_configuration_id = 70 order by id desc;\nselect * from contacts where crm_configuration_id = 70 order by id desc;\nselect * from opportunities where crm_configuration_id = 70 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 70 order by id desc;\nselect * from crm_fields where crm_configuration_id = 70 order by id desc;\nselect * from crm_field_values where crm_field_id = 3536 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 70 order by id desc;\nselect * from stages where crm_configuration_id = 70 order by id desc;\nselect * from business_processes where crm_configuration_id = 70 order by id desc;\nselect * from business_process_stages where business_process_id = 34;\n\nselect * from contacts where id = 10468;\n\nselect * from crm_layouts where crm_configuration_id = 70;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 388;\nSELECT * FROM crm_fields WHERE id IN (3533,3534,3535);\n\nselect * from activities where crm_configuration_id = 70\nand (account_id IS NOT NULL or lead_id IS NOT NULL or contact_id IS NOT NULL or opportunity_id IS NOT NULL) order by id desc;\n\nSELECT * FROM activities WHERE uuid_to_bin('2e10b60f-8a61-41c5-a3d4-28835353dc65') = uuid;\nSELECT * FROM activities where crm_configuration_id = 69 ;\n\nSELECT * FROM users WHERE email LIKE '%jiminny_web_sa2@jiminny.com%';\nSELECT * FROM activities WHERE uuid_to_bin('5a150c93-40fc-42ec-b3bd-c1d328e09f6e') = uuid;\nSELECT * FROM opportunities WHERE id = 385;\n\nselect * from participants p\njoin activities a on p.activity_id = a.id\nwhere a.crm_configuration_id = 70\nand (p.lead_id IS NOT NULL or p.contact_id IS NOT NULL);\nSELECT * FROM participants WHERE id = 1013638;\n\nselect * from teams where id = 90;\nselect * from users where team_id = 90;\nselect * from social_accounts where social_accounts.sociable_id IN (1960,1760);\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 71;\nselect * from invitations where team_id = 90;\n\nselect * from crm_configurations where id = 71;\nselect * from accounts where crm_configuration_id = 71 order by id desc;\nselect * from leads where crm_configuration_id = 71 order by id desc;\nselect * from contacts where crm_configuration_id = 71 order by id desc;\nselect * from opportunities where crm_configuration_id = 71 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 71 order by id desc;\nselect * from crm_fields where crm_configuration_id = 71 order by id desc;\nselect * from crm_field_values where crm_field_id = 3341 order by id desc;\nselect * from crm_layouts where crm_configuration_id = 71 order by id desc;\nselect * from stages where crm_configuration_id = 71 order by id desc;\n\nselect * from users order by secondary_email desc;\nselect u.id, u.email, u.status, sa.id, sa.provider_user_id from social_accounts sa\n join users u on sa.sociable_id = u.id\nwhere sa.provider = 'google' and u.email LIKE 'aneliya%';\n\nselect * from failed_jobs order by id desc;\n\nselect * from users where email = 'ben.allwright@learningpeople.co.uk' or secondary_email = 'ben.allwright@learningpeople.co.uk';\n\nselect * from teams;\nSELECT * FROM crm_profiles WHERE crm_configuration_id = 39;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 39 and object_type = 'task';\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 1\nand sa.provider = 'salesforce';\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('c38b3895-fd0f-4b1f-9fb2-c170dba137c6') = uuid;\nSELECT * FROM crm_configurations WHERE id = 70;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1;\nselect * from users where team_id = 1;\n\nselect o.id, o.name,o.close_date, u.id, u.name, u.group_id, r.id, r.display_name, g.name, g.scope from opportunities o\njoin users u on o.user_id = u.id\njoin groups g on u.group_id = g.id\njoin role_user ru on u.id = ru.user_id\njoin roles r on ru.role_id = r.id\nwhere o.crm_configuration_id = 39 and close_date > '2024-01-01 00:00:00';\n\nselect * from role_user where user_id = 143;\nselect * from roles;\n\nselect * from role_user;\nselect * from groups where id = 9;\nselect * from scope_groups where group_id = 9;\n\n# ************************************************************************************\nselect * from teams where id = 36;\nselect * from crm_configurations;\nSELECT * FROM social_accounts WHERE sociable_id = 121;\n\nhttps://crmsandbox.zoho.com/crm/jiminnyw4/tab/Leads/4776201000005049105\nhttps://crmsandbox.zoho.com/crm/\n\nhttps://crm.zoho.com/crm/org3469620/tab/Leads/230045000229559080\n https://crm.zoho.com/crm/\n org3469620\n\nSELECT * FROM activities WHERE uuid_to_bin('03382d20-c8bc-48e7-a3d4-90b52fa5ceab') = uuid;\n\nselect * from users where email LIKE \"%mobile_automation_%\";\nselect * from social_accounts where sociable_id IN (2228);\nselect * from crm_profiles where user_id IN (2222,2223,2226,2227);\n\nselect * from teams order by id desc;\nSELECT * FROM users WHERE id = 2229;\nSELECT * FROM crm_profiles WHERE user_id = 2229;\nselect * from opportunities where crm_configuration_id = 88;\nselect * from crm_fields where crm_configuration_id = 88;\nselect * from crm_profiles where crm_configuration_id = 88;\n\nSELECT * FROM teams WHERE id = 1;\n\nSELECT * FROM users WHERE id = 143;\nSELECT * FROM users WHERE uuid_to_bin('fde193d3-06a2-4e1a-8895-62b94039215d') = uuid;\nSELECT * FROM teams WHERE uuid_to_bin('73385071-a756-42ae-9c73-8b53f2309467') = uuid;\n\nhttps://app.staging.jiminny.com/ondemand?\n min_duration=1\n &\n only_recorded=1\n &\n user_id%5B%5D=641f1acb-16b8-42d1-8726-df52979dad0e\n &\n sequence_number=2\n\n select * from users where team_id = 1 and email like '%stoyan%'\n\nselect * from coaching_feedbacks;\n\nselect * from teams;\nSELECT * FROM users WHERE team_id = 36;\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 19\nand sa.provider = 'pipedrive';\n\nselect * from users where id = 143;\n\nSELECT * FROM users WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\nSELECT * FROM teams WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\nSELECT * FROM activity_shares WHERE uuid_to_bin('73180eeb-33de-4065-977d-ccbe0e6c94fc') = uuid;\n\nselect * from users where team_id = 2;\nselect * from activities where crm_configuration_id = 39\nand activities.scheduled_start_time BETWEEN '2025-04-09 00:00:00' AND '2025-04-09 23:59:59'\nAND user_id = 143\norder by id desc;\n\n# ************************************************************************************\nselect * from teams where id = 142; # 2312, 126\nselect * from team_settings;\nselect * from users where team_id = 142; # 21642\nSELECT * FROM social_accounts WHERE sociable_id = 21642;\nSELECT * FROM crm_profiles cp join users u ON u.id = cp.user_id WHERE team_id = 142;\nselect * from crm_profiles where id IN (93);\nselect * from invitations;\nselect * from team_features where team_id = 1;\n\nSELECT * FROM crm_configurations WHERE id = 126;\nselect * from accounts where crm_configuration_id = 126 order by id desc;\nselect * from leads where crm_configuration_id = 126 order by id desc;\nselect * from contacts where crm_configuration_id = 126 order by id desc;\nselect * from opportunities where crm_configuration_id = 126 order by id desc;\nselect * from crm_profiles where crm_configuration_id = 126 order by id desc;\nselect * from crm_fields where crm_configuration_id = 126 # 11060\n# and type IN ('picklist', 'status')\n# and object_type = 'task'\norder by id desc;\n# 5731,5732,5733\nselect DISTINCT crm_field_id from crm_field_values where crm_field_id IN (11151,12239,12215,12185,12175,12165,12144,12137,12127,12109,12107,12105,12103,12092,12037,12005,12003,11987,11969,11958,11951,11942,11931,11924,11921,11917,11915,11901,11893,11883,11872,11870,11868,11866,11839,11833,11821,11793,11780,11777,11769,11757,11737,11735,11656,11645,11638,11629,11618,11611,11602,11591,11584,11581,11558,11544,11543,11534,11532,11529,11527,11503,11497,11493,11488,11470,11468,11457,11455,11397,11387,11372,11363,11348,11323,11318,11309,11301,11300,11292,11290,11286,11284,11256,11252,11242,11237,11233,11219,11176,11160) order by id desc;\nselect * from crm_layouts where crm_configuration_id = 126 order by id desc;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id in (300,299,298);\nselect * from stages where crm_configuration_id = 126 order by id desc;\nselect * from business_processes where crm_configuration_id = 126 order by id desc;\nselect * from business_process_stages where business_process_id IN (76,75,74,73);\nselect * from playbooks where team_id = 142;\nselect * from playbook_layouts where playbook_id IN (108);\nSELECT * FROM playbook_categories WHERE playbook_id IN (108);\n\nselect * from teams where id = 130;\nSELECT * FROM social_accounts WHERE sociable_id = 2291;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 2\nand sa.provider = 'hubspot';\n\nSELECT * FROM activities\n WHERE crm_configuration_id = 110;\n\nselect * from teams;\nselect * from crm_configurations;\n\nSELECT * FROM activities WHERE id = 628773;\nSELECT * FROM crm_profiles WHERE user_id = 1460;\nSELECT * FROM social_accounts WHERE sociable_id = 2291;\n\nselect * from teams;\nselect ru.*, pr.*, p.* from users u join role_user ru on ru.user_id = u.id\njoin permission_role pr on pr.role_id = ru.role_id\n join permissions p on p.id = pr.permission_id\nwhere team_id = 495 and p.name IN ('dial');\n\nselect * from teams where id = 145;\nselect * from crm_configurations where id = 129;\nselect * from social_accounts where sociable_id = 2317;\nSELECT * FROM activities WHERE uuid_to_bin('8dbab184-a333-4268-ad57-fb41f8d53a9a') = uuid;\n\nselect * from teams where id = 1;\nSELECT * FROM crm_layouts WHERE crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 280;\nSELECT * FROM crm_layout_entities WHERE id = 5507;\nSELECT * FROM crm_fields WHERE crm_configuration_id = 39 and object_type IN ('event');\n\nselect * from teams;\nselect * from activities where crm_configuration_id = 14;\n\nSELECT * FROM social_accounts where provider = 'copper';\n\nselect * from activities where id = 628467;\nselect * from participants where activity_id = 628467;\n\nSELECT * FROM contacts WHERE id = 3969;\nSELECT * FROM accounts WHERE id = 177;\n\nSELECT * FROM activities WHERE uuid_to_bin('4eb54c77-cfa3-2bd4-84a7-9ed46a21c988') = uuid;\n\n# ********************* BH\nselect * from teams where id = 36;\nSELECT * FROM crm_configurations WHERE id = 21;\nselect * from activities where crm_configuration_id = 21 and id = 607901;\nselect * from activities where crm_configuration_id = 21;\n\nselect * roles;\nselect * from permissions;\nselect * from permission_role where permission_id = 226;\n\nselect * from migrations order by id desc;\n\n# mercury\n# neptune\n# earth\n\nselect * from teams;\nselect * from teams where id = 19;\nselect * from teams where id = 27;\nselect * from users where team_id = 27;\nSELECT * FROM crm_configurations WHERE id = 42;\n\nselect * from social_accounts sa\njoin users u on sa.sociable_id = u.id\nwhere u.team_id = 19\nand sa.provider = 'pipedrive';\n\nselect * from activities where id = 631461;\nSELECT * FROM crm_field_values WHERE crm_field_id = 180;\n\nselect * from teams where id = 2;\nSELECT * FROM social_accounts WHERE sociable_id = 89;\n\nSELECT * FROM activities WHERE uuid_to_bin('ba0c029a-bc14-4e17-8603-64174acebcbb') = uuid; # 634273\nselect * from activity_summary_logs where activity_id = 634273;\n\nselect * from sidekick_settings where team_id = 2;\n\nselect * from teams; # 2, 2\nSELECT * FROM crm_configurations WHERE team_id = 2; # 2\nselect * from team_features where team_id = 2;\nselect * from features;\nSELECT * FROM opportunities WHERE crm_configuration_id = 2 and crm_provider_id = '51317301383';\nSELECT * FROM opportunities WHERE crm_configuration_id = 2 order by id desc;\n\nselect * from automated_reports order by id desc;\nselect * from automated_report_results order by id desc;\nselect * from users where team_id = 1 and id IN (7160, 3248);\nselect * from migrations order by id desc;\n\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1052 and sa.provider = 'hubspot';\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 565;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 175;\nselect * from playbook_categories where playbook_id = 175;\nselect * from users where team_id = 1052;\nselect * from users where id = 7160;\nselect * from crm_profiles where user_id = 7160;\nselect * from features;\nselect\n *\n# id, uuid, type, provider, playbook_category_id, user_id, lead_id, contact_id, account_id, opportunity_id, stage_id,\n# crm_configuration_id, crm_provider_id, transcription_id, status\nfrom activities where crm_configuration_id = 1 and type = 'conference'\n# and crm_provider_id IS NOT NULL\nand provider != 'uploader' and actual_start_time IS NOT NULL\nORDER by id desc;\nselect * from activities where id = 54747783; # 00UO400000pCzojMAC\n\nselect p.id, p.activity_type, pc.id, pc.name\nFROM playbooks p\njoin playbook_categories pc on p.id = pc.playbook_id\nwhere p.team_id = 1 and p.activity_type = 'event';\n\nSELECT * FROM crm_fields WHERE crm_configuration_id = 1 and object_type = 'event';\nSELECT * FROM crm_field_values WHERE crm_field_id = 4;\n\nselect * from crm_layouts cl join playbook_layouts pl on cl.id = pl.layout_id\nwhere crm_configuration_id = 1 and pl.playbook_id = 175;\n\nselect * from teams;\nSELECT r.* FROM automated_reports r\njoin teams t on r.team_id = t.id\nWHERE r.frequency = 'daily'\n and r.status = 1\nAND t.status = 'active'\nAND (r.expires_at >= now() OR r.expires_at IS NULL);\n\nselect * from automated_report_results where report_id IN (18, 33);\n\nselect * from activity_searches where id = 10932;\nselect * from activity_search_filters where activity_search_id = 10932;\nselect * from automated_reports order by id desc;\nselect * from automated_report_results order by id desc;\nselect * from automated_reports where id IN (55);\nselect * from automated_report_results where id IN (81);\nselect * from users where id IN (10633, 13987, 11985);\nselect * from users where group_id IN (3710);\n\nSELECT * FROM automated_reports WHERE uuid_to_bin('18a06a75-afd2-476f-aadc-14d4057bdda2') = uuid;\nSELECT * FROM automated_report_results WHERE uuid_to_bin('582d4b50-8cd3-42a9-9819-d676ff8f3b43') = uuid;\n\n\nselect * from automated_report_results where media_type = 'pdf' and status = 2;\nSELECT * FROM automated_report_results WHERE uuid_to_bin('82e74956-6144-4cd1-a3d3-af985c3070a4') = uuid;\n\nselect * from teams where id = 1029;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 1029 and sa.provider = 'pipedrive';\n\n[\n {\n \"user_id\": \"23460 (owner)\",\n \"email\": \"integration-account@pipedrive.jiminny.com\",\n \"id\": 69,\n \"sociable_id\": 23460,\n \"provider_user_id\": \"19555731\",\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,\n \"refresh_token_expires\": null,\n \"provider\": \"pipedrive\",\n \"state\": \"connected\",\n \"auth_scope\": \"base,deals:full,activities:full,contacts:full,search:read\",\n \"retry_after\": null,\n \"created_at\": \"2025-04-16 08:23:28\",\n \"updated_at\": \"2026-05-18 07:13:18\",\n \"provider_user_token_encrypted\": \"eyJpdiI6Ik9oYzBwcTVteWN4ajBRaDdMb0FjWGc9PSIsInZhbHVlIjoiQUNMbjU5UHR2Q1RnbWRXMEU1TUx6UVpRU3gzdVc5WktmTE4rVlhXa3lRaGhyUUlZMVZRWEJuR0JaWWhZZXNPRlBuanhuYU5MVHZ5TG9NTVVjNjJSUUpZZ2VhbGYxbHg0UzJEdTVmQjNFZnJRZkMwYjd0N2RMZ05GRS9IR3c2K0NoVjBjYTA5UG12SkxHeDlDMGVNN3ptUWUzblFiTngyYzR1eUpHSEYrdEwvZm0yZklGYjBSNEtTR2ZGazhLM1hqT3lVbjFobDNPZ0d3anFlcjhKcXpERlZGOVN1YmFyNDIvM1BFRDFMYnp4WEI4TGVLM2xYcy9CL0RDOWlQNHI3N0NwWnJPMWRtZllmM2ZKeE9TV2NBeDZxL2M1YnlSVzd3ZW96T3F1QmtBYXBHYkUraGcvdCtRajlYZXBjVVBSdFlMUjVPVDVJbDdyenVoWjMrbVJvU3ZZR1dQZ3pqQ3F3aDF2U2xPZWZIN3BCWVFLNXpxQUtDb2pIK0xHc1E3SklSM3Q0VkNSbm9oK2pFK3hLaW54T1dWbEVneUp0RGhhdVBuOFI4MXROc3dZWnFnTUpiaDVMMnZ4QmlRM3k4QWFlMVFWUFYvdGhJQzZBYnhBQmhWa2ZKN1ZhSnhpaExxbmlTemgzUWw3aXJtWjlSMlhmd0lWMDNDN1N3My9Ua0hCL2xqY3RkVFhMSjFJMDRjOE5DWlgrZ3FMVXN6RWlwUE5GWERZdG1xVjVxOFlLRGs2VVJKS3FLeWRxQjYxdDh4Z2JJNXhlWEZ3dkQ4SGtybDNUcndzblFHeVJNRkYraFh2UDFIUTdMQ1BZa3dEU1dBbzk5K0dyT2RNVFBZZUJpRytSck5pYlI1YUZyMmhUNEZCdWxHYmJLREtzbUpjVkhvV0RoejJpbm1SWHlNaXE5M0RhcS94UW9EdFoweWF3bVFVY0dTZWFPSXBmOCtDYndia215cmtyZU1oT0Exam1CV2tPblNhYjY4clVEeUs3anVHUmNHeS9YLzRha1VhbGl3N3lwaDlzZnRhQUZta2s4eFllNHgzRklSRmNyazJ4dlBDMnByNCtBRjNaVjJCTT0iLCJtYWMiOiJkYTQxZDY1OTY2ZTljMTgyZWRhNGEzMGZjZDc2MjBjN2NlNzU2YTViNGQxNWE1NTI2ZmI1MWQyYjQ2ODYxZmEwIiwidGFnIjoiIn0=\",\n \"provider_refresh_token_encrypted\": \"eyJpdiI6Imt2bGxlSmxUK05GMjF0dEtPaTMrUlE9PSIsInZhbHVlIjoiUXZHTElZRXkreHFxUU02SnZ4eVBacG9WWTRlVkd0USszV3JyVFlpU2ZaY25GSWo2WFcrRzNlbFRlUXRQczNwSXRCcEdvZEpveG9jMzBDSTgwdnZLQnc9PSIsIm1hYyI6ImQxYWI0NzU5Nzg5MDI4YWVhZmQ4Mjg1YzhkZDQzMjRkYWYwYTdhZTY5MDMxMjc0OWNiYjY0Nzc3NDQ0MTEyY2EiLCJ0YWciOiIifQ==\",\n \"encryption_key\": \"0x01020300786192D9D96DD60D3D1EBC9DFAEE5F0C45EE80165CF3F3D2B3B627026AA7CFC7CA0128DD463535D32EE491ADBADF8B07596B0000006E306C06092A864886F70D010706A05F305D020100305806092A864886F70D010701301E060960864801650304012E3011040C7FB1319048ECB2EA3F23B995020110802B52D22F5EAD341AB238FBBCB6093156E443876A664BA5555D722565C2B2D04422C868CD7350555E3CC74221\",\n \"sociable_type\": \"user\",\n \"owner_id\": 23460\n },\n {\n \"user_id\": \"23463\",\n \"email\": \"jiminny_web_sa@pipedrive.jiminny.com\",\n \"id\": 72,\n \"sociable_id\": 23463,\n \"provider_user_id\": \"23270841\",\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:txqCuWLeVhgwiaFqXIvQWWrtrnFIy_4lT3VCr-sRB4g6_2lK8KcQ_6ka_qFmZhr-IeIAKmAImx6H1iIKx4Ab7XZ5MnKIh03GKbHjI0n0rGT9UYkeH21jKOxJvKaSX_TyLbxFPR6irPQyvqcpBClXI52gVJH01KzZy_dMTHFXhhDLOIhEpSrQXHG7Qo8q7OuBeSPZrU1ALi9kmAm4GTpzGTbzfl-hUt9IAfPunJOCyv3mf2Tl-MT8EyQgOFPrsP3yz9UlSyVhb40zO_bCnUrqNxjwgm_E6vgpVrwULTQbHe-43Dq-TRetjceUzT88GBgVJ0UdxXP5BRBVXcL5ir8-9ZTMaNU\",\n \"provider_refresh_token\": \"5034113:23270841:34790b44838f5fd422c2d2c82e00f1ecf2178ad1\",\n \"expires\": 1753837219,\n \"refresh_token_expires\": null,\n \"provider\": \"pipedrive\",\n \"state\": \"full-refresh\",\n \"auth_scope\": \"base,deals:full,activities:full,contacts:full,search:read\",\n \"retry_after\": null,\n \"created_at\": \"2025-04-16 10:41:12\",\n \"updated_at\": \"2025-07-30 01:00:17\",\n \"provider_user_token_encrypted\": \"eyJpdiI6InVEVEl2SzIxMjd1bkNDWG9lY3YvQ0E9PSIsInZhbHVlIjoiRlJLbDZ3ZHo2dHMxUWQwdGU2YUZjV3lPWHlxQTJ0eWh4S0RTMjlSaThVcktoaWhXcTd2UXl4Mjg4bW5UUnZCZEQ5NXpuQTVKOURiMDNIa3l3K0lSWCt5azRBOEdHbitWQXhxeEpMVUZ1dnF2NVl1TTZLelZOaGNvRlBLeGpIWlpoRGloUEprd2xoNUFPcTlLcUd3WVlUU2svR1NOeXBYQ2NnMWhnK1V2aytOeVVMNzJGdVZXMU1JS3BSaGNCcmxkVjEwQ01mQXNBdWNhS1lMZWZobnZwcHBkN1R4bUVDRUNYdnNtSVJkdG5MdkN3djJBT0hMRDl1MHFGbnl4WU13ejBkUWsrdUljWkZhcTJlN0JDSGdTVzlPY0FGMUJlZi9WRGpkMUk5R20wblYwSk9VR2FuaHpLTzJNeitMbnF1V1NEMUUxRmYzaDRGZDMyaXd3Z0FjQno4SzVoYjUyTmV3UXNpRlF4TGZKNVl3dUFqdGhKVWJjRVlUUXRGalBpaXJvSGJmbS8rd25aQ2Zvc05saHRDRjlHV1VEUFFiRU5xbWRVNkxFSXV0RUZyaUlYNWMwMmhnZ0Y1VUQ4eEFkY2QyWXpnR0NidkVJSWdjVGljUjA3NDdpZW9WUHhtSlpGSGdNU2hRUTA5ZW03RGpiRFdrdytkOHJXSUxlazZNaG9iaUg2NFZYdEc3YklMeFZvblBzWmVRSDcvN2M4WUNtL3h4S2IrUW00cXhialBia3BJcW5XallBNlV5WWdhcE1ZVFBBM3RSSUVBamYvOGZEQWM5a2FJMGwyWkRSU3dlTEtPemZlQ3RXRGNDcEdYRHdMNTlTQVg2SUdUN0hVaXdZT1dUOUlrVzkrZHFBemhwWXg1cm4rSy9UOHUzcnNSM2dISlhBRTEyVUNyTkZYaFJYUlN1a2RKVHhhM2dHckR3a1JGaVZ2Wk9BVnhTclVpSEhwWTVpQTlJbXVkOUxSTGpRbDk0a1VtbE9QMVAvN3VlVEhJUHd2elowd0laNVIzZ3M3N0ZOK0NDakIwQ2FicGxoMDBhTXI0VUppUmFOZHdlWUdGV21NNFQ4RU1nY0dnWT0iLCJtYWMiOiI0ZTU4ZmJkNTdkYmY0NGE4NTJjZjlhNDExNzE2YjhlOWM2NTA5OGY2MDA4OTcyZDVlOTljY2JjZDhmMjBhMDUyIiwidGFnIjoiIn0=\",\n \"provider_refresh_token_encrypted\": \"eyJpdiI6IkJGMkdRVHRKM2VTcitKNGcvQWJtUGc9PSIsInZhbHVlIjoicmFyRkxPZ1Rybm1ORXlEVjJ2TXFGTzJtM3hWaFhnUVVHN2ZlR1lRM0I5d3ozbnZTcU5EdzJqRkI2elhyNWhlenRTUXV3bjk0N1JXeklDMVAyUzBKcHc9PSIsIm1hYyI6ImJhODVjMGQyZDE3Y2ExNjc2OWVjYWJiNmFjYWVkODIyMTMyNWVhYTExMTgwYTEyMTU0MzUzZGE1YjQ5YzQ5ZjEiLCJ0YWciOiIifQ==\",\n \"encryption_key\": \"0x01020300788C37CDF66ABE9301A68D5D4866AC0C197E04EEE4D904F20A59991322EBAE252301BEF4B24FF01359E934E5654617E4EEAC0000006E306C06092A864886F70D010706A05F305D020100305806092A864886F70D010701301E060960864801650304012E3011040CEB00EF45BDEA999A5558889E020110802B925F372F7BEFAF0B45E48686113D1DA430ECFCC07B1F61BA6828CC44235278EDB05C486E8068D0BE737D91\",\n \"sociable_type\": \"user\",\n \"owner_id\": 23460\n }\n]","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50182
|
1779
|
6
|
2026-05-18T07:22:07.251242+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088927251_m1.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShelllEditViewSessionScriptsProfilesWindowHe iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp• Preparation for Refi... in 4h 38 m100% <78• Mon 18 May 10:22:06DOCKER (docker-compose)T81DOCKER81DEV (-zsh)О ₴2DOCKER (docker-compose)docker_lamp_1[HubSpot] Syncing objects for JustCall (c6b9d6b0-b48d-4832-a68c-a57d60651888)since 2026-02-1715:07:41 (delay: 1s)docker_lamp_1I Team Twilio Video (c334ca55-b230-411c-b10e-31c8204bd07b) is not yet assignedskipping...docker_lamp_1Test Account 3000 (dbc9990d-b35f-4e38-9550-22cdd6059514) is notyet assigneddocker_1amp_1I Team test (7997eb70-8aa4-491a-870d-311977568df4) is not yet assigned anowner.skipping...docker_lamp_1I Team Test (5e06dcee-0613-470e-9a77-2c283198f3bf) is not yet assignedanowner.skipping...docker_lamp_1I Team test oggautosync (da44776e-306f-427a-83d8-a1b4baa5537e) is not yetassignedanowner. skipping...docker_lamp_1I Team Tourlaner (d9b71080-388b-4cf5-8175-aa0f29bee635) is not yet assignedanowner. skipping...docker_lamp_1I Dispatched4 HubSpot sync jobsdocker_lamp_1...1s DONEdocker_lamp_1, '/usr/local/bin/php' 'artisan' crm:sync-hubspot-objects › */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:run2026-05-18 07:21:27 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects1s DONEdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects45.31msDONEdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsmsDONE22.79docker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects20.63msDONEdocker_1amp_1docker_lamp_12026-05-18 07:22:03 Running ['artisan' meeting-bot:schedule-bot]...2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' meeting-bot:schedule-bot › */proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchAPP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|...
|
NULL
|
-1294856785926540556
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShelllEditViewSessionScriptsProfilesWindowHe iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp• Preparation for Refi... in 4h 38 m100% <78• Mon 18 May 10:22:06DOCKER (docker-compose)T81DOCKER81DEV (-zsh)О ₴2DOCKER (docker-compose)docker_lamp_1[HubSpot] Syncing objects for JustCall (c6b9d6b0-b48d-4832-a68c-a57d60651888)since 2026-02-1715:07:41 (delay: 1s)docker_lamp_1I Team Twilio Video (c334ca55-b230-411c-b10e-31c8204bd07b) is not yet assignedskipping...docker_lamp_1Test Account 3000 (dbc9990d-b35f-4e38-9550-22cdd6059514) is notyet assigneddocker_1amp_1I Team test (7997eb70-8aa4-491a-870d-311977568df4) is not yet assigned anowner.skipping...docker_lamp_1I Team Test (5e06dcee-0613-470e-9a77-2c283198f3bf) is not yet assignedanowner.skipping...docker_lamp_1I Team test oggautosync (da44776e-306f-427a-83d8-a1b4baa5537e) is not yetassignedanowner. skipping...docker_lamp_1I Team Tourlaner (d9b71080-388b-4cf5-8175-aa0f29bee635) is not yet assignedanowner. skipping...docker_lamp_1I Dispatched4 HubSpot sync jobsdocker_lamp_1...1s DONEdocker_lamp_1, '/usr/local/bin/php' 'artisan' crm:sync-hubspot-objects › */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:run2026-05-18 07:21:27 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects1s DONEdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects45.31msDONEdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsmsDONE22.79docker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjectsRUNNINGdocker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects20.63msDONEdocker_1amp_1docker_lamp_12026-05-18 07:22:03 Running ['artisan' meeting-bot:schedule-bot]...2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' meeting-bot:schedule-bot › */proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchAPP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|...
|
50180
|
NULL
|
NULL
|
NULL
|
|
50183
|
1780
|
4
|
2026-05-18T07:22:07.265216+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088927265_m2.jpg...
|
PhpStorm
|
faVsco.js – console [STAGING]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
PhostormFV faVsco.js~ProjectVIewINavicare%9 pipedr PhostormFV faVsco.js~ProjectVIewINavicare%9 pipedrive-sdk-pocvCodeLaravel0 composer.json0 composer.lock0 dependency-checker.json0 dev.json=ids.txtE infection.json.distM+ INSTALL.mdM+ INTERNAL_WEBHOOK_SETUP.mdEjiminny_storageM+licenses.mdM Makefilepackage-lock. son=phostan.neon.distE phpstan-baseline.neon< phounit.xmlM+ PIPEDRIVE V2 MIGRATION_ PLAN.moTe raw sal querv.saML README.mdso sonar-oroiect.oropertiesE test.py<> Untited Diadram.xmlI vetur.config.jsMJ WEBHOOK FILTERING IMPLEMENTATION.mo› ib External Librariesv = Scratches and Consoles~ D Database ConsolesVASUA console (EU]A DEAL RISKS [EU]A DI [EU]A EU (EUJv A jiminny@localhostA console ljiminny@localhost]A DI [jiminny@localhost]A HS_local [jiminny@localhost]A SF [iiminny@localhostlA zoho_dev jiminny@localhost]V A PROD& console PRODII& console 1 PRODIL DI PRODIIAQAI> A QAI PRODSTAGINGA console [STAGiNGIA console 1 STAGiNG)#uranus STAGINGI> D Extensions) M ScratchesKeractor® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpcreatePlaybookcreatedevent.ongpnp api.ohoxTeamController.phpc) IntearationApp/Service.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.phoC) PlanhatactivityListener.php(C)AskAnythinaPromptService.php© AutomatedReportsRepository.phpC) RequestGenerateReport.Job.ohvC) AutomatedReportResult.oho(C) AutomatedRenort.oho® CreateTeamRequest.php© UserInvitationDTO.phporganizaSrouter->aroundf'middleware'= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix''/settings'], static function (Router Srouter): V601Srouter->aroundf'orefix'ations'], static function (Router $r60.->post(uri: '/'. [OrganizationController: :class,"store"Dzations.store');$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']],H):// IntegrationsSrouter->group(['middleware' => 'permission:' . PermissionEnum: :MANAGE_INTEGR 611Srouter->get(uri: '/integrations', [IntegrationController::class, 'all']) /api/ 13->m1ddLeware middleware:'permission:. PermissionEnum: :READ_INTEGRATIONS'ap1.1nteqrations.1ndex'// Slack API for getting slack channels listsrouter->qete ur'(notificationProvider}/channels', [Controllers\Notification// Team actions. XXX: These all need moving out to their own controllers.Srouter->arouodorefix'zations'l, static function Router SroutenInternal Kiosk, This whole section will be moved out to a separate file->prefix( uri: 'kiosk')'can:kiosk,' . User: :class)->group(static function (Router Srouter): void {...*):Srouter->group(['middleware' => ['auth:api']], static function (Router $router):Srouter->group(['middleware' => ['api']], static function (Router $router): void› Srouter->group(l'prefix' => 'user'), static function (Router Srouter): void 1...$ 635and should be installed. (22 minutes ago)• Preparation tor Kell... In 4h 30m100% 5&• Mon 18 May 10:22:06+0 ..E custom.logE laravel.logA HS_local (jiminny@localhost]© Kernel.phpA SF [jiminny@localhost]A console (PROD]4 console [STAGING) Xf users [PROD]© TestPipedriveOfficialSdkCommand.phpconsole lEUD60.Tx: Auto vPlaygroundJuin ceals t nsron c.10 = U.ceall loWHEkE U.ceam10 = 102y and Sa.provider = 'prpearivend8jiminny023 A22 V17 ^ V"user_id": "23460 (owner)","emall". "Incecracion-accouncop1pedrive.aminny.com"soclable_1d": 23468"provider_user_id": "19555731","provider user token": "VIU:A0TBAHn-LZTNK2vuuvaLq1fzhwb9crUnktpk4FL09r1nxap_6AE0hDhD0"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]b2bfc'"refresh_token_expires": null,"pipedrive","state": "connected","auth scone": "base.deals:full.activities:full.contacts:full search:read""retry_after":"created_at":12025-04-16 08-27-2811"updated_at": "2026-05-18 07:13:18","provider_user_token_encrypted": "eyJpdiI6Ik9oYzBwcTVteWN4ajBRaDdMb0FjWGc9PSIsInZhbH\"provider_refresh_token_encrypted": "eyJpdiI6Imt2bGxLSmxUK®5GMjFOdEtPaTMrULE9PSIsInZ!"encryption_key": "0x01020300786192D9D96DD60D3D1EBC9DFAEE5F0C45EE80165CF3F3D2B3B6270:"sociable_type": "user","ownen id". 23660"user_id": "23463","email": "[EMAIL]","id": 72,"sociable_id": 23463,"provider_user_id": "23270841","provider_user_token": "v1u:AQIBAHj-LZTNK2yuuuaLqifzhWb9crUNKTpk4FLQ9rjnXqp_6AEQhDhDC"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]78ad1'"refresh token expires". nulll"state": "ful-refresh""auth_scope": "base,deals:full,activities:full,contacts:full,search:read""2025-04-16 10:41:12","undated atu: 2025-07-30 01-00-171"provider user token, encrypted": "eyJpd176TnVEVEL2521xMjd1bKNDWG91Y3Yv00E9sTsTn2h-:*inroviden nofroch token encnvnted". "ev.indiT6tk.IGMkdPVHPKM2VTci+KNGcv0WI+lGcQPSTsTnva"sociahle tvne". "usen""owner_id": 23460CascadeMigrating to PipedriveRead api.php #L325-334D apl.phpThoughtsRead api.php #L725-734ThouahtsD api.phpThoughts >Command dockerl• docker exec docker lamp 1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test 1: OAuth InitializationPASS -Initialization: Client initialized successfully in 219.21msTe token tiengeRi opeToken is expired: YESTest zat GewDen DB token -ErronCall to undefined method Pinedrivelversions|v2\AnilDealsAni:.getA11Dealsow+1 -11+1-1leals using getAllDeals() in (selapsed)ms", selapsed) ;) catch (=xceptron se2) 1selapsed = round((microtime(true) - $startTime) * 1000, 2);pa/coycoescelcodommandi: ites tGetDea ls (Object (Pipedrivelversionslv2/ Configuration))onn/Concnla/Commande/Crm/Toctpinodriuon4f?rio1C/kChmmand..nhn.0hThouchtsThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so | can continue testing the v2 SDK method mappings.Tenl aee2 4iles 1911-28>Accent allAsk anvthina (*4L)SWE-1.6WN Windeurf Toame 627.9UTE.9...
|
NULL
|
-189492071520834175
|
NULL
|
click
|
ocr
|
NULL
|
PhostormFV faVsco.js~ProjectVIewINavicare%9 pipedr PhostormFV faVsco.js~ProjectVIewINavicare%9 pipedrive-sdk-pocvCodeLaravel0 composer.json0 composer.lock0 dependency-checker.json0 dev.json=ids.txtE infection.json.distM+ INSTALL.mdM+ INTERNAL_WEBHOOK_SETUP.mdEjiminny_storageM+licenses.mdM Makefilepackage-lock. son=phostan.neon.distE phpstan-baseline.neon< phounit.xmlM+ PIPEDRIVE V2 MIGRATION_ PLAN.moTe raw sal querv.saML README.mdso sonar-oroiect.oropertiesE test.py<> Untited Diadram.xmlI vetur.config.jsMJ WEBHOOK FILTERING IMPLEMENTATION.mo› ib External Librariesv = Scratches and Consoles~ D Database ConsolesVASUA console (EU]A DEAL RISKS [EU]A DI [EU]A EU (EUJv A jiminny@localhostA console ljiminny@localhost]A DI [jiminny@localhost]A HS_local [jiminny@localhost]A SF [iiminny@localhostlA zoho_dev jiminny@localhost]V A PROD& console PRODII& console 1 PRODIL DI PRODIIAQAI> A QAI PRODSTAGINGA console [STAGiNGIA console 1 STAGiNG)#uranus STAGINGI> D Extensions) M ScratchesKeractor® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpcreatePlaybookcreatedevent.ongpnp api.ohoxTeamController.phpc) IntearationApp/Service.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.phoC) PlanhatactivityListener.php(C)AskAnythinaPromptService.php© AutomatedReportsRepository.phpC) RequestGenerateReport.Job.ohvC) AutomatedReportResult.oho(C) AutomatedRenort.oho® CreateTeamRequest.php© UserInvitationDTO.phporganizaSrouter->aroundf'middleware'= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix''/settings'], static function (Router Srouter): V601Srouter->aroundf'orefix'ations'], static function (Router $r60.->post(uri: '/'. [OrganizationController: :class,"store"Dzations.store');$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']],H):// IntegrationsSrouter->group(['middleware' => 'permission:' . PermissionEnum: :MANAGE_INTEGR 611Srouter->get(uri: '/integrations', [IntegrationController::class, 'all']) /api/ 13->m1ddLeware middleware:'permission:. PermissionEnum: :READ_INTEGRATIONS'ap1.1nteqrations.1ndex'// Slack API for getting slack channels listsrouter->qete ur'(notificationProvider}/channels', [Controllers\Notification// Team actions. XXX: These all need moving out to their own controllers.Srouter->arouodorefix'zations'l, static function Router SroutenInternal Kiosk, This whole section will be moved out to a separate file->prefix( uri: 'kiosk')'can:kiosk,' . User: :class)->group(static function (Router Srouter): void {...*):Srouter->group(['middleware' => ['auth:api']], static function (Router $router):Srouter->group(['middleware' => ['api']], static function (Router $router): void› Srouter->group(l'prefix' => 'user'), static function (Router Srouter): void 1...$ 635and should be installed. (22 minutes ago)• Preparation tor Kell... In 4h 30m100% 5&• Mon 18 May 10:22:06+0 ..E custom.logE laravel.logA HS_local (jiminny@localhost]© Kernel.phpA SF [jiminny@localhost]A console (PROD]4 console [STAGING) Xf users [PROD]© TestPipedriveOfficialSdkCommand.phpconsole lEUD60.Tx: Auto vPlaygroundJuin ceals t nsron c.10 = U.ceall loWHEkE U.ceam10 = 102y and Sa.provider = 'prpearivend8jiminny023 A22 V17 ^ V"user_id": "23460 (owner)","emall". "Incecracion-accouncop1pedrive.aminny.com"soclable_1d": 23468"provider_user_id": "19555731","provider user token": "VIU:A0TBAHn-LZTNK2vuuvaLq1fzhwb9crUnktpk4FL09r1nxap_6AE0hDhD0"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]b2bfc'"refresh_token_expires": null,"pipedrive","state": "connected","auth scone": "base.deals:full.activities:full.contacts:full search:read""retry_after":"created_at":12025-04-16 08-27-2811"updated_at": "2026-05-18 07:13:18","provider_user_token_encrypted": "eyJpdiI6Ik9oYzBwcTVteWN4ajBRaDdMb0FjWGc9PSIsInZhbH\"provider_refresh_token_encrypted": "eyJpdiI6Imt2bGxLSmxUK®5GMjFOdEtPaTMrULE9PSIsInZ!"encryption_key": "0x01020300786192D9D96DD60D3D1EBC9DFAEE5F0C45EE80165CF3F3D2B3B6270:"sociable_type": "user","ownen id". 23660"user_id": "23463","email": "[EMAIL]","id": 72,"sociable_id": 23463,"provider_user_id": "23270841","provider_user_token": "v1u:AQIBAHj-LZTNK2yuuuaLqifzhWb9crUNKTpk4FLQ9rjnXqp_6AEQhDhDC"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]78ad1'"refresh token expires". nulll"state": "ful-refresh""auth_scope": "base,deals:full,activities:full,contacts:full,search:read""2025-04-16 10:41:12","undated atu: 2025-07-30 01-00-171"provider user token, encrypted": "eyJpd176TnVEVEL2521xMjd1bKNDWG91Y3Yv00E9sTsTn2h-:*inroviden nofroch token encnvnted". "ev.indiT6tk.IGMkdPVHPKM2VTci+KNGcv0WI+lGcQPSTsTnva"sociahle tvne". "usen""owner_id": 23460CascadeMigrating to PipedriveRead api.php #L325-334D apl.phpThoughtsRead api.php #L725-734ThouahtsD api.phpThoughts >Command dockerl• docker exec docker lamp 1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test 1: OAuth InitializationPASS -Initialization: Client initialized successfully in 219.21msTe token tiengeRi opeToken is expired: YESTest zat GewDen DB token -ErronCall to undefined method Pinedrivelversions|v2\AnilDealsAni:.getA11Dealsow+1 -11+1-1leals using getAllDeals() in (selapsed)ms", selapsed) ;) catch (=xceptron se2) 1selapsed = round((microtime(true) - $startTime) * 1000, 2);pa/coycoescelcodommandi: ites tGetDea ls (Object (Pipedrivelversionslv2/ Configuration))onn/Concnla/Commande/Crm/Toctpinodriuon4f?rio1C/kChmmand..nhn.0hThouchtsThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so | can continue testing the v2 SDK method mappings.Tenl aee2 4iles 1911-28>Accent allAsk anvthina (*4L)SWE-1.6WN Windeurf Toame 627.9UTE.9...
|
50181
|
NULL
|
NULL
|
NULL
|
|
50186
|
1780
|
5
|
2026-05-18T07:22:10.488748+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088930488_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
7266624862028544203
|
577591577001045378
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
PhostormVIewINavicareFV faVsco.js~%9 pipedrive-sdk-pocvProject0 composer.json0 composer.lock0 dependency-checker.json0 dev.json=ids.txtE infection.json.distM+ INSTALL.mdM+ INTERNAL_WEBHOOK_SETUP.mdEjiminny_storageM+licenses.mdM Makefileраскаqе-lock. son=phostan.neon.distE phpstan-baseline.neon< phounit.xmlM+ PIPEDRIVE V2 MIGRATION_ PLAN.moTe raw sal querv.saML README.mdso sonar-oroiect.oropertiesE test.py<> Untited Diadram.xmlI vetur.config.jsMJ WEBHOOK FILTERING IMPLEMENTATION.mo› ib External Librariesv = Scratches and Consoles~ D Database ConsolesVASUA console (EU]A DEAL RISKS [EU]A DI [EU]A EU (EUJv A jiminny@localhostA console ljiminny@localhost]A DI [jiminny@localhost]A HS_local [jiminny@localhost]A SF [iiminny@localhost]A zoho_dev jiminny@localhost]V A PROD& console PRODII& console 1 PRODIL DI PRODIICodeLaravelKeractorAQAI> A QAI PRODSTAGINGA console [STAGiNGIA console 1 STAGiNG)#uranus STAGINGI> D Extensions) M Scratches® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpE custom.logA HS_local (jiminny@localhost]© Kernel.php4 SF [jiminny@localhost] xA console [STAGING) XA console (PROD]f users [PROD]© TestPipedriveOfficialSdkCommand.phpcreatePlaybookcreatedevent.ongD60.pnp api.ono xTeamController.phpd8jiminny023 A22 V17 ^ Vc) IntearationApp/Service.php(C) CreateCommentedEvent.phpC) CreateSmsSentEvent.phoC) PlanhatactivityListener.php(C)AskAnythinaPromptService.php© AutomatedReportsRepository.phpC) RequestGenerateReport.Job.ohv591592594Tx: Auto vPlaygroundJun ceals t nsron c.10 = U.ceall.laWHERE u.team_id = 1029 and sa.provider = 'pipedrive';C) AutomatedReportResult.oho(C) AutomatedRenort.oho® CreateTeamRequest.php© UserInvitationDTO.phporganizaSrouter->aroundf'middleware= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix''/settings'], static function (Router Srouter): V601Srouter->aroundf'orefix'ations'], static function (Router $r60.->post(uri: '/'. [OrganizationController: :class,"store"Dzations.store');$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']] .H):// IntegrationsSrouter->group(['middleware' => 'permission:' . PermissionEnum: :MANAGE_INTEGR 611Srouter->get(uri: '/integrations', [IntegrationController::class, 'all']) /api/ 13->m1ddLeware middleware:'permission:. PermissionEnum: :READ_INTEGRATIONS'ap1.1nteqrations.1ndex'// Slack API for getting slack channels listsrouter->qete ur'(notificationProvider}/channels', [Controllers\Notification// Team actions. XXX: These all need moving out to their own controllers.Srouter->arouodorefix'zations'), static function (Router Srouter 62%Internal Kiosk, This whole section will be moved out to a separate file->prefix( uri: 'kiosk')'can:kiosk,' . User: :class)->group(static function (Router Srouter): void {...*):Srouten -sgroupC('inidt emane' > ['authi:apil 11, static function (Router Srouter)!Srouter->group(['middleware' => ['api']], static function (Router $router): void› Srouter->group(l'prefix' => 'user'], static function (Router Srouter): void (..* 635and should be installed. (22 minutes ago)"user_id": "23460 (owner)","email": "[EMAIL]","soclable_1d": 23468"provider_user_id": "19555731","provider_user_token": "vIU:A0IBAHn-L2TNK2yuuuaLq1fzhwb9crUnkTpk4FL09r1nxap_6AE0hDhD0"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]b2bfc'"exoires": 1779091997•/EDe.:S": null,"papearive","state": "connected","auth scone": "base.deals:full.activities:full.contacts:full search:read""retry_after":null,"created_at":12025-04-16 08-27-2811"updated_at": "2026-05-18 07:13:18","nnoviden usen token encnvnted"l. "ev.indiT6TkQoV-RwcTV+eWN4aiRPandMhAC-WGcQPST<Tn7hhH\"provider_refresh_token_encrypted": "eyJpdiI6Imt2bGxZSmxUK05GMjF0dEtPaTMrULE9PSIsInZt"encryption_key": "0x01020300786192D9D96DD60D3D1EBC9DFAEE5F0C45EE80165CF3F3D2B3B6270:"sociable_type": "user","ownen id". 23660"user_id": "23463","email": "[EMAIL]","id": 72,"sociable_id": 23463,"provider_user_id": "23270841","provider_user_token": "v1u:AQIBAHj-LZTNK2yuuuaLqifzhWb9crUNKTpk4FLQ9rjnXqp_6AEQhDhDC"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]78ad1'"refresh token expires". nulll"state": "ful-refresh""auth_scope": "base,deals:full,activities:full,contacts:full,search:read""2025-04-16 10:41:12","undated atu: 12025-07-30 01-00-171"provider user token, encrypted": "eyJpd176TnVEVEL2521xMjd1bKNDWG91Y3Yv00E9sTsTn2h-:*inroviden nofroch token encnvnted". "ev.indiT6tk.IGMkdPVHPKM2VTci+KNGcv0WI+lGcQPSTsTnva"sociahle tvne". "usen""ownen id". 23466• Preparation tor Kell... In 4h 30mCascadeMigrating to PipedriveRead api.php #L325-334D apl.phpThoughtsRead api.php #L725-734ThouahtsD api.phpThoughts >Command dockerl• docker exec docker lamp 1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test 1: OAuth InitializationTnitialization: Client initialized cucceccfullv in 210.21mgTe token tiengeRi opeToken is expired: YESTest zat GewDen DB token -ErronCall to undefined method Pinedrivelversionsiv2\AniDealsAni..getA11Dealso100% 5&• Mon 18 May 10:22:10+0 ..w+1 -11+1-1) calch teoe don sung26100: Zing petA1 1Deal6 () in (se lased)las", se lapsed):selapsed = round((microtime(true) - $startTime) * 1000, 2);ommandi: ites tGetDea ls (Object (Pipedrivelversionslv2/ Configuration))pa/coycoescelcodonn/Concnla/Commande/Crm/Toctpinodriuon44?rio1C/kChmmand..nhn.0hAThouchtsThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so | can continue testing the v2 SDK method mappings.2 4iles 1911-28>Ask anvthina (*4L)SWE-1.6Tenl aee®Reject allAccent allUTF-8...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50184
|
1779
|
7
|
2026-05-18T07:22:10.506139+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088930506_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
3740816030388009784
|
-8636489586330588030
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
iTerm2ShelllEditViewSessionScriptsProfilesWindowHelp• Preparation for Refi... in 4h 38 m100% <78• Mon 18 May 10:22:10DOCKER (docker-compose)DOCKER81DEV (-zsh)О ₴211DOCKER (docker-compose)docker_lamp_1I Team Test(Se06dcee-0613-470e-9a77-2c283198f3bf) is not yet assigned anowner.skipping...docker_lamp_1I Team test ogg auto sync (da44776e-306f-427a-83d8-a1b4baa5537e) is not yet assigned an owner. skipping...docker_lamp_1I Team Tourlaner (d9b71080-388b-4cf5-8175-aa0f29bee635)is not yet assignedanowner.skipping...docker_lamp_1I Dispatched 4 HubSpot sync jobsdocker_lamp_11sDONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'crm:sync-hubspot-objects › */proc/1/fd/1'2>&1docker_lamp_1APP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsdocker_lamp_1Poetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|docker_lamp_1docker_lamp_1T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSIONView in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50185
|
1779
|
8
|
2026-05-18T07:22:11.574955+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088931574_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"21","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"8","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND state 'connected'\nWHERE id = 1116;","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'pipedrive'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND state 'connected'\nWHERE id = 1116;","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50184
|
NULL
|
NULL
|
NULL
|
|
50187
|
1780
|
6
|
2026-05-18T07:22:14.085510+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088934085_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
-6591661911824273406
|
-8285490651859927094
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
PhostormFV faVsco.js vProjectO composer.jsoncomooser lock0 dependency-checker.json0 dev.json=ids.txtE infection.json.distM+ INSTALL.mdM+ INTERNAL_WEBHOOK_SETUP.mdEjiminny_storageM+licenses.mdM Makefilepackage-lock. son=phostan.neon.distE phpstan-baseline.neon< phounit.xmlM+ PIPEDRIVE V2 MIGRATION_ PLAN.moTe raw sal querv.saML README.mdso sonar-oroiect.oropertiesE test.py<> Untited Diadram.xmliI vetur.config.jsMI WEBHOOK FILTERING IMPLEMENTATION.mo› ib External Librariesv = Scratches and Consoles~ D Database ConsolesVASUA console (EU]A DEAL RISKS [EU]A DI [EU]A EU (EU]vAjiminny@localhostA console ljiminny@localhost]A DI [jiminny@localhost]A HS_local [jiminny@localhost]&sr TiminnyolocalnostlA zoho_dev [jiminny@localhost]V A PROD& console PRODI& console 1 PRODI4DI PROD> A QAI> A QAI PRODSTAGINGA console [STAGINGIA console 1 STAGiNG)#uranus STAGINGI> D Extensions) M ScratchesVIewINavicareCodeLaravelKeractor%9 pipedrive-sdk-pocv• Preparation tor Kell... In 4h 30m100% 5&• Mon 18 May 10:22:13® ActivityController.phpconvertLeadActivitles.ongPurgelookupcache.onp© SyncToPlanhat.phpE custom.logE laravel.logA HS_local (jiminny@localhost]© Kernel.phpc createrlaybookcreatedevent.ong4 SF [jiminny@localhost] x4 console (STAGING]A console (PROD]f users [PROD]© TestPipedriveOfficialSakCommand.phpconsole lEUTx: AutovPaygroundd8jiminnyCZZ AZ 418 Y2 Y8 AYCascadeMigrating to Pipedrive+0 ..c) IntearationApp/Service.phpC) PlanhatactivityListener.php(C) CreateCommentedEvent.php(C)AskAnythinaPromptService.phppnp api.ono xTeamController.phgC) CreateSmsSentEvent.pho© AutomatedReportsRepository.phpC) RequestGenerateReport.Job.ohv224226228(C)AutomatedReportResult.ohv(C) AutomatedRenort.oho® CreateTeamRequest.php© UserInvitationDTO.phporganizaSrouter->aroundf'middleware= 'auth:aoi'l staticA2 A5 X3 X16 A$router->group(['prefix''/settings'], static function (Router Srouter): V234ations'l, static function Router Srozo->post(uri: '/*. [OrganizationController: :class,"store"Dzations.store');$router->group(['prefix' = '{team}', 'middleware' => ['teamMember']] 239)F):H):// IntegrationsSrouter->group(['middleware' => 'permission:' . PermissionEnum: :MANAGE_INTEGR 244Srouter->get(uri: '/integrations', [IntegrationController::class, 'all']) /api/ 246->m1ddLeware middleware:'permission:• PermissionEnum::READ_INTEGRATIONS 247'ap1.1nteqrations.1ndex'// Slack API for getting slack channels listsrouter->qete ur'{notificationProvider}/channels', [Controllers|Notification 251// Team actions. XXX: These all need moving out to their own controllers.Srouter->arouodorefix'zations'], static function (Router Srouter ,ssInternal Kiosk. This whole section will be moved out to a senarate file->prefix( uri: 'kiosk')'can:kiosk,' . User: :class)->group(static function (Router Srouter): void {...});258v2597260Srouter -sgroup ('ri etemare' → ('authtapt: l1, statio funetion (Routen Srouten)> Srouter->group(['middleware' => ['api']1, static function (Router Srouter): voit 266› Srouter→>group(['prefix' => 'user'], static function (Router Srouter): void f...$ 268ind should be installed. (22 minutes ago)wselect * from Leads.SELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-C4e0594a3219') = uuicSELECT * FROM activities WHERE id IN (16,422003);SELECT * FROM activities where status = 'failed';+1 -11SELECT * FROM tracks WHERE activity_id = 422003;SELECTFROM activities aJOIN users u 1.n<->1: ON a.user_id = u.idWHEREa.status = 'compleredAND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = U.uuidAND a.deleted at IS NULLAND EXISTS(seleui rrun tracks tWHERE T.activity_1d = a.1dAND t.tvoe IN 'audno', 'video')ORDER BY a.actual start time DESCLIMIT 25:select * from teams where id = 19;select * from crm_configurations where provider = 'pipedrive';CONCAT(u.id, CASE WHEN v.id = t.owner_id THEN ' (owner)' ELSE "' END) AS user_id,u.email,sa.*t.owner_id FROM social_accounts saIOTN ucenc u on ud = ca cociahle idJOIN teams t 1.n<->1: on t.id = u.team_idWHERE u.team_id = 19 and sa.provider = 'Ripedrive';SELECT * FROM social_accounts WHERE id = 1116;UPDATE social_accounts SET provider_user_token = 'pipedrive'AND provider_refresh_token = 'pipedrive'AND expires = 123AND state"connected'Read api.php #L325-334D api.phpThoughts >Read api.php #L725-734ThouahtsD api.phpThoughts >+1-1• docker exec docker lamp 1 php artisan jiminny:test-pipedrive-official-sdk 19Starting Pipedrive Official SDK POC for Team ID: 19Found Pipedrive account for team: Pipedrive, Inc.Test 1: OAuth InitializationPASS - OAuthInitialization: Client initialized successfully in 219.21msTe token tiengeRi opeToken is expired: YESTest zat Gewben swith DB token --ErronCall to undefined method Pinedrivelversionsiv2\AniDealsAni..getA11Dealso) catch (=xceptron se2) 1leals using getAllDeals() in (selapsed)ms", selapsed) ;selapsed = round((microtime(true) - $startTime) * 1000, 2);ommandi: ites tGetDea ls (Object (Pipedrivelversionslv2/ Configuration))pa/coycoesclelCodonn/Concnla/Commande/Crm/Toctpinodriuon44?rio1C/kChmmand..nhn.0hAThe token is expired again (expires at 2026-05-18 07:13:18). Please refresh the token so | can continue testing the v2 SDK method mappings.Tenl aeeWHERE id = 1116;2 4iles 1911-28>"provider_user_token": "v1u: AQIBAHJ-LzTNK2yuuuaLqifzhWb9crUNKTpk4F109rjnXqp_6AEQhDhDQVa:"provider_refresh_token": "5034113:[TELEGRAM_TOKEN]b2bfc!Ask anvthina (*4L)"expires": 1779891997.SWE-1.6* Reject allAccept allW Windsurf Teams 268:27UTE.9...
|
50186
|
NULL
|
NULL
|
NULL
|
|
50188
|
1780
|
7
|
2026-05-18T07:22:16.049958+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088936049_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.31648937,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.32646278,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.33643618,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.3464096,"top":0.3320032,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.35771278,"top":0.33040702,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3650266,"top":0.33040702,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.37367022,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.38231382,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.3932846,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4019282,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4105718,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.42154256,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4325133,"top":0.123703115,"width":0.024268618,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.45910904,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.47007978,"top":0.123703115,"width":0.029587766,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.59375,"top":0.123703115,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"22","depth":4,"bounds":{"left":0.55585104,"top":0.14844373,"width":0.009973404,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.5678192,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"bounds":{"left":0.5777925,"top":0.14844373,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.5894282,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"8","depth":4,"bounds":{"left":0.5994016,"top":0.14844373,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.6090425,"top":0.14684756,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.6163564,"top":0.14684756,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50189
|
1779
|
9
|
2026-05-18T07:22:23.678947+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088943678_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
2587284816325279944
|
-4250265385735962678
|
click
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKER (docker-compose)O ₴2DOCKERDOCKER (docker-compose)81DEV (-zsh)11RUNNINGdocker_lamp_1DONEdocker_1amp_1docker_lamp_12s DONEdocker_lamp_1fd/1'2>81docker_lamp_11S DONEdocker_lamp_11/fd/1'docker_lamp_12026-05-18 07:21:29 Jiminny\Jobs\Crm\SyncHubspotObjects20.632026-05-18 07:22:03 Running ['artisan'meeting-bot:schedule-bot]• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot › */proc/1/2026-05-18 07:22:05 Running ['artisan'dialers:monitor-activities]., '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2026-05-18 07:22:07 Running ['artisan' jiminny:monitor-social-accountdocker_lamp_1proc/1/fd/1'docker_lamp_11 '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/2026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh]docker_lamp_1 | / '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › '/proc/1/fd/1'docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch: process--max-batches=15]docker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 > '/proc/1/fd/1' 2>&1docker_lamp_1 |2026-05-18 07:22:16 Running ['artisan' conference:monitor:count]...2s DONEdocker_lamp_1fd/1'l l '/usr/local/bin/php' 'artisan' conference:monitor:count › '/proc/1/2>&1docker_lamp_1 |2026-05-18 07:22:18 Running ['artisan' mailbox:batch:create].......2S DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' mailbox:batch:create › */proc/1/fd/1' 2>81docker_lamp_12026-05-18 07:22:20 Running ['artisan'activity: sync'ringcentral' 'avaya' 'telus' 'talkdesk'--from='2026-05-18 07:06:00'--to='2026-05-1807:22:00'J2026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesRUNNINGdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_lamp_1I 2s DONEdocker_lamp_1" '/usr/local/bin/php' 'artisan' activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00' > */proc/1/fd/1' 2>81Run•Preparation for Refi... in 4h 38 mAPP (-zsh)*3PROD (ssh)'do-release-upgrade'to upgrade to it.100% <78• Mon 18 May 10:22:23screenpipe"T81PROD*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSIONV View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50190
|
1779
|
10
|
2026-05-18T07:22:28.669856+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088948669_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"22","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"7","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND state 'connected'\nWHERE id = 1116;\n\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA'\nAND provider_refresh_token = 'pipedrive'\n AND expires = 123\n AND state 'connected'\nWHERE id = 1116;\n\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50189
|
NULL
|
NULL
|
NULL
|
|
50191
|
1779
|
11
|
2026-05-18T07:22:38.092128+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088958092_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
1667126322185874327
|
-8321519584708284726
|
visual_change
|
hybrid
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0.• Preparation for Refi... in 4h 38 m100% (78• Mon 18 May 10:22:37DOCKER (docker-compose)О ₴2181DOCKER81DEV (-zsh)DOCKER (docker-compose)docker_lamp_1l '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh].2S DONEdocker_lamp_111/fd/1'1 '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › */proc/2>&1docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch:process--max-batches=15]4s DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 >*/proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:22:16 Running ['artisan' conference:monitor:count]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' conference:monitor:count > */proc/1/fd/1'docker_lamp_12026-05-18 07:22:18 Running ['artisan' mailbox:batch:create]2s DONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' mailbox:batch:create › '/proc/1/fd/1• 2>&1docker_lamp_1 |2026-05-18 07:22:20 Running ['artisan' activity:sync 'ringcentral'vaya''telus' 'talkdesk''a--from='2026-05-18 07:06:00'--to='2026-05-18-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches07:22:00']2026RUNNINGdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_1amp_12S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00' > */proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks] ......3S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1' 2>81docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_lamp_11 • '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > '/proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1I run_artisan_schedule: Done waiting for schedule:runAPP (-zsh)*3screenpipe"RunY2PROD (ssh)'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50192
|
1779
|
12
|
2026-05-18T07:22:41.146190+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088961146_m1.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.0,"top":0.0,"width":0.015277778,"height":0.024444444},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.088194445,"height":0.027777778},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"22","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"18","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"2","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"6","depth":4,"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA'\nAND provider_refresh_token = '5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc'\nAND expires = 1779091997\nAND state 'connected'\nWHERE id = 1116;\n\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,","depth":4,"on_screen":true,"value":"SELECT a.id, a.uuid, a.actual_start_time, o.id, o.uuid FROM opportunities o\nJOIN activities a ON o.id = a.opportunity_id\nWHERE a.crm_configuration_id = 39\nAND a.actual_start_time > '2025-10-13'\nAND a.type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM activities\nWHERE crm_configuration_id = 39 and user_id = 143\nand actual_start_time >= '2025-10-13'\nAND type IN ('conference', 'softphone-inbound', 'softphone-outbound')\n;\n\nSELECT * FROM opportunities WHERE account_id IN (178);\nselect * from activities where id IN (620137, 620187, 620188, 620189, 620230);\n\n# HS\nSELECT * FROM opportunities WHERE id IN (238);\nselect * from activities where id IN (477,2076);\n\nselect * from users;\n\nSELECT COUNT(*) FROM users;\nSELECT COUNT(*) FROM activities;\nSELECT COUNT(*) FROM opportunities;\n\nUPDATE activities\nSET\n actual_start_time = '2025-12-19 09:00:00',\n actual_end_time = '2025-12-19 10:30:00',\n scheduled_start_time = '2025-12-19 09:00:00',\n scheduled_end_time = '2025-12-19 10:30:00'\nWHERE id IN (407509,407375);\n\nselect * from partners;\n\nSELECT id, uuid, type, actual_start_time, user_id, crm_configuration_id\nFROM activities\nWHERE user_id = 143\nAND actual_start_time >= '2025-10-13 00:00:00'\nAND actual_start_time <= '2026-01-13 23:59:59'\nORDER BY actual_start_time DESC;\n\nSELECT * FROM activities WHERE uuid_to_bin('78eda160-3086-435f-88a5-bb0c71b6008d') = uuid;\nSELECT * FROM crm_layouts where crm_configuration_id = 39;\nSELECT * FROM crm_layout_entities WHERE crm_layout_id = 282;\n# lead_id\n# account_id 177\n# contact_id 3969\n# opportunity_id\n# stage_id 203\n\nSELECT * FROM opportunities WHERE opportunities.crm_configuration_id = id = 282;\n\nSELECT * FROM activities where crm_configuration_id = 39 AND type = 'conference'\nAND user_id = 143 and actual_start_time >= '2025-10-13';\n\nSELECT * FROM activities a\n# JOIN opportunities o ON a.opportunity_id = o.id\nWHERE a.crm_configuration_id = 39 AND a.type = 'conference'\nand status = 'completed' and recording_state = 'recorded'\nand a.actual_start_time >= '2025-10-13'\nAND a.user_id = 143\n;\n\nselect * from leads\nwhere crm_configuration_id = 39; # 112 -> ac. 178, 109 => op. 1707\n\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310,407509,407375,356001,356008);\nSELECT * FROM activities WHERE id IN (356013,616188,616202,616310);\nSELECT * FROM activities WHERE id IN (407509,407375); # leads: 112, 109 | status - 198\nSELECT * FROM activities WHERE id IN (356001, 356008); # contacts:\n\nSELECT * FROM opportunities WHERE id IN (1707);\nSELECT * FROM stages where id IN (204, 198);\nSELECT * FROM opportunities WHERE account_id IN (178);\nSELECT * FROM opportunities WHERE crm_configuration_id = 39 AND created_at > '2025-01-01';\nSELECT * FROM contacts WHERE account_id IN (178); # 4118 Musaibe, 4448 Ceco Personal\n\nSELECT * FROM activities where crm_configuration_id = 39\nAND opportunity_id IS NULL\nAND is_internal = false\nand status = 'completed' and recording_state = 'recorded'\nAND actual_start_time >= '2025-10-13'\nAND (lead_id IS NOT NULL OR contact_id IS NOT NULL OR account_id IS NOT NULL)\n# AND lead_id IN (112, 109)\n;\n\nSELECT * FROM crm_profiles WHERE user_id = 143;\n\nselect * from inboxes; # 212\nselect * from users where id = 143; # 143\nselect * from inbox_email_batches where inbox_id = 212\nand updated_at >= '2026-01-28 00:00:00' order by id desc;\nselect * from inbox_emails where inbox_id = 212\nand batch_id = 95885 order by id desc;\nselect * from email_messages where origin_user_id = 143;\nselect * from activities where user_id = 143 and updated_at >= '2026-01-28 00:00:00';\nselect * from participants where activity_id = 620247;\n\nselect * from crm_profiles where user_id = 143;\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid; # 356001\nselect * from transcription where activity_id = 356001; # 6943\nselect * from ai_prompts where transcription_id = 6943;\nSELECT * FROM activity_summary_logs where activity_id = 356001;\n\nSELECT * FROM social_accounts WHERE sociable_id = 143;\n\n# ************************************************************************************\nSELECT * FROM activities WHERE uuid_to_bin('0164a4fb-cb95-454e-9edd-4d804e4999bd') = uuid;\n# 422515 softphone tr. 8100\n\nSELECT * FROM activities WHERE uuid_to_bin('7520add8-8d87-41a5-98e5-fc4edf96f21e') = uuid;\n# 407509 conference tr. 7670 crmId: 00UD1000002J9aTMAS\n\nselect * from ai_prompts where transcription_id IN (8100, 7670);\nselect * from activity_summary_logs where activity_id = 407509;\n\nselect * from sidekick_settings;\nselect * from default_activity_types;\n\nSELECT * FROM contacts WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\nSELECT * FROM leads WHERE crm_configuration_id = 39 and email = 'm.kogoj@gmx.at';\n\nSELECT * FROM activity_searches where user_id = 143;\nSELECT * FROM groups where team_id = 1;\n\nselect * from teams where id = 1;\nselect * from groups where team_id = 1; # 1150 - 7e75f8025c22\nselect id, name, group_id, status, deleted_at, email\nfrom users where team_id = 1 order by group_id desc ;\n\nselect * from activity_searches where id in (1977, 1978, 1979);\nselect * from activity_search_filters where activity_search_id IN (1977, 1978, 1979);\nselect * from activity_search_filters where filter = 'group_id' and value = '443f26b8-8512-437e-a9f9-7e75f8025c22'; # 10268, 10272, 10277\nselect * from nudges where activity_search_id IN (1977, 1978, 1979); # 877, 878, 879\n\nINSERT INTO `activity_search_filters`\n(`activity_search_id`, `filter`, `value`) VALUES\n(1977, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1978, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22'),\n(1979, 'group_id', '443f26b8-8512-437e-a9f9-7e75f8025c22')\n;\n\nselect * from crm_configurations where id = 39;\n\n\nselect sa.* from users u JOIN social_accounts sa on u.id = sa.sociable_id\nwhere u.team_id = 1;\nSELECT * FROM social_accounts WHERE sociable_id = 1635;\nSELECT * FROM users WHERE id = 1635;\n\nselect * from teams where id = 1;\nselect * from users where team_id = 1;\nselect * from team_features where team_id = 1;\nselect * from features;\n\nSELECT * FROM activity_searches where id = 1982; # 1981\nSELECT * FROM activity_search_filters WHERE activity_search_id = 1982;\n\nSELECT * FROM activities WHERE uuid_to_bin('e916569b-086c-4bd1-94d7-5e3802c27ccf') = uuid;\nSELECT * FROM groups WHERE id = 1439;\nSELECT * FROM users WHERE group_id = 1439;\n\nselect * from permissions; # 158\nselect * from roles;\nselect * from permission_role;\n\nselect * from teams where id = 1;\nselect * from groups g JOIN playbooks p on g.playbook_id = p.id where g.team_id = 1;\nselect * from groups where id = 28;\nselect * from playbooks where team_id = 1;\nselect * from playbooks where id = 179;\nselect * from playbook_categories where id = 1391;\nselect * from users where id = 143;\nselect * from crm_profiles where user_id = 143;\nselect * from activities where crm_configuration_id = 39 and type = 'conference'\nand crm_provider_id IS NOT NULL ORDER by id desc;\nselect * from activities where id = 422003; # 00UO400000pB6fpMAC\n\nSELECT ar.id, ar.uuid, ar.media_type, ar.status, a.type\nFROM automated_report_results ar\nJOIN automated_reports a ON a.id = ar.report_id\nWHERE a.type = 'ask_jiminny'\nLIMIT 10;\n\nSELECT * FROM automated_reports where id = 71;\nSELECT * FROM automated_report_results where report_id = 71;\nUPDATE automated_reports set playbook_categories = NULL where id = 68;\nSELECT * FROM automated_report_results where id = 275;\n\nSELECT * FROM automated_reports order by id desc;\nSELECT * FROM automated_report_results order by id desc;\nselect * from activity_searches where user_id = 143;\nselect * from ask_anything_prompts;\n\nSELECT `automated_report_results`.* FROM `automated_report_results`\nINNER JOIN `automated_reports`\n ON `automated_report_results`.`report_id` = `automated_reports`.`id`\nWHERE 1=1\n AND `automated_report_results`.`generated_at` IS NOT NULL\n# AND `automated_report_results`.`sent_at` IS NOT NULL\n AND `automated_reports`.`team_id` = 1\n AND JSON_CONTAINS(`automated_reports`.`recipients`, 143, '$.\"users\"')\n;\n\nSELECT * FROM automated_reports where id = 67;\nSELECT * FROM automated_reports where id = 42;\nSELECT * FROM users WHERE id = 143; # group 28\n\nselect * from teams where id = 3143;\nselect * from crm_configurations where id = 500;\nselect * from users where name = 'Integration Account'; # 1695\nSELECT * FROM social_accounts WHERE sociable_id = 1695;\n\nselect * from activities where crm_configuration_id = 39\nand recording_state = 'recorded' and duration > 60\nand status = 'completed' and actual_start_time >= '2025-12-01';\n\nSELECT * FROM activities WHERE uuid_to_bin('458cf915-b914-4000-b083-5687b32b2956') = uuid;\n\nselect * from leads;\n\nSELECT * FROM activities WHERE uuid_to_bin('f43cf158-e60d-46e5-92f8-c4e0594a3219') = uuid; # 422003\nSELECT * FROM activities WHERE id IN (16,422003);\nSELECT * FROM activities where status = 'failed';\n\nSELECT * FROM tracks WHERE activity_id = 422003;\n\nSELECT\n a.*\nFROM activities a\nJOIN users u ON a.user_id = u.id\nWHERE\n a.status = 'completed'\n AND uuid_to_bin('641f1acb-16b8-42d1-8726-df52979dad0e') = u.uuid\n AND a.deleted_at IS NULL\n AND EXISTS (\n SELECT 1 FROM tracks t\n WHERE t.activity_id = a.id\n AND t.type IN ('audio', 'video')\n )\nORDER BY a.actual_start_time DESC\nLIMIT 25;\n\nselect * from teams where id = 19;\nselect * from crm_configurations where provider = 'pipedrive';\nSELECT\n CONCAT(u.id, CASE WHEN u.id = t.owner_id THEN ' (owner)' ELSE '' END) AS user_id,\n u.email,\n sa.*,\n t.owner_id FROM social_accounts sa\nJOIN users u on u.id = sa.sociable_id\nJOIN teams t on t.id = u.team_id\nWHERE u.team_id = 19 and sa.provider = 'pipedrive';\n\nSELECT * FROM social_accounts WHERE id = 1116;\n\nUPDATE social_accounts SET provider_user_token = 'v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA'\nAND provider_refresh_token = '5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc'\nAND expires = 1779091997\nAND state 'connected'\nWHERE id = 1116;\n\n \"provider_user_token\": \"v1u:AQIBAHj-LzTNK2yuuuaLqifzhWb9crUNKTpk4FlQ9rjnXqp_6AEQhDhDQVa1nvWCHEvnpvSEAAAAfjB8BgkqhkiG9w0BBwagbzBtAgEAMGgGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMnG8KNcZLIjEnlRPxAgEQgDsGPIcKjsMU7Qel36BtM5FCQa56mYUy24_AAoqd12yjVFkq6egLqS0inp-5G4JE7frJURMV8VTw_fY14g:rYyABXmXsBhEdYU_dfmDH8GF-vzSseJXE5bds_zAyVdAwlTXOPdTl9i4PS4jVofLvpq7IRgvEt2BzGhR6cWiQXHHD0AtayQOkZm262ClFCsMYtKGfep0Jq1n0eiRIVqT9gAY7rWvhpEDF8oAlgnRGmqx-euIkpzE79sPXh4OjNx_yUIaanjyplGpBBJ_NiACd1sMlZmseyUyyU_gldqlCBAuK9hhATc9icgg7zuoc7nKBBrlg49tRtzEagDh6xbFBpzfCp7kE_7n4TLWfWHLPMzu-bktjwA969G9sFRmoH1GjPA0a2odDT4dk1_1ouBrB1NcTT2hQUqH-_RzDW2nWmeoVHA\",\n \"provider_refresh_token\": \"5034113:19555731:87c14258f0c813d02767ee975f6044d46b6b2bfc\",\n \"expires\": 1779091997,","role_description":"text entry area","is_enabled":true,"is_focused":true,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Project","depth":3,"on_screen":false,"role_description":"text"},{"role":"AXButton","text":"Project","depth":3,"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"New File or Directory…","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Expand Selected","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Collapse All","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Options","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.0,"top":0.0,"width":0.018055556,"height":0.026666667},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
visual_change
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50191
|
NULL
|
NULL
|
NULL
|
|
50193
|
1780
|
8
|
2026-05-18T07:22:47.943474+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088967943_m2.jpg...
|
PhpStorm
|
faVsco.js – SF [jiminny@localhost]
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
[{"role":"AXButton","text" [{"role":"AXButton","text":"Project: faVsco.js, menu","depth":5,"bounds":{"left":0.025930852,"top":0.019952115,"width":0.03856383,"height":0.025538707},"on_screen":true,"help_text":"~/jiminny/app","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"pipedrive-sdk-poc, menu","depth":5,"bounds":{"left":0.064494684,"top":0.019952115,"width":0.05618351,"height":0.025538707},"on_screen":true,"help_text":"Git Branch: pipedrive-sdk-poc","role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Start Listening for PHP Debug Connections","depth":5,"bounds":{"left":0.8081782,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"AskJiminnyReportActivityServiceTest","depth":6,"bounds":{"left":0.8234708,"top":0.019952115,"width":0.09208777,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Run 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9155585,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Debug 'AskJiminnyReportActivityServiceTest'","depth":6,"bounds":{"left":0.9268617,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"More Actions","depth":6,"bounds":{"left":0.9381649,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"JetBrains AI","depth":5,"bounds":{"left":0.96609044,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Search Everywhere","depth":5,"bounds":{"left":0.9773936,"top":0.019952115,"width":0.011303191,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"IDE and Project Settings","depth":5,"bounds":{"left":0.9886968,"top":0.019952115,"width":0.011303186,"height":0.025538707},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Show Replace Field","depth":4,"bounds":{"left":0.14228724,"top":0.30327216,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Search History","depth":3,"bounds":{"left":0.1549202,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"organiza","depth":4,"bounds":{"left":0.16589096,"top":0.30247405,"width":0.043882977,"height":0.015961692},"on_screen":true,"value":"organiza","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.21875,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Match Case","depth":3,"bounds":{"left":0.2287234,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Words","depth":3,"bounds":{"left":0.23736702,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Regex","depth":3,"bounds":{"left":0.24601063,"top":0.30247405,"width":0.00731383,"height":0.017557861},"on_screen":true,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Replace History","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextField","text":"Replace","depth":4,"on_screen":false,"role_description":"text field","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"New Line","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"Preserve case","depth":3,"bounds":{"left":0.27027926,"top":1.0,"width":0.00731383,"height":0.0},"on_screen":false,"role_description":"checkbox","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"1/10","depth":4,"bounds":{"left":0.25964096,"top":0.30167598,"width":0.025598405,"height":0.017557861},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Occurrence","depth":4,"bounds":{"left":0.28523937,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Occurrence","depth":4,"bounds":{"left":0.29388297,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Filter Search Results","depth":4,"bounds":{"left":0.3025266,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open in Window, Multiple Cursors","depth":4,"bounds":{"left":0.31117022,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Click to highlight","depth":4,"on_screen":false,"role_description":"link","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Close","depth":4,"bounds":{"left":0.35904256,"top":0.3008779,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Sync Changes","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide This Notification","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Built-in Preview","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Chrome","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Firefox","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Safari","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"2","depth":4,"bounds":{"left":0.31648937,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"5","depth":4,"bounds":{"left":0.32646278,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"3","depth":4,"bounds":{"left":0.33643618,"top":0.3320032,"width":0.007978723,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXStaticText","text":"16","depth":4,"bounds":{"left":0.3464096,"top":0.3320032,"width":0.009640957,"height":0.015163607},"on_screen":true,"role_description":"text"},{"role":"AXButton","text":"Previous Highlighted Error","depth":4,"bounds":{"left":0.35771278,"top":0.33040702,"width":0.00731383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Next Highlighted Error","depth":4,"bounds":{"left":0.3650266,"top":0.33040702,"width":0.006981383,"height":0.018355945},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXTextArea","text":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","depth":4,"on_screen":true,"value":"<?php\n\ndeclare(strict_types=1);\n\n/**\n * API routes.\n *\n * @see \\Jiminny\\Providers\\RouteServiceProvider\n *\n * @var Router $router\n */\n\nuse Illuminate\\Routing\\Router;\nuse Illuminate\\Support\\Collection;\nuse Jiminny\\Component\\DealInsights\\Forecast\\Forecast;\nuse Jiminny\\Component\\Router\\Routes;\nuse Jiminny\\Contracts\\Acl\\PermissionEnum;\nuse Jiminny\\Http\\Controllers;\nuse Jiminny\\Http\\Controllers\\API\\ActivityController;\nuse Jiminny\\Http\\Controllers\\API\\AiCrmNotesController;\nuse Jiminny\\Http\\Controllers\\API\\ClientTokenController;\nuse Jiminny\\Http\\Controllers\\API\\CrmController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAiCallScoringController;\nuse Jiminny\\Http\\Controllers\\ConferencesOptInOutController;\nuse Jiminny\\Http\\Controllers\\API\\DealRiskController;\nuse Jiminny\\Http\\Controllers\\API\\InstantMeetingController;\nuse Jiminny\\Http\\Controllers\\API\\LanguageController;\nuse Jiminny\\Http\\Controllers\\API\\LiveFeedController;\nuse Jiminny\\Http\\Controllers\\API\\MeetingsController;\nuse Jiminny\\Http\\Controllers\\API\\MessageController;\nuse Jiminny\\Http\\Controllers\\API\\MetadataController;\nuse Jiminny\\Http\\Controllers\\API\\MobileSettingsController;\nuse Jiminny\\Http\\Controllers\\API\\MomentController;\nuse Jiminny\\Http\\Controllers\\API\\NudgeController;\nuse Jiminny\\Http\\Controllers\\API\\NumberAllocatorController;\nuse Jiminny\\Http\\Controllers\\API\\Opportunity\\CommentsController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationLicensesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationMembersController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRetentionPolicyController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationRolesController;\nuse Jiminny\\Http\\Controllers\\API\\OrganizationSyncController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\OnDemandController;\nuse Jiminny\\Http\\Controllers\\API\\Page\\PlaybackController;\nuse Jiminny\\Http\\Controllers\\API\\PartnerController;\nuse Jiminny\\Http\\Controllers\\API\\PhoneNumberController;\nuse Jiminny\\Http\\Controllers\\API\\PlaylistController;\nuse Jiminny\\Http\\Controllers\\API\\Settings\\EmailSyncController;\nuse Jiminny\\Http\\Controllers\\API\\SidekickController;\nuse Jiminny\\Http\\Controllers\\API\\SoftphoneController;\nuse Jiminny\\Http\\Controllers\\API\\SubscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiAutomationController;\nuse Jiminny\\Http\\Controllers\\API\\TeamAiContextController;\nuse Jiminny\\Http\\Controllers\\API\\TeamController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ActivityStatsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\CoachingFeedbacksController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\DashboardController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\EngagementController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TeamInsightsAutomatedCallScoresController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\ThemeTopicsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsights\\TopicsInDealsController;\nuse Jiminny\\Http\\Controllers\\API\\TeamInsightsController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\ThemeController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicController;\nuse Jiminny\\Http\\Controllers\\API\\Themes\\TopicTriggerController;\nuse Jiminny\\Http\\Controllers\\API\\TranscriptionController;\nuse Jiminny\\Http\\Controllers\\API\\TranslationController;\nuse Jiminny\\Http\\Controllers\\API\\UserAutomatedReports\\UserAutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\API\\UserController;\nuse Jiminny\\Http\\Controllers\\API\\VocabularyController;\nuse Jiminny\\Http\\Controllers\\Auth\\ExtensionController;\nuse Jiminny\\Http\\Controllers\\Auth\\SocialController;\nuse Jiminny\\Http\\Controllers\\ExportController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\ActivityController as KioskActivityController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\AutomatedReportsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\MediaPipelineController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\OrganizationsController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\PartnersController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\SearchController;\nuse Jiminny\\Http\\Controllers\\Kiosk\\Teams\\OnboardController;\nuse Jiminny\\Http\\Controllers\\NotificationController;\nuse Jiminny\\Http\\Controllers\\Settings\\GroupController;\nuse Jiminny\\Http\\Controllers\\Settings\\JobTitleController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookCategoryController;\nuse Jiminny\\Http\\Controllers\\Settings\\PlaybookController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\IntegrationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\InvitationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamActivityController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamCoachingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamConferenceSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamController as OrganizationController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamDealInsightsSettingController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamMemberController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamPhotoController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamRecordingSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSettingsController;\nuse Jiminny\\Http\\Controllers\\Settings\\Teams\\TeamSoftphoneSettingsController;\nuse Jiminny\\Http\\Controllers\\TeamSetupController;\nuse Jiminny\\Models;\nuse Jiminny\\Models\\PlaybackTheme;\nuse Jiminny\\Models\\SocialAccount;\nuse Jiminny\\Models\\User;\nuse Jiminny\\Models\\Vocabulary;\nuse Jiminny\\Repositories;\nuse Jiminny\\Mcp\\Servers\\JiminnyServer;\nuse Laravel\\Mcp\\Facades\\Mcp;\n\n// mcp.audit MUST stay outermost so its $next($request) call wraps the auth\n// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections\n// short-circuit before McpAuditMiddleware::handle ever runs and we lose\n// audit rows for exactly the requests the security log most needs to capture.\n// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing\n// pre-auth is safe.\nMcp::web('/mcp', JiminnyServer::class)\n ->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/metadata/extension-app', [MetadataController::class, 'extension']);\n\n $router->get('/', [NumberAllocatorController::class, 'generate']);\n $router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);\n\n $router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('instant-meeting.start');\n\n // Meeting creation endpoint for Outlook add-in\n $router->post('/meetings', [MeetingsController::class, 'create'])\n ->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])\n ->name('meetings.create');\n\n // Number provisioning and search.\n $router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);\n $router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);\n\n $router->group(['prefix' => 'deal-insights'], static function (Router $router): void {\n $router->get('/forecast', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'getForecast',\n ])->defaults('period', Forecast::PERIOD_QUARTER);\n\n $router->get('/deals/{stage?}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'list',\n ])->defaults('stage', \\Jiminny\\Component\\DealInsights\\CriteriaInterface::STAGE_ALL);\n\n $router->get('/details/details-daily/{opportunityId}/{date}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'detailsDaily',\n ]);\n\n $router->put('/deals/{opportunity}/edit-fields', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'updateFields',\n ]);\n\n $router->get('/externalId/{dealId}', [\n Controllers\\API\\DealInsights\\DealsController::class,\n 'externalDealId',\n ]);\n\n $router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);\n });\n\n $router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])\n ->name('team_insights.users');\n\n $router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])\n ->name('team_insights.dashboard');\n\n // Team Insights - Coaching Feedbacks\n $router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])\n ->name('team_insights.coaching_feedbacks_over_time');\n\n $router\n ->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])\n ->name('team_insights.coaching_feedbacks_over_time.download');\n\n $router->get(\n '/team-insights/coaching-feedbacks-over-time/drill-down',\n [CoachingFeedbacksController::class, 'drillDown'],\n )->name('team_insights.coaching_feedbacks_over_time.drill_down');\n\n // Team Insights - Automated Call Scores\n $router->get(\n '/team-insights/automated-call-scores-over-time',\n [TeamInsightsAutomatedCallScoresController::class, 'index'],\n )->name('team_insights.automated_call_scores_over_time.index');\n\n $router->get(\n '/team-insights/automated-call-scores-over-time/drill-down',\n [TeamInsightsAutomatedCallScoresController::class, 'show'],\n )->name('team_insights.automated_call_scores_over_time.show');\n\n // Team Insights - AI Call Scoring\n $router->get(\n '/team-insights/ai-call-scoring-over-time',\n [TeamInsightsAiCallScoringController::class, 'index'],\n )->name('team_insights.ai_call_scoring_over_time.index');\n\n $router->get(\n '/team-insights/ai-call-scoring-over-time/drill-down',\n [TeamInsightsAiCallScoringController::class, 'show'],\n )->name('team_insights.ai_call_scoring_over_time.show');\n\n $router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])\n ->name('team_insights.engagement');\n\n $router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])\n ->name('team_insights.engagement.drill_down');\n\n $router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])\n ->name('team_insights.topics.index');\n\n $router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])\n ->name('team_insights.topics.show');\n\n $router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])\n ->name('team_insights.topics.drill_down');\n\n $router->group(['prefix' => 'team-insights'], static function (Router $router): void {\n $router->group(['prefix' => 'conversations'], static function (Router $router): void {\n $router->get('/', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'fetch',\n ]);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{activityChannel}/{drillDownType}', [\n Controllers\\API\\TeamInsights\\ConversationsController::class,\n 'drillDown',\n ])\n ->where(\n 'activityChannel',\n Collection::make(Models\\Activity::CHANNELS)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(Repositories\\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)\n ->join('|'),\n );\n });\n });\n\n $router->group(['prefix' => 'coaching'], static function (Router $router): void {\n $router->get('/', [EngagementController::class, 'fetch']);\n\n $router->group(['prefix' => 'drill-down'], static function (Router $router): void {\n $router\n ->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])\n ->where(\n 'coachingType',\n Collection::make(EngagementController::COACHING_TYPES)->join('|'),\n )\n ->where(\n 'drillDownType',\n Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),\n );\n });\n });\n });\n\n $router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])\n ->name('topics_in_deals.topics');\n $router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])\n ->name('topics_in_deals.topic_triggers');\n $router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])\n ->name('topics_in_deals.comparison');\n\n // CRM actions.\n $router->group(['prefix' => 'crm'], static function (Router $router): void {\n $router->get('/search', [CrmController::class, 'search']);\n $router->get('/opportunity', [CrmController::class, 'opportunities']);\n $router->get('/customers', [CrmController::class, 'customers']);\n $router->get('/accounts', [CrmController::class, 'accounts']);\n $router->get('/contacts', [CrmController::class, 'contacts']);\n $router->get('/leads', [CrmController::class, 'leads']);\n $router->get('/tasks', [CrmController::class, 'activities']);\n $router->get('/layouts', [CrmController::class, 'layouts']);\n });\n\n // AI CRM notes.\n $router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {\n $router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);\n $router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);\n $router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);\n\n $router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);\n $router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);\n $router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);\n });\n\n // Automated Reports\n $router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);\n\n $router->group(\n [\n 'prefix' => 'automated-reports',\n 'middleware' => 'can:canAccessAiReports,' . User::class,\n ],\n static function (Router $router): void {\n $router->get('/', [UserAutomatedReportsController::class, 'list']);\n $router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);\n }\n );\n\n // Setup New Team / Trial\n $router->get('/features', [TeamSetupController::class, 'features']);\n $router->get('/tiers', [TeamSetupController::class, 'tiers']);\n $router->get('/calendars', [TeamSetupController::class, 'calendars']);\n $router->get('/crm-services', [TeamSetupController::class, 'crmServices']);\n $router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);\n $router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);\n $router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);\n\n // Notifications\n $router->get('/notifications/recent', [NotificationController::class, 'notifications']);\n $router->put('/notifications/read', [NotificationController::class, 'markAsRead']);\n $router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);\n $router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);\n\n // Live feed\n $router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);\n\n // Languages\n $router->get('/languages', [LanguageController::class, 'list']);\n\n // The whole settings section will be moved out in a separate file\n $router->group(['prefix' => '/settings'], static function (Router $router): void {\n $router->group(['prefix' => '/organizations'], static function (Router $router): void {\n $router\n ->middleware(['can:kiosk,' . User::class])\n ->post('/', [OrganizationController::class, 'store'])\n ->name('kiosk.organizations.store');\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {\n // Sync fields and team metadata\n $router->post('/fields/sync', [OrganizationSyncController::class, 'index'])\n ->name('api.sync.fields');\n\n // Conference Preferences.\n $router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])\n ->name('update.bot.avatar');\n\n // Roles.\n $router->get('/roles', [OrganizationRolesController::class, 'index'])\n ->name('api.roles.index');\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],\n static function (Router $router): void {\n $router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])\n ->name('api.retention_policy.index');\n\n $router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])\n ->name('api.retention_policy.update');\n }\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],\n static function (Router $router): void {\n // Invitations.\n $router->get('/invitations', [InvitationController::class, 'index'])\n ->name('api.invitations.index');\n $router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])\n ->name('api.invitations.resend');\n $router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])\n ->name('api.invitations.delete');\n $router->post('/invitations', [InvitationController::class, 'store'])\n ->name('api.invitations.store');\n },\n );\n\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],\n static function (Router $router): void {\n // Groups.\n $router->post('/groups', [GroupController::class, 'store']);\n $router->get('/groups/{group}', [GroupController::class, 'show']);\n $router->put('/groups/{group}', [GroupController::class, 'update']);\n\n $router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);\n\n $router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);\n\n // Sidekick settings\n $router->group(\n ['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],\n static function (Router $router): void {\n $router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);\n $router\n ->post(\n '/group/{group}/sidekick',\n [SidekickController::class, 'setSidekickSettings'],\n )\n ->middleware(['can:updateSidekickSettings,group'])\n ->name('api.sidekick_settings.update');\n $router\n ->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])\n ->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])\n ->name('api.sidekick_settings.update_all');\n },\n );\n\n $router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);\n $router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);\n\n // CRM Layout Management\n $router->group(['prefix' => 'layouts'], static function (Router $router): void {\n $router->get(\n '/{type}',\n [Controllers\\API\\LayoutManagementController::class, 'list'],\n )->name('layouts.list');\n\n $router->put(\n '/{layout}',\n [Controllers\\API\\LayoutManagementController::class, 'update'],\n )->name('layouts.update');\n });\n\n // Users.\n $router->put('/users/{user}', [TeamMemberController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.update');\n $router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])\n ->name('api.users.deactivate');\n\n $router->group(\n [\n 'prefix' => 'vocabulary',\n 'middleware' => 'can:manage,' . Vocabulary::class,\n ],\n static function (Router $router): void {\n $router\n ->get('/', [VocabularyController::class, 'list'])\n ->name('api.vocabulary.index');\n $router\n ->post('/', [VocabularyController::class, 'update'])\n ->name('api.vocabulary.create');\n\n $router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {\n $router\n ->put('/', [VocabularyController::class, 'update'])\n ->middleware('can:update,vocabulary')\n ->name('api.vocabulary.update');\n $router\n ->delete('/', [VocabularyController::class, 'delete'])\n ->middleware('can:delete,vocabulary')\n ->name('api.vocabulary.delete');\n });\n },\n );\n\n $router->group(['prefix' => 'ai-context'], static function (Router $router): void {\n $router->get('/', [TeamAiContextController::class, 'index'])\n ->name('api.ai_context.get');\n $router->post('/', [TeamAiContextController::class, 'store'])\n ->name('api.ai_context.store');\n });\n\n $router->group(['prefix' => 'ai-automation'], static function (Router $router): void {\n $router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])\n ->name('api.automation.templates.fields.test-prompt');\n // List CRM fields per object type\n $router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])\n ->name('api.automation.fields');\n\n // List DealStages fields per object type\n $router->get('/stages', [TeamAiAutomationController::class, 'stages'])\n ->name('api.automation.stages');\n // Create CRM AI template\n $router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])\n ->name('api.automation.templates.create');\n\n // Export CRM updates\n $router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])\n ->name('api.automation.templates.export-crm-updates');\n\n // Update CRM AI template\n $router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])\n ->name('api.automation.templates.update');\n // Delete CRM AI template\n $router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])\n ->name('api.automation.templates.delete');\n // List all CRM AI templates\n $router->get('/templates', [TeamAiAutomationController::class, 'templates'])\n ->name('api.automation.templates.list');\n // Create CRM AI template field\n $router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])\n ->name('api.automation.templates.fields.create');\n // Update CRM AI template field\n $router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])\n ->name('api.automation.templates.fields.update');\n // Delete CRM AI template field\n $router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])\n ->name('api.automation.templates.fields.delete');\n });\n\n $router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {\n // Create AI scorecard\n $router->post('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'createAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.create');\n // Update AI scorecard\n $router->put('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'updateAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.update');\n // Delete AI scorecard\n $router->delete('/ai-scorecards/{aiScorecard}', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'deleteAiScorecard'])\n ->name('api.ai-call-scoring.ai-scorecards.delete');\n // List all AI scorecards\n $router->get('/ai-scorecards', [Controllers\\API\\AiCallScoring\\AiScorecardController::class, 'aiScorecards'])\n ->name('api.ai-call-scoring.ai-scorecards.list');\n // Test AI scorecard prompt\n $router->post(\n '/ai-scorecards/{aiScorecard}/test-prompt',\n [\n Controllers\\API\\AiCallScoring\\AiScorecardController::class,\n 'testAiScorecardPrompt',\n ]\n )\n ->name('api.ai-call-scoring.ai-scorecards.test-prompt');\n\n // Create AI Scorecard rule\n $router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'createRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');\n // Update AI Scorecard rule\n $router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'updateAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');\n // Delete AI Scorecard rule\n $router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\\API\\AiCallScoring\\AiScorecardRuleController::class, 'deleteAiScorecardRule'])\n ->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');\n });\n\n // Theme, topics, triggers\n $router->get('/themes', [ThemeController::class, 'list']);\n $router\n ->post('/themes', [ThemeController::class, 'updateTheme'])\n ->middleware('can:manage,' . PlaybackTheme::class)\n ->name('api.theme.create');\n\n $router->group(\n [\n 'prefix' => 'theme/{theme}',\n 'middleware' => 'can:update,theme',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [ThemeController::class, 'updateTheme'])\n ->name('api.theme.update');\n $router\n ->delete('/', [ThemeController::class, 'deleteTheme'])\n ->middleware('can:delete,theme')\n ->name('api.theme.delete');\n\n $router\n ->post('/topics', [TopicController::class, 'updateTopic'])\n ->middleware('can:createTopic,theme')\n ->name('api.topic.create');\n\n $router->group(\n [\n 'prefix' => 'topic/{topic}',\n 'middleware' => 'can:update,topic',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicController::class, 'updateTopic'])\n ->name('api.topic.update');\n $router\n ->delete('/', [TopicController::class, 'deleteTopic'])\n ->middleware('can:delete,topic')\n ->name('api.topic.delete');\n\n $router\n ->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])\n ->middleware('can:createTrigger,topic')\n ->name('api.topic_trigger.create');\n\n $router->group(\n [\n 'prefix' => 'trigger/{topicTrigger}',\n 'middleware' => 'can:update,topicTrigger',\n ],\n static function (Router $router): void {\n $router\n ->put('/', [TopicTriggerController::class, 'updateTrigger'])\n ->name('api.topic_trigger.update');\n $router\n ->delete('/', [TopicTriggerController::class, 'deleteTrigger'])\n ->middleware('can:delete,topicTrigger')\n ->name('api.topic_trigger.delete');\n },\n );\n },\n );\n },\n );\n\n $router->post('/themes/import', [Controllers\\API\\Themes\\ImportTopicTriggerController::class, 'importThemes']);\n $router->get('/themes/export', [Controllers\\API\\Themes\\ExportTopicTriggerController::class, 'exportThemes']);\n\n // Auto-scoring\n $router->group(['prefix' => '/scorecards'], static function (Router $router) {\n $router->get('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'list']);\n $router->post('/', [Controllers\\API\\Scorecards\\ScorecardController::class, 'create']);\n $router->delete('/{scorecard}', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n $router->post('/validate-name', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'validateNameExists',\n ]);\n\n $router->get('/enabled-scorecard', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getEnabledScorecard',\n ]);\n\n $router->get('/affected-scorecards', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'getAffectedScorecards',\n ]);\n\n $router->group(['prefix' => '/{scorecard}'], static function (Router $router) {\n $router->put('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'update',\n ]);\n $router->delete('/', [\n Controllers\\API\\Scorecards\\ScorecardController::class,\n 'delete',\n ]);\n\n $router->post('/rules', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'create',\n ]);\n\n $router->post('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'update',\n ]);\n\n $router->delete('/rules/{scorecardRule}', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'delete',\n ]);\n\n $router->post('/rules/{scorecardRule}/update-order', [\n Controllers\\API\\Scorecards\\ScorecardRuleController::class,\n 'updateOrder',\n ]);\n });\n });\n\n // Coaching Playbook.\n Route::get('/playbooks', [PlaybookController::class, 'all']);\n Route::get('/playbooksTree', [PlaybookController::class, 'tree']);\n Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);\n Route::post('/playbooks', [PlaybookController::class, 'store']);\n Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);\n\n Route::prefix('/playbooks/{playbook}')->group(static function () {\n // Playbook Categories.\n Route::get('/categories', [PlaybookCategoryController::class, 'all']);\n Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.\n Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);\n Route::post('/categories', [PlaybookCategoryController::class, 'store']);\n Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);\n Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);\n Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);\n\n Route::prefix('/categories/{category}')->group(static function () {\n // Coaching Sections\n Route::get('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'all']);\n Route::put('/coaching-section/sequence', [Controllers\\Settings\\Coaching\\SectionsController::class, 'sequence']);\n Route::put('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'update']);\n Route::post('/coaching-section', [Controllers\\Settings\\Coaching\\SectionsController::class, 'store']);\n Route::delete('/coaching-section/{coachingSection}', [Controllers\\Settings\\Coaching\\SectionsController::class, 'destroy']);\n\n Route::prefix('coaching-section/{coachingSection}')->group(static function () {\n // Coaching Section Criteria\n Route::get('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'all']);\n Route::put('/coaching-section-criterion/sequence', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'sequence']);\n Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'update']);\n Route::post('/coaching-section-criterion', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'store']);\n Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\\Settings\\Coaching\\SectionCriteriaController::class, 'destroy']);\n });\n });\n });\n },\n );\n\n $router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])\n ->group(static function (Router $router): void {\n // Job Titles.\n $router->get('/job-titles', [JobTitleController::class, 'all']);\n $router->put('/job-titles/{job}', [JobTitleController::class, 'update']);\n $router->post('/job-titles', [JobTitleController::class, 'store']);\n $router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);\n\n // Team Settings.\n $router->put('/', [TeamSettingsController::class, 'update']);\n $router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);\n $router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);\n $router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);\n $router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);\n $router->put('/owner', [Controllers\\Settings\\Teams\\OrganizationSettingsController::class, 'updateOwner']);\n\n $router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);\n\n // Key Moments.\n $router->get('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'show']);\n $router->put('/moments/{moment}', [Controllers\\Settings\\MomentController::class, 'update']);\n $router->post('/moments', [Controllers\\Settings\\MomentController::class, 'store']);\n $router->put('/activity', [TeamActivityController::class, 'store']);\n\n // Team Domains.\n $router->get('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'all']);\n $router->post('/domains', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'create']);\n $router->delete('/domains/{teamDomain}', [Controllers\\Settings\\Teams\\TeamDomainsController::class, 'destroy']);\n });\n });\n });\n });\n\n // Integrations\n $router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {\n $router->post('/integrations', [IntegrationController::class, 'internal'])\n ->name('api.integrations.internal');\n $router->put('/integrations', [IntegrationController::class, 'toggleStatus'])\n ->name('api.integrations.toggle_status');\n $router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])\n ->name('api.integrations.delete');\n });\n\n $router->get('/integrations', [IntegrationController::class, 'all'])\n ->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)\n ->name('api.integrations.index');\n\n // Slack API for getting slack channels list\n $router->get('{notificationProvider}/channels', [Controllers\\NotificationProviderController::class, 'channels']);\n\n\n // Team actions. XXX: These all need moving out to their own controllers.\n $router->group(['prefix' => 'organizations'], static function (Router $router): void {\n $router->get('current', [TeamController::class, 'current']);\n\n $router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {\n $router->get('/', [TeamController::class, 'show']);\n\n $router->get('/categories', [TeamController::class, 'categories']);\n $router->get('/stages', [TeamController::class, 'stages']);\n $router->get('/users', [OrganizationMembersController::class, 'index'])\n ->name('organization.members.index');\n $router\n ->get('/users/download', [OrganizationMembersController::class, 'download'])\n ->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)\n ->name('organization.members.download');\n $router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])\n ->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)\n ->name('organization.licensed-roles.index');\n $router->get('/invitations', [TeamController::class, 'invitations']);\n $router->get('/groups', [TeamController::class, 'groups']);\n $router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])\n ->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])\n ->name('api.groups.delete');\n $router->get('/job-titles', [TeamController::class, 'jobTitles']);\n $router->get('/slugs', [TeamController::class, 'slugs']);\n $router->put('/api-token', [TeamController::class, 'generateApiToken'])\n ->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);\n $router->get('/key-moments', [MomentController::class, 'all']);\n });\n });\n\n // Internal Kiosk. This whole section will be moved out to a separate file\n $router\n ->prefix('kiosk')\n ->middleware('can:kiosk,' . User::class)\n ->group(static function (Router $router): void {\n // Partner actions.\n $router->get('/partners', [PartnersController::class, 'index']);\n\n // User actions.\n $router->post('/users/search', [SearchController::class, 'performBasicSearch']);\n\n // Team actions.\n $router->prefix('organizations')->group(static function (Router $router): void {\n $router->get('/', [OrganizationsController::class, 'show']);\n $router->put('/{team}', [OrganizationController::class, 'edit'])\n ->name('kiosk.organizations.edit');\n $router->get('/{team}/users', [OrganizationMembersController::class, 'index'])\n ->name('kiosk.organization.members.index');\n $router->get('onboardable', [OnboardController::class, 'available']);\n $router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);\n });\n\n // Automated reports\n // api/v1/kiosk/automated-reports\n $router->prefix('automated-reports')->group(static function (Router $router): void {\n $router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);\n $router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);\n $router->post('/filters', [AutomatedReportsController::class, 'getFilters']);\n $router->post('/', [AutomatedReportsController::class, 'create']);\n $router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);\n $router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);\n $router->get('/', [AutomatedReportsController::class, 'list']);\n $router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);\n $router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);\n $router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);\n $router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);\n });\n\n // Activity actions.\n $router->post('/activity/search', [SearchController::class, 'performActivitySearch']);\n $router->prefix('activity/{activity}')->group(static function (Router $router): void {\n $router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);\n $router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);\n $router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);\n $router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);\n $router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);\n $router->post('language', [KioskActivityController::class, 'updateLanguage']);\n $router->post('trim', [KioskActivityController::class, 'trimActivity']);\n $router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);\n $router->get('transcription', [KioskActivityController::class, 'getTranscriptions']);\n $router->post('speakers', [KioskActivityController::class, 'addSpeakers']);\n $router->post('crm-fields-fill', [KioskActivityController::class, 'crmFieldsFill']);\n $router->post('summary-highlights', [KioskActivityController::class, 'summaryHighlights']);\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->group(['prefix' => 'events'], static function (Router $router): void {\n $router->post('authenticate', [Controllers\\PusherController::class, 'auth'])\n ->name(Routes::WEBHOOK_PUSHER_AUTH);\n });\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n $router->get('/extensions/auth', [ExtensionController::class, 'authenticate']);\n $router->get('/call-token/{team}/{participant?}', [ClientTokenController::class, 'generateToken']);\n});\n\n$router->group(['prefix' => 'user'], static function (Router $router): void {\n $router->get('chrome-extension-authentication', [ExtensionController::class, 'authenticate']);\n});\n\n$router->group(['middleware' => ['auth:api'], 'prefix' => 'sms'], static function (Router $router): void {\n $router->get('/{phoneNumber}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messages']);\n $router->get('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'messagesList']);\n $router->post('/', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'send']);\n $router->delete('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'redact']);\n $router->put('/{activity}', [Controllers\\Telephony\\TextMessaging\\MessageController::class, 'resend']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/users/current', [UserController::class, 'current']);\n\n $router->get('/users/slug/{slug?}', [UserController::class, 'validateSlug']);\n\n // Profile Contact Information.\n $router->put(\n '/users/{user}/settings/profile',\n [Controllers\\Settings\\Profile\\ContactInformationController::class, 'update'],\n );\n\n $router->get('/users/{user}/email-sync-settings', [EmailSyncController::class, 'index']);\n $router->put('/users/{user}/email-sync-settings', [EmailSyncController::class, 'update']);\n\n // SMS Settings.\n $router->put('/users/{user}/settings/sms', [Controllers\\Settings\\Profile\\SmsController::class, 'update']);\n\n $router->get('/settings/timezones', [Controllers\\API\\Settings\\TimeZoneController::class, 'index'])\n ->name('settings.timezones.index');\n\n $router->put('/settings/user/deal-insights', [Controllers\\Settings\\Users\\UserSettingsController::class, 'update']);\n});\n\n$router->group(['prefix' => 'page', 'middleware' => ['api', 'auth:api']], static function () use ($router): void {\n $router->get('/playback/{activity}', [PlaybackController::class, 'show'])\n ->name('api.playback');\n $router->get('/on-demand', [OnDemandController::class, 'show'])\n ->name('api.activity.search');\n});\n\n$router->group(['prefix' => 'partners', 'middleware' => 'auth:partner-api'], static function () use ($router): void {\n $router->get('/', [PartnerController::class, 'me']);\n\n $router->group(['prefix' => 'organizations'], static function () use ($router): void {\n $router->get('/{team}', [PartnerController::class, 'fetchOrganization']);\n $router->post('/', [PartnerController::class, 'createOrganization']);\n });\n\n $router->group(['prefix' => 'groups'], static function () use ($router): void {\n $router->get('/{group}', [PartnerController::class, 'fetchGroup']);\n $router->post('/', [PartnerController::class, 'createGroup']);\n });\n\n $router->group(['prefix' => 'users'], static function () use ($router): void {\n $router->get('/{user}', [PartnerController::class, 'fetchUser']);\n $router->post('/', [PartnerController::class, 'createUser']);\n $router->delete('/{user}', [PartnerController::class, 'deactivateUser']);\n });\n\n $router->group(['prefix' => 'activities'], static function () use ($router): void {\n $router->get('/{activity}', [PartnerController::class, 'fetchActivity']);\n $router->get('/', [PartnerController::class, 'searchActivity']);\n });\n});\n\n$router->group(['prefix' => 'activity', 'middleware' => 'api'], static function () use ($router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function () use ($router): void {\n // Bulk delete\n $router->delete('/', [ActivityController::class, 'delete']);\n\n // Search.\n $router->get('/search', [ActivityController::class, 'search']);\n\n // All comments.\n $router->get('/comments', [ActivityController::class, 'fetchComments']);\n\n // Transcription AI\n $router->get('/{activity}/action-items', [Controllers\\API\\ActionItemsController::class, 'index']);\n $router->get('/{activity}/ai-call-scoring', [Controllers\\API\\AiCallScoring\\AiCallScoringController::class, 'index']);\n\n $router->get('/saved-search', [ActivityController::class, 'listActivitySearch'])->name('api.saved_search.index');\n $router->get('/saved-search/{search}', [ActivityController::class, 'fetchActivitySearch'])->name('api.saved_search.show');\n $router->post('/saved-search', [ActivityController::class, 'createActivitySearch'])->name('api.saved_search.create');\n $router->put('/saved-search/{search}', [ActivityController::class, 'updateActivitySearch'])->name('api.saved_search.update');\n $router->delete('/saved-search/{search}', [ActivityController::class, 'deleteActivitySearch'])->name('api.saved_search.delete');\n\n $router->post('/saved-search/{search}/nudges', [NudgeController::class, 'createAction'])->name('api.nudges.create');\n $router->put('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'updateAction'])->name('api.nudges.update');\n $router->delete('/saved-search/{search}/nudges/{nudge}', [NudgeController::class, 'deleteAction'])->name('api.nudges.delete');\n\n // Live (coaching).\n $router->get('/live', [ActivityController::class, 'live']);\n $router->get('/{activity}/cloudfront-s3-media-keys', [ActivityController::class, 'fetchCloudFrontS3MediaKeys']);\n\n $router->post('/softphone', [SoftphoneController::class, 'create']);\n $router->put('/softphone', [SoftphoneController::class, 'createCoachParticipant']);\n $router->post('/softphone/dial', [SoftphoneController::class, 'dial']);\n $router->get('/softphone/{activity}', [SoftphoneController::class, 'fetch']);\n $router->delete('/softphone/{activity}', [SoftphoneController::class, 'endCall']);\n\n $router->post('softphone/{activity}/message', [SoftphoneController::class, 'message']);\n });\n\n // Activity actions.\n $router->group(['prefix' => '{activity}', 'middleware' => ['auth:api']], static function (Router $router): void {\n // User only.\n $router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n // Messages endpoint.\n $router->post('/message', [MessageController::class, 'message']);\n\n // Organizer actions.\n $router->put('/', [ActivityController::class, 'update']);\n $router->get('/', [ActivityController::class, 'show']);\n $router->delete('/', [ActivityController::class, 'destroy']);\n\n $router->post('/recording', [ActivityController::class, 'createRecording']);\n $router->put('/recording', [ActivityController::class, 'updateRecording']);\n $router->delete('/recording', [ActivityController::class, 'stopRecording']);\n\n $router->post('/summarize', [ActivityController::class, 'summarize']);\n\n // Sales Activity Playback action.\n $router->put('/favorite', [ActivityController::class, 'favorite']);\n $router->delete('/favorite', [ActivityController::class, 'unfavorite']);\n\n $router->put('/private', [ActivityController::class, 'markAsPrivate']);\n $router->delete('/private', [ActivityController::class, 'markAsPublic']);\n\n $router->put('/notification', [ActivityController::class, 'notify']);\n $router->delete('/notification/{notification}', [ActivityController::class, 'unnotify']);\n\n // Activity comments\n $router->put('/comment/{comment}', [ActivityController::class, 'updateComment']);\n $router->post('/comment/{comment}', [ActivityController::class, 'replyComment']);\n $router->post('/comment', [ActivityController::class, 'comment']);\n $router->delete('/comment/{comment}', [ActivityController::class, 'deleteComment']);\n $router->put('/comment/{comment}/visibility', [ActivityController::class, 'updateCommentVisibility']);\n\n $router->get('/coaching-sections', [ActivityController::class, 'coachingSections']);\n\n $router->put('/coach', [ActivityController::class, 'putCoachingFeedback']);\n $router->delete('/coach/{coachingFeedback}', [ActivityController::class, 'deleteCoachingFeedback']);\n\n $router->post('/coach-request', [ActivityController::class, 'coachRequest']);\n $router->post('/share', [ActivityController::class, 'share']);\n\n $router->post('/playlists', [ActivityController::class, 'addToPlaylist'])\n ->name('playlists.add.activity');\n\n $router->post('/key-moment', [MomentController::class, 'store']);\n\n $router->put('/play', [ActivityController::class, 'play']);\n\n $router->get('/stats', [ActivityController::class, 'stats']);\n\n $router->get('/topic-triggers', [ActivityController::class, 'fetchActivityTopicTriggers']);\n\n $router->post('/topic-triggers', [ActivityController::class, 'createActivityTopicTriggers']);\n\n $router->get('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'getAutoScore']);\n $router->post('/auto-score', [Controllers\\API\\Scorecards\\AutoScoreController::class, 'updateAutoScore']);\n\n // Get Download link for an activity\n $router->get('/download', [Controllers\\PlaybackController::class, 'getDownloadUrl'])->name('getDownloadUrl');\n\n $router->post('/note', [ActivityController::class, 'note']);\n\n $router->post('/export', [ExportController::class, 'share'])\n ->middleware(['throttle:activity-export']);\n\n $router->post('/shareable-link', [ExportController::class, 'getShareableLink'])\n ->middleware(['throttle:activity-export-shareable-link']);\n\n $router->group(['prefix' => 'transcription'], static function (Router $router): void {\n $router->get('/', [TranscriptionController::class, 'getTranscriptionByActivity']);\n $router->get('/search', [TranscriptionController::class, 'searchAction']);\n $router->get('/download', [TranscriptionController::class, 'downloadTranscriptionByActivity'])\n ->middleware(['throttle:transcription-download']);\n $router->put('/attribution-flip/{participantA}/{participantB}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionFlip']);\n $router->put('/attribution-change/{participant}', [Controllers\\API\\TranscriptionController::class, 'speakerAttributionChange']);\n $router->get('/translation', [TranslationController::class, 'getTranslation']);\n });\n });\n });\n});\n\n$router->group(['middleware' => ['auth:api']], static function () use ($router) {\n $router->put('/subscription/{morphType}', [SubscriptionController::class, 'subscribe']);\n $router->delete('/subscription/{morphType}', [SubscriptionController::class, 'unsubscribe']);\n});\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlists', [PlaylistController::class, 'all'])->name('api.playlists.all');\n $router->get('/playlists/user', [PlaylistController::class, 'userPlaylists'])\n ->name('api.playlists.userPlaylists');\n $router->post('/playlists', [PlaylistController::class, 'store'])->name('api.playlists.store');\n\n $router->post('/playlists/{playlist}/share', [PlaylistController::class, 'share'])\n ->name('api.playlist.create.share');\n $router->get('/playlists/{playlist}/activities', [PlaylistController::class, 'activities'])\n ->name('api.playlist.activities');\n $router->delete('/playlists/{playlist}/shares/{playlistShare}', [PlaylistController::class, 'unshare'])\n ->name('api.playlist.unshare');\n $router->get('/playlists/{playlist}/shares', [PlaylistController::class, 'shares'])\n ->name('api.playlist.get.shares');\n $router->post('/playlists/{playlist}/lock', [PlaylistController::class, 'lock'])->name('api.playlist.lock');\n $router->post('/playlists/{playlist}/unlock', [PlaylistController::class, 'unlock'])\n ->name('api.playlist.unlock');\n $router->get(\n '/playlists/{playlist}/available-playlists',\n [PlaylistController::class, 'availablePlaylistsToMoveTo'],\n )->name('api.playlist.available');\n $router->put('/playlists/{playlist}', [PlaylistController::class, 'update'])->name('api.playlist.update');\n $router->delete('/playlists/{playlist}', [PlaylistController::class, 'destroy'])\n ->name('api.playlist.destroy');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'updatePlaylistTrack'],\n )->name('api.playlist.updatePlaylistTrack');\n $router->put(\n '/playlists/{playlist}/tracks/{playlistActivity}/move',\n [PlaylistController::class, 'moveToPlaylist'],\n )->name('api.playlist.moveToPlaylist');\n $router->delete(\n '/playlists/{playlist}/tracks/{playlistActivity}',\n [PlaylistController::class, 'removeFromPlaylist'],\n )->name('api.playlist.removeFromPlaylist');\n});\n\n$router->group(\n ['prefix' => '/opportunity/{opportunity}', 'middleware' => ['api']],\n static function (Router $router): void {\n // Opportunity comments\n $router->group(['prefix' => '/comment', 'middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/', [CommentsController::class, 'fetchComments']);\n $router->post('/', [CommentsController::class, 'comment']);\n\n $router->group(['prefix' => '{comment}'], static function (Router $router): void {\n $router->put('/', [CommentsController::class, 'updateComment']);\n $router->post('/', [CommentsController::class, 'replyComment']);\n $router->delete('/', [CommentsController::class, 'deleteComment']);\n $router->put('/visibility', [CommentsController::class, 'updateCommentVisibility']);\n });\n });\n },\n);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->get('/playlist/{activity}.m3u8', [Controllers\\API\\PlaybackController::class, 'playlist']);\n $router->get('/media/{track}.m3u8', [Controllers\\API\\PlaybackController::class, 'media']);\n});\n\n$router->group(['middleware' => ['api']], static function (Router $router): void {\n // SSO email query.\n $router->get('/auth/sso/login', [Controllers\\API\\SsoController::class, 'ssoLogin'])->name('ssoLogin');\n});\n\n$router->get('/mobile-settings', [MobileSettingsController::class, 'getAll']);\n\n$router->put('/mobile-settings', [MobileSettingsController::class, 'updateSettings'])\n ->middleware(['auth:api', 'can:kiosk,' . User::class])\n ->name('api.kiosk.mobile_settings.update');\n\n// Ask Jiminny on deal level\n$router->get('deals/{opportunity}/ask-jiminny', [Controllers\\API\\DealLevelPromptsController::class, 'index'])\n ->middleware(['api', 'auth:api'])\n ->name('api.deals.ask-jiminny');\n\n$router->get('get-access-token/{provider?}', [SocialController::class, 'getAccessToken'])\n ->name('api.get_access_token')\n ->whereIn('provider', [SocialAccount::PROVIDER_HUBSPOT]);\n\n$router->group(['middleware' => ['auth:api']], static function (Router $router): void {\n $router->post('single-claim-token/{provider?}', [SocialController::class, 'getSingleUseClaim'])\n ->name('api.singe-claim-token');\n});\n\n$router->post('deauthorize-zoom-app', [SocialController::class, 'deauthorizeZoomApp'])\n ->name('api.deauthorize-zoom-app.recall-ai');\n\n$router->put('/conferences/{activity}/consent', [ConferencesOptInOutController::class, 'storeConsent'])\n ->middleware(['throttle:conference-consent'])\n ->name('api.conferences.store-consent');","role_description":"text entry area","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Execute","depth":4,"bounds":{"left":0.37367022,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Explain Plan","depth":4,"bounds":{"left":0.38231382,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Browse Query History","depth":4,"bounds":{"left":0.3932846,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"View Parameters","depth":4,"bounds":{"left":0.4019282,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Open Query Execution Settings…","depth":4,"bounds":{"left":0.4105718,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"In-Editor Results","depth":4,"bounds":{"left":0.42154256,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Tx: Auto","depth":4,"bounds":{"left":0.4325133,"top":0.123703115,"width":0.024268618,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Cancel Running Statements","depth":4,"bounds":{"left":0.45910904,"top":0.123703115,"width":0.008643617,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":false,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Playground","depth":4,"bounds":{"left":0.47007978,"top":0.123703115,"width":0.029587766,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"jiminny","depth":4,"bounds":{"left":0.59375,"top":0.123703115,"width":0.02825798,"height":0.01915403},"on_screen":true,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Code changed:","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.042220745,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Hide","depth":4,"bounds":{"left":0.27027926,"top":1.0,"width":0.008643617,"height":0.0},"on_screen":false,"role_description":"button","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
8143755747639054550
|
2696331441572409035
|
click
|
accessibility
|
NULL
|
Project: faVsco.js, menu
pipedrive-sdk-poc, menu
S Project: faVsco.js, menu
pipedrive-sdk-poc, menu
Start Listening for PHP Debug Connections
AskJiminnyReportActivityServiceTest
Run 'AskJiminnyReportActivityServiceTest'
Debug 'AskJiminnyReportActivityServiceTest'
More Actions
JetBrains AI
Search Everywhere
IDE and Project Settings
Show Replace Field
Search History
organiza
New Line
Match Case
Words
Regex
Replace History
Replace
New Line
Preserve case
1/10
Previous Occurrence
Next Occurrence
Filter Search Results
Open in Window, Multiple Cursors
Click to highlight
Close
Sync Changes
Hide This Notification
Code changed:
Hide
Built-in Preview
Chrome
Firefox
Safari
2
5
3
16
Previous Highlighted Error
Next Highlighted Error
<?php
declare(strict_types=1);
/**
* API routes.
*
* @see \Jiminny\Providers\RouteServiceProvider
*
* @var Router $router
*/
use Illuminate\Routing\Router;
use Illuminate\Support\Collection;
use Jiminny\Component\DealInsights\Forecast\Forecast;
use Jiminny\Component\Router\Routes;
use Jiminny\Contracts\Acl\PermissionEnum;
use Jiminny\Http\Controllers;
use Jiminny\Http\Controllers\API\ActivityController;
use Jiminny\Http\Controllers\API\AiCrmNotesController;
use Jiminny\Http\Controllers\API\ClientTokenController;
use Jiminny\Http\Controllers\API\CrmController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAiCallScoringController;
use Jiminny\Http\Controllers\ConferencesOptInOutController;
use Jiminny\Http\Controllers\API\DealRiskController;
use Jiminny\Http\Controllers\API\InstantMeetingController;
use Jiminny\Http\Controllers\API\LanguageController;
use Jiminny\Http\Controllers\API\LiveFeedController;
use Jiminny\Http\Controllers\API\MeetingsController;
use Jiminny\Http\Controllers\API\MessageController;
use Jiminny\Http\Controllers\API\MetadataController;
use Jiminny\Http\Controllers\API\MobileSettingsController;
use Jiminny\Http\Controllers\API\MomentController;
use Jiminny\Http\Controllers\API\NudgeController;
use Jiminny\Http\Controllers\API\NumberAllocatorController;
use Jiminny\Http\Controllers\API\Opportunity\CommentsController;
use Jiminny\Http\Controllers\API\OrganizationLicensesController;
use Jiminny\Http\Controllers\API\OrganizationMembersController;
use Jiminny\Http\Controllers\API\OrganizationRetentionPolicyController;
use Jiminny\Http\Controllers\API\OrganizationRolesController;
use Jiminny\Http\Controllers\API\OrganizationSyncController;
use Jiminny\Http\Controllers\API\Page\OnDemandController;
use Jiminny\Http\Controllers\API\Page\PlaybackController;
use Jiminny\Http\Controllers\API\PartnerController;
use Jiminny\Http\Controllers\API\PhoneNumberController;
use Jiminny\Http\Controllers\API\PlaylistController;
use Jiminny\Http\Controllers\API\Settings\EmailSyncController;
use Jiminny\Http\Controllers\API\SidekickController;
use Jiminny\Http\Controllers\API\SoftphoneController;
use Jiminny\Http\Controllers\API\SubscriptionController;
use Jiminny\Http\Controllers\API\TeamAiAutomationController;
use Jiminny\Http\Controllers\API\TeamAiContextController;
use Jiminny\Http\Controllers\API\TeamController;
use Jiminny\Http\Controllers\API\TeamInsights\ActivityStatsController;
use Jiminny\Http\Controllers\API\TeamInsights\CoachingFeedbacksController;
use Jiminny\Http\Controllers\API\TeamInsights\DashboardController;
use Jiminny\Http\Controllers\API\TeamInsights\EngagementController;
use Jiminny\Http\Controllers\API\TeamInsights\TeamInsightsAutomatedCallScoresController;
use Jiminny\Http\Controllers\API\TeamInsights\ThemeTopicsController;
use Jiminny\Http\Controllers\API\TeamInsights\TopicsInDealsController;
use Jiminny\Http\Controllers\API\TeamInsightsController;
use Jiminny\Http\Controllers\API\Themes\ThemeController;
use Jiminny\Http\Controllers\API\Themes\TopicController;
use Jiminny\Http\Controllers\API\Themes\TopicTriggerController;
use Jiminny\Http\Controllers\API\TranscriptionController;
use Jiminny\Http\Controllers\API\TranslationController;
use Jiminny\Http\Controllers\API\UserAutomatedReports\UserAutomatedReportsController;
use Jiminny\Http\Controllers\API\UserController;
use Jiminny\Http\Controllers\API\VocabularyController;
use Jiminny\Http\Controllers\Auth\ExtensionController;
use Jiminny\Http\Controllers\Auth\SocialController;
use Jiminny\Http\Controllers\ExportController;
use Jiminny\Http\Controllers\Kiosk\ActivityController as KioskActivityController;
use Jiminny\Http\Controllers\Kiosk\AutomatedReportsController;
use Jiminny\Http\Controllers\Kiosk\MediaPipelineController;
use Jiminny\Http\Controllers\Kiosk\OrganizationsController;
use Jiminny\Http\Controllers\Kiosk\PartnersController;
use Jiminny\Http\Controllers\Kiosk\SearchController;
use Jiminny\Http\Controllers\Kiosk\Teams\OnboardController;
use Jiminny\Http\Controllers\NotificationController;
use Jiminny\Http\Controllers\Settings\GroupController;
use Jiminny\Http\Controllers\Settings\JobTitleController;
use Jiminny\Http\Controllers\Settings\PlaybookCategoryController;
use Jiminny\Http\Controllers\Settings\PlaybookController;
use Jiminny\Http\Controllers\Settings\Teams\IntegrationController;
use Jiminny\Http\Controllers\Settings\Teams\InvitationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamActivityController;
use Jiminny\Http\Controllers\Settings\Teams\TeamCoachingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamConferenceSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamController as OrganizationController;
use Jiminny\Http\Controllers\Settings\Teams\TeamDealInsightsSettingController;
use Jiminny\Http\Controllers\Settings\Teams\TeamMemberController;
use Jiminny\Http\Controllers\Settings\Teams\TeamPhotoController;
use Jiminny\Http\Controllers\Settings\Teams\TeamRecordingSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSettingsController;
use Jiminny\Http\Controllers\Settings\Teams\TeamSoftphoneSettingsController;
use Jiminny\Http\Controllers\TeamSetupController;
use Jiminny\Models;
use Jiminny\Models\PlaybackTheme;
use Jiminny\Models\SocialAccount;
use Jiminny\Models\User;
use Jiminny\Models\Vocabulary;
use Jiminny\Repositories;
use Jiminny\Mcp\Servers\JiminnyServer;
use Laravel\Mcp\Facades\Mcp;
// mcp.audit MUST stay outermost so its $next($request) call wraps the auth
// and tier guards. Otherwise 401 (auth:api) and 403 (mcp.tier) rejections
// short-circuit before McpAuditMiddleware::handle ever runs and we lose
// audit rows for exactly the requests the security log most needs to capture.
// McpAuditMiddleware::writeAuditRow null-checks $request->user(), so writing
// pre-auth is safe.
Mcp::web('/mcp', JiminnyServer::class)
->middleware(['mcp.audit', 'auth:api', 'mcp.tier']);
$router->group(['middleware' => ['auth:api']], static function (Router $router): void {
$router->get('/metadata/extension-app', [MetadataController::class, 'extension']);
$router->get('/', [NumberAllocatorController::class, 'generate']);
$router->delete('/key-moment/{activityMoment}', [MomentController::class, 'destroy']);
$router->post('/instant-meeting/start', [InstantMeetingController::class, 'postRequestBotAtUrl'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('instant-meeting.start');
// Meeting creation endpoint for Outlook add-in
$router->post('/meetings', [MeetingsController::class, 'create'])
->middleware(['permission:' . PermissionEnum::RECORD_MEETING->value])
->name('meetings.create');
// Number provisioning and search.
$router->get('/phone-numbers', [NumberAllocatorController::class, 'generate']);
$router->get('/phone-numbers/{number}', [PhoneNumberController::class, 'number']);
$router->group(['prefix' => 'deal-insights'], static function (Router $router): void {
$router->get('/forecast', [
Controllers\API\DealInsights\DealsController::class,
'getForecast',
])->defaults('period', Forecast::PERIOD_QUARTER);
$router->get('/deals/{stage?}', [
Controllers\API\DealInsights\DealsController::class,
'list',
])->defaults('stage', \Jiminny\Component\DealInsights\CriteriaInterface::STAGE_ALL);
$router->get('/details/details-daily/{opportunityId}/{date}', [
Controllers\API\DealInsights\DealsController::class,
'detailsDaily',
]);
$router->put('/deals/{opportunity}/edit-fields', [
Controllers\API\DealInsights\DealsController::class,
'updateFields',
]);
$router->get('/externalId/{dealId}', [
Controllers\API\DealInsights\DealsController::class,
'externalDealId',
]);
$router->put('/dealRisk/{dealRisk}', [DealRiskController::class, 'toggleActivity']);
});
$router->get('/team-insights/users', [TeamInsightsController::class, 'fetchUsers'])
->name('team_insights.users');
$router->get('/team-insights/dashboard', [DashboardController::class, 'fetch'])
->name('team_insights.dashboard');
// Team Insights - Coaching Feedbacks
$router->get('/team-insights/coaching-feedbacks-over-time', [CoachingFeedbacksController::class, 'fetch'])
->name('team_insights.coaching_feedbacks_over_time');
$router
->get('/team-insights/coaching-feedbacks-over-time/download', [CoachingFeedbacksController::class, 'download'])
->name('team_insights.coaching_feedbacks_over_time.download');
$router->get(
'/team-insights/coaching-feedbacks-over-time/drill-down',
[CoachingFeedbacksController::class, 'drillDown'],
)->name('team_insights.coaching_feedbacks_over_time.drill_down');
// Team Insights - Automated Call Scores
$router->get(
'/team-insights/automated-call-scores-over-time',
[TeamInsightsAutomatedCallScoresController::class, 'index'],
)->name('team_insights.automated_call_scores_over_time.index');
$router->get(
'/team-insights/automated-call-scores-over-time/drill-down',
[TeamInsightsAutomatedCallScoresController::class, 'show'],
)->name('team_insights.automated_call_scores_over_time.show');
// Team Insights - AI Call Scoring
$router->get(
'/team-insights/ai-call-scoring-over-time',
[TeamInsightsAiCallScoringController::class, 'index'],
)->name('team_insights.ai_call_scoring_over_time.index');
$router->get(
'/team-insights/ai-call-scoring-over-time/drill-down',
[TeamInsightsAiCallScoringController::class, 'show'],
)->name('team_insights.ai_call_scoring_over_time.show');
$router->get('/team-insights/engagement', [ActivityStatsController::class, 'fetch'])
->name('team_insights.engagement');
$router->get('/team-insights/engagement/drill-down/{engagementType}', [ActivityStatsController::class, 'drillDown'])
->name('team_insights.engagement.drill_down');
$router->get('/team-insights/topics', [ThemeTopicsController::class, 'getTopics'])
->name('team_insights.topics.index');
$router->get('/team-insights/topics/{topic}', [ThemeTopicsController::class, 'fetch'])
->name('team_insights.topics.show');
$router->get('/team-insights/topics/{topic}/drill-down', [ThemeTopicsController::class, 'drillDown'])
->name('team_insights.topics.drill_down');
$router->group(['prefix' => 'team-insights'], static function (Router $router): void {
$router->group(['prefix' => 'conversations'], static function (Router $router): void {
$router->get('/', [
Controllers\API\TeamInsights\ConversationsController::class,
'fetch',
]);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{activityChannel}/{drillDownType}', [
Controllers\API\TeamInsights\ConversationsController::class,
'drillDown',
])
->where(
'activityChannel',
Collection::make(Models\Activity::CHANNELS)->join('|'),
)
->where(
'drillDownType',
Collection::make(Repositories\TeamInsightsRepository::CONVERSATION_DRILLDOWNS)
->join('|'),
);
});
});
$router->group(['prefix' => 'coaching'], static function (Router $router): void {
$router->get('/', [EngagementController::class, 'fetch']);
$router->group(['prefix' => 'drill-down'], static function (Router $router): void {
$router
->get('/{coachingType}/{drillDownType?}', [EngagementController::class, 'drillDown'])
->where(
'coachingType',
Collection::make(EngagementController::COACHING_TYPES)->join('|'),
)
->where(
'drillDownType',
Collection::make(EngagementController::COACHING_DRILLDOWNS)->join('|'),
);
});
});
});
$router->get('/topics-in-deals', [TopicsInDealsController::class, 'topics'])
->name('topics_in_deals.topics');
$router->get('/topics-in-deals/topic-triggers', [TopicsInDealsController::class, 'topicTriggers'])
->name('topics_in_deals.topic_triggers');
$router->get('/compare-topics-in-deals', [TopicsInDealsController::class, 'comparison'])
->name('topics_in_deals.comparison');
// CRM actions.
$router->group(['prefix' => 'crm'], static function (Router $router): void {
$router->get('/search', [CrmController::class, 'search']);
$router->get('/opportunity', [CrmController::class, 'opportunities']);
$router->get('/customers', [CrmController::class, 'customers']);
$router->get('/accounts', [CrmController::class, 'accounts']);
$router->get('/contacts', [CrmController::class, 'contacts']);
$router->get('/leads', [CrmController::class, 'leads']);
$router->get('/tasks', [CrmController::class, 'activities']);
$router->get('/layouts', [CrmController::class, 'layouts']);
});
// AI CRM notes.
$router->group(['prefix' => 'ai-crm-notes'], static function (Router $router): void {
$router->get('/activity/{activity}', [AiCrmNotesController::class, 'getByActivity']);
$router->post('/activity/{activity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByActivity']);
$router->post('/activity/{activity}/discard', [AiCrmNotesController::class, 'discardByActivity']);
$router->get('/deal/{opportunity}', [AiCrmNotesController::class, 'getByOpportunity']);
$router->post('/deal/{opportunity}/log-to-crm', [AiCrmNotesController::class, 'logToCrmByOpportunity']);
$router->post('/deal/{opportunity}/discard', [AiCrmNotesController::class, 'discardByOpportunity']);
});
// Automated Reports
$router->post('/automated-reports/interest', [UserAutomatedReportsController::class, 'trackInterest']);
$router->group(
[
'prefix' => 'automated-reports',
'middleware' => 'can:canAccessAiReports,' . User::class,
],
static function (Router $router): void {
$router->get('/', [UserAutomatedReportsController::class, 'list']);
$router->delete('/{uuid}', [UserAutomatedReportsController::class, 'delete']);
}
);
// Setup New Team / Trial
$router->get('/features', [TeamSetupController::class, 'features']);
$router->get('/tiers', [TeamSetupController::class, 'tiers']);
$router->get('/calendars', [TeamSetupController::class, 'calendars']);
$router->get('/crm-services', [TeamSetupController::class, 'crmServices']);
$router->get('/connect-providers', [TeamSetupController::class, 'connectProviders']);
$router->get('/integration-app-token', [TeamSetupController::class, 'integrationAppToken']);
$router->post('/integration-app-connect', [TeamSetupController::class, 'integrationAppConnect']);
// Notifications
$router->get('/notifications/recent', [NotificationController::class, 'notifications']);
$router->put('/notifications/read', [NotificationController::class, 'markAsRead']);
$router->put('/notifications/read-multiple', [NotificationController::class, 'markMultipleAsRead']);
$router->put('/notifications/read-all', [NotificationController::class, 'markAllAsRead']);
// Live feed
$router->get('/live-feed', [LiveFeedController::class, 'liveFeedItems']);
// Languages
$router->get('/languages', [LanguageController::class, 'list']);
// The whole settings section will be moved out in a separate file
$router->group(['prefix' => '/settings'], static function (Router $router): void {
$router->group(['prefix' => '/organizations'], static function (Router $router): void {
$router
->middleware(['can:kiosk,' . User::class])
->post('/', [OrganizationController::class, 'store'])
->name('kiosk.organizations.store');
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router) {
// Sync fields and team metadata
$router->post('/fields/sync', [OrganizationSyncController::class, 'index'])
->name('api.sync.fields');
// Conference Preferences.
$router->post('/bot-avatar', [TeamPhotoController::class, 'updateBotAvatar'])
->name('update.bot.avatar');
// Roles.
$router->get('/roles', [OrganizationRolesController::class, 'index'])
->name('api.roles.index');
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_RETENTION_POLICY->value],
static function (Router $router): void {
$router->get('/retention-policy', [OrganizationRetentionPolicyController::class, 'index'])
->name('api.retention_policy.index');
$router->post('/retention-policy', [OrganizationRetentionPolicyController::class, 'store'])
->name('api.retention_policy.update');
}
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_USERS->value],
static function (Router $router): void {
// Invitations.
$router->get('/invitations', [InvitationController::class, 'index'])
->name('api.invitations.index');
$router->post('/invitations/{invitation}', [InvitationController::class, 'resend'])
->name('api.invitations.resend');
$router->delete('/invitations/{invitation}', [InvitationController::class, 'destroy'])
->name('api.invitations.delete');
$router->post('/invitations', [InvitationController::class, 'store'])
->name('api.invitations.store');
},
);
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_TEAM->value],
static function (Router $router): void {
// Groups.
$router->post('/groups', [GroupController::class, 'store']);
$router->get('/groups/{group}', [GroupController::class, 'show']);
$router->put('/groups/{group}', [GroupController::class, 'update']);
$router->put('/group/{group}/scope', [GroupController::class, 'updateGroupScope']);
$router->post('/group/{group}/dealRisks', [DealRiskController::class, 'updateSettings']);
// Sidekick settings
$router->group(
['middleware' => 'permission:' . PermissionEnum::MANAGE_SIDEKICK->value],
static function (Router $router): void {
$router->get('/sidekick', [SidekickController::class, 'getSidekickSettings']);
$router
->post(
'/group/{group}/sidekick',
[SidekickController::class, 'setSidekickSettings'],
)
->middleware(['can:updateSidekickSettings,group'])
->name('api.sidekick_settings.update');
$router
->post('/sidekick', [SidekickController::class, 'setSidekickSettings'])
->middleware(['permission:' . PermissionEnum::UPDATE_ALL_SIDEKICK_SETTINGS->value])
->name('api.sidekick_settings.update_all');
},
);
$router->get('/deal-insights', [TeamDealInsightsSettingController::class, 'index']);
$router->patch('/deal-insights', [TeamDealInsightsSettingController::class, 'update']);
// CRM Layout Management
$router->group(['prefix' => 'layouts'], static function (Router $router): void {
$router->get(
'/{type}',
[Controllers\API\LayoutManagementController::class, 'list'],
)->name('layouts.list');
$router->put(
'/{layout}',
[Controllers\API\LayoutManagementController::class, 'update'],
)->name('layouts.update');
});
// Users.
$router->put('/users/{user}', [TeamMemberController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.update');
$router->delete('/users/{user}', [TeamMemberController::class, 'deactivate'])
->middleware(['permission:' . PermissionEnum::MANAGE_USERS->value])
->name('api.users.deactivate');
$router->group(
[
'prefix' => 'vocabulary',
'middleware' => 'can:manage,' . Vocabulary::class,
],
static function (Router $router): void {
$router
->get('/', [VocabularyController::class, 'list'])
->name('api.vocabulary.index');
$router
->post('/', [VocabularyController::class, 'update'])
->name('api.vocabulary.create');
$router->group(['prefix' => '{vocabulary}'], static function (Router $router): void {
$router
->put('/', [VocabularyController::class, 'update'])
->middleware('can:update,vocabulary')
->name('api.vocabulary.update');
$router
->delete('/', [VocabularyController::class, 'delete'])
->middleware('can:delete,vocabulary')
->name('api.vocabulary.delete');
});
},
);
$router->group(['prefix' => 'ai-context'], static function (Router $router): void {
$router->get('/', [TeamAiContextController::class, 'index'])
->name('api.ai_context.get');
$router->post('/', [TeamAiContextController::class, 'store'])
->name('api.ai_context.store');
});
$router->group(['prefix' => 'ai-automation'], static function (Router $router): void {
$router->post('/fields/test-prompt', [TeamAiAutomationController::class, 'testCrmAiPrompt'])
->name('api.automation.templates.fields.test-prompt');
// List CRM fields per object type
$router->get('/fields/{objectType}', [TeamAiAutomationController::class, 'fields'])
->name('api.automation.fields');
// List DealStages fields per object type
$router->get('/stages', [TeamAiAutomationController::class, 'stages'])
->name('api.automation.stages');
// Create CRM AI template
$router->post('/templates', [TeamAiAutomationController::class, 'createTemplate'])
->name('api.automation.templates.create');
// Export CRM updates
$router->post('/templates/export-crm-updates', [TeamAiAutomationController::class, 'exportTemplateCrmUpdates'])
->name('api.automation.templates.export-crm-updates');
// Update CRM AI template
$router->put('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'updateTemplate'])
->name('api.automation.templates.update');
// Delete CRM AI template
$router->delete('/templates/{crmTemplate}', [TeamAiAutomationController::class, 'deleteTemplate'])
->name('api.automation.templates.delete');
// List all CRM AI templates
$router->get('/templates', [TeamAiAutomationController::class, 'templates'])
->name('api.automation.templates.list');
// Create CRM AI template field
$router->post('/templates/{crmTemplate}/fields', [TeamAiAutomationController::class, 'createField'])
->name('api.automation.templates.fields.create');
// Update CRM AI template field
$router->put('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'updateField'])
->name('api.automation.templates.fields.update');
// Delete CRM AI template field
$router->delete('/templates/{crmTemplate}/fields/{crmTemplateField}', [TeamAiAutomationController::class, 'deleteField'])
->name('api.automation.templates.fields.delete');
});
$router->group(['prefix' => 'ai-call-scoring'], static function (Router $router): void {
// Create AI scorecard
$router->post('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'createAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.create');
// Update AI scorecard
$router->put('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'updateAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.update');
// Delete AI scorecard
$router->delete('/ai-scorecards/{aiScorecard}', [Controllers\API\AiCallScoring\AiScorecardController::class, 'deleteAiScorecard'])
->name('api.ai-call-scoring.ai-scorecards.delete');
// List all AI scorecards
$router->get('/ai-scorecards', [Controllers\API\AiCallScoring\AiScorecardController::class, 'aiScorecards'])
->name('api.ai-call-scoring.ai-scorecards.list');
// Test AI scorecard prompt
$router->post(
'/ai-scorecards/{aiScorecard}/test-prompt',
[
Controllers\API\AiCallScoring\AiScorecardController::class,
'testAiScorecardPrompt',
]
)
->name('api.ai-call-scoring.ai-scorecards.test-prompt');
// Create AI Scorecard rule
$router->post('/ai-scorecards/{aiScorecard}/ai-scorecard-rules', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'createRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.create');
// Update AI Scorecard rule
$router->put('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'updateAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.update');
// Delete AI Scorecard rule
$router->delete('/ai-scorecards/{aiScorecard}/ai-scorecard-rules/{aiScorecardRule}', [Controllers\API\AiCallScoring\AiScorecardRuleController::class, 'deleteAiScorecardRule'])
->name('api.ai-call-scoring.ai-scorecards.ai-scorecard-rules.delete');
});
// Theme, topics, triggers
$router->get('/themes', [ThemeController::class, 'list']);
$router
->post('/themes', [ThemeController::class, 'updateTheme'])
->middleware('can:manage,' . PlaybackTheme::class)
->name('api.theme.create');
$router->group(
[
'prefix' => 'theme/{theme}',
'middleware' => 'can:update,theme',
],
static function (Router $router): void {
$router
->put('/', [ThemeController::class, 'updateTheme'])
->name('api.theme.update');
$router
->delete('/', [ThemeController::class, 'deleteTheme'])
->middleware('can:delete,theme')
->name('api.theme.delete');
$router
->post('/topics', [TopicController::class, 'updateTopic'])
->middleware('can:createTopic,theme')
->name('api.topic.create');
$router->group(
[
'prefix' => 'topic/{topic}',
'middleware' => 'can:update,topic',
],
static function (Router $router): void {
$router
->put('/', [TopicController::class, 'updateTopic'])
->name('api.topic.update');
$router
->delete('/', [TopicController::class, 'deleteTopic'])
->middleware('can:delete,topic')
->name('api.topic.delete');
$router
->post('/triggers', [TopicTriggerController::class, 'updateTrigger'])
->middleware('can:createTrigger,topic')
->name('api.topic_trigger.create');
$router->group(
[
'prefix' => 'trigger/{topicTrigger}',
'middleware' => 'can:update,topicTrigger',
],
static function (Router $router): void {
$router
->put('/', [TopicTriggerController::class, 'updateTrigger'])
->name('api.topic_trigger.update');
$router
->delete('/', [TopicTriggerController::class, 'deleteTrigger'])
->middleware('can:delete,topicTrigger')
->name('api.topic_trigger.delete');
},
);
},
);
},
);
$router->post('/themes/import', [Controllers\API\Themes\ImportTopicTriggerController::class, 'importThemes']);
$router->get('/themes/export', [Controllers\API\Themes\ExportTopicTriggerController::class, 'exportThemes']);
// Auto-scoring
$router->group(['prefix' => '/scorecards'], static function (Router $router) {
$router->get('/', [Controllers\API\Scorecards\ScorecardController::class, 'list']);
$router->post('/', [Controllers\API\Scorecards\ScorecardController::class, 'create']);
$router->delete('/{scorecard}', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/validate-name', [
Controllers\API\Scorecards\ScorecardController::class,
'validateNameExists',
]);
$router->get('/enabled-scorecard', [
Controllers\API\Scorecards\ScorecardController::class,
'getEnabledScorecard',
]);
$router->get('/affected-scorecards', [
Controllers\API\Scorecards\ScorecardController::class,
'getAffectedScorecards',
]);
$router->group(['prefix' => '/{scorecard}'], static function (Router $router) {
$router->put('/', [
Controllers\API\Scorecards\ScorecardController::class,
'update',
]);
$router->delete('/', [
Controllers\API\Scorecards\ScorecardController::class,
'delete',
]);
$router->post('/rules', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'create',
]);
$router->post('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'update',
]);
$router->delete('/rules/{scorecardRule}', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'delete',
]);
$router->post('/rules/{scorecardRule}/update-order', [
Controllers\API\Scorecards\ScorecardRuleController::class,
'updateOrder',
]);
});
});
// Coaching Playbook.
Route::get('/playbooks', [PlaybookController::class, 'all']);
Route::get('/playbooksTree', [PlaybookController::class, 'tree']);
Route::put('/playbooks/{playbook}', [PlaybookController::class, 'update']);
Route::post('/playbooks', [PlaybookController::class, 'store']);
Route::delete('/playbooks/{playbook}', [PlaybookController::class, 'destroy']);
Route::prefix('/playbooks/{playbook}')->group(static function () {
// Playbook Categories.
Route::get('/categories', [PlaybookCategoryController::class, 'all']);
Route::put('/categories/sequence', [PlaybookCategoryController::class, 'sequence']); // Respect order.
Route::put('/categories/{category}', [PlaybookCategoryController::class, 'update']);
Route::post('/categories', [PlaybookCategoryController::class, 'store']);
Route::post('/test-prompt', [PlaybookController::class, 'testAiActivityTypePrompt']);
Route::post('/prompt-suggestion', [PlaybookController::class, 'getPromptSuggestion']);
Route::delete('/categories/{category}', [PlaybookCategoryController::class, 'destroy']);
Route::prefix('/categories/{category}')->group(static function () {
// Coaching Sections
Route::get('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'all']);
Route::put('/coaching-section/sequence', [Controllers\Settings\Coaching\SectionsController::class, 'sequence']);
Route::put('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'update']);
Route::post('/coaching-section', [Controllers\Settings\Coaching\SectionsController::class, 'store']);
Route::delete('/coaching-section/{coachingSection}', [Controllers\Settings\Coaching\SectionsController::class, 'destroy']);
Route::prefix('coaching-section/{coachingSection}')->group(static function () {
// Coaching Section Criteria
Route::get('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'all']);
Route::put('/coaching-section-criterion/sequence', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'sequence']);
Route::put('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'update']);
Route::post('/coaching-section-criterion', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'store']);
Route::delete('/coaching-section-criterion/{coachingSectionCriterion}', [Controllers\Settings\Coaching\SectionCriteriaController::class, 'destroy']);
});
});
});
},
);
$router->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value])
->group(static function (Router $router): void {
// Job Titles.
$router->get('/job-titles', [JobTitleController::class, 'all']);
$router->put('/job-titles/{job}', [JobTitleController::class, 'update']);
$router->post('/job-titles', [JobTitleController::class, 'store']);
$router->delete('/job-titles/{job}', [JobTitleController::class, 'destroy']);
// Team Settings.
$router->put('/', [TeamSettingsController::class, 'update']);
$router->put('/notifications', [TeamSettingsController::class, 'updateNotifications']);
$router->put('/team-conference', [TeamConferenceSettingsController::class, 'update']);
$router->put('/team-coaching', [TeamCoachingSettingsController::class, 'update']);
$router->put('/team-softphone', [TeamSoftphoneSettingsController::class, 'update']);
$router->put('/owner', [Controllers\Settings\Teams\OrganizationSettingsController::class, 'updateOwner']);
$router->put('/team-recording', [TeamRecordingSettingsController::class, 'update'])
->middleware(['permission:' . PermissionEnum::MANAGE_RECORDING->value]);
// Key Moments.
$router->get('/moments/{moment}', [Controllers\Settings\MomentController::class, 'show']);
$router->put('/moments/{moment}', [Controllers\Settings\MomentController::class, 'update']);
$router->post('/moments', [Controllers\Settings\MomentController::class, 'store']);
$router->put('/activity', [TeamActivityController::class, 'store']);
// Team Domains.
$router->get('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'all']);
$router->post('/domains', [Controllers\Settings\Teams\TeamDomainsController::class, 'create']);
$router->delete('/domains/{teamDomain}', [Controllers\Settings\Teams\TeamDomainsController::class, 'destroy']);
});
});
});
});
// Integrations
$router->group(['middleware' => 'permission:' . PermissionEnum::MANAGE_INTEGRATIONS->value], static function (Router $router): void {
$router->post('/integrations', [IntegrationController::class, 'internal'])
->name('api.integrations.internal');
$router->put('/integrations', [IntegrationController::class, 'toggleStatus'])
->name('api.integrations.toggle_status');
$router->delete('/integrations/{provider}', [IntegrationController::class, 'delete'])
->name('api.integrations.delete');
});
$router->get('/integrations', [IntegrationController::class, 'all'])
->middleware('permission:' . PermissionEnum::READ_INTEGRATIONS->value)
->name('api.integrations.index');
// Slack API for getting slack channels list
$router->get('{notificationProvider}/channels', [Controllers\NotificationProviderController::class, 'channels']);
// Team actions. XXX: These all need moving out to their own controllers.
$router->group(['prefix' => 'organizations'], static function (Router $router): void {
$router->get('current', [TeamController::class, 'current']);
$router->group(['prefix' => '{team}', 'middleware' => ['teamMember']], static function (Router $router): void {
$router->get('/', [TeamController::class, 'show']);
$router->get('/categories', [TeamController::class, 'categories']);
$router->get('/stages', [TeamController::class, 'stages']);
$router->get('/users', [OrganizationMembersController::class, 'index'])
->name('organization.members.index');
$router
->get('/users/download', [OrganizationMembersController::class, 'download'])
->middleware('permission:' . PermissionEnum::MANAGE_USERS->value)
->name('organization.members.download');
$router->get('/licensed-roles', [OrganizationLicensesController::class, 'index'])
->middleware('permission:' . PermissionEnum::MANAGE_BILLING->value)
->name('organization.licensed-roles.index');
$router->get('/invitations', [TeamController::class, 'invitations']);
$router->get('/groups', [TeamController::class, 'groups']);
$router->delete('/groups/{group}', [TeamController::class, 'deleteGroup'])
->middleware(['permission:' . PermissionEnum::DELETE_TEAM->value])
->name('api.groups.delete');
$router->get('/job-titles', [TeamController::class, 'jobTitles']);
$router->get('/slugs', [TeamController::class, 'slugs']);
$router->put('/api-token', [TeamController::class, 'generateApiToken'])
->middleware(['permission:' . PermissionEnum::MANAGE_ORGANIZATION_SETTINGS->value]);
$router->get('/key-moments', [MomentController::class, 'all']);
});
});
// Internal Kiosk. This whole section will be moved out to a separate file
$router
->prefix('kiosk')
->middleware('can:kiosk,' . User::class)
->group(static function (Router $router): void {
// Partner actions.
$router->get('/partners', [PartnersController::class, 'index']);
// User actions.
$router->post('/users/search', [SearchController::class, 'performBasicSearch']);
// Team actions.
$router->prefix('organizations')->group(static function (Router $router): void {
$router->get('/', [OrganizationsController::class, 'show']);
$router->put('/{team}', [OrganizationController::class, 'edit'])
->name('kiosk.organizations.edit');
$router->get('/{team}/users', [OrganizationMembersController::class, 'index'])
->name('kiosk.organization.members.index');
$router->get('onboardable', [OnboardController::class, 'available']);
$router->delete('/{team}', [OrganizationsController::class, 'deactivateAccounts']);
});
// Automated reports
// api/v1/kiosk/automated-reports
$router->prefix('automated-reports')->group(static function (Router $router): void {
$router->get('/form-data', [AutomatedReportsController::class, 'getCreateForm']);
$router->get('/form-data/{reportUuid}', [AutomatedReportsController::class, 'getEditForm']);
$router->post('/filters', [AutomatedReportsController::class, 'getFilters']);
$router->post('/', [AutomatedReportsController::class, 'create']);
$router->put('/{reportUuid}', [AutomatedReportsController::class, 'update']);
$router->patch('/{reportUuid}', [AutomatedReportsController::class, 'partialUpdate']);
$router->get('/', [AutomatedReportsController::class, 'list']);
$router->get('/{reportUuid}', [AutomatedReportsController::class, 'get']);
$router->delete('/{reportUuid}', [AutomatedReportsController::class, 'delete']);
$router->post('/activities-count', [AutomatedReportsController::class, 'getActivitiesCount']);
$router->get('/{reportUuid}/reports-count', [AutomatedReportsController::class, 'getReportsCount']);
});
// Activity actions.
$router->post('/activity/search', [SearchController::class, 'performActivitySearch']);
$router->prefix('activity/{activity}')->group(static function (Router $router): void {
$router->post('check-playable', [SearchController::class, 'performActivityCheckPlayable']);
$router->post('reset-crm-log', [SearchController::class, 'performResetCrmLogActivity']);
$router->get('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->post('diarize-via-transcript', [KioskActivityController::class, 'diarizeViaTranscript']);
$router->get('media-pipeline', [MediaPipelineController::class, 'getPipes']);
$router->post('media-pipeline', [MediaPipelineController::class, 'updatePipe']);
$router->post('language', [KioskActivityController::class, 'updateLanguage']);
$router->post('trim', [KioskActivityController::class, 'trimActivity']);
$router->get('troubleshoot', [KioskActivityController::class, 'troubleshootActivity']);
...
|
50188
|
NULL
|
NULL
|
NULL
|
|
50194
|
1779
|
13
|
2026-05-18T07:23:01.964328+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088981964_m1.jpg...
|
Firefox
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira — Work...
|
1
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedIssue=JY-20613...
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
3 Notifications
3 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to:","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Top Bar","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Top Bar","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sidebar","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sidebar","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Main Content","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Main Content","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Space navigation","depth":10,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Space navigation","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse sidebar [","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse sidebar [","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Switch sites or apps","depth":10,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch sites or apps","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to your Jira homepage","depth":9,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Search, press enter to navigate to advanced search with your text query","depth":11,"on_screen":true,"help_text":"","placeholder":"Search","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Create","depth":10,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":12,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Rovo Ask Rovo","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Rovo","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"3 Notifications","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 Notifications","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Help","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Help","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Settings","depth":12,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Settings","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"lukas.kovalik@jiminny.com","depth":12,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lukas.kovalik@jiminny.com","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"For you","depth":12,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"For you","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Recent","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Recent","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Starred","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Starred","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Apps","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Apps","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Apps","depth":13,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Apps","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Spaces","depth":12,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Spaces","depth":15,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create space","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create space","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for spaces","depth":13,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for spaces","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recent","depth":16,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New)","depth":17,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":20,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Jiminny (New)","depth":18,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXMenuButton","text":"Create board","depth":18,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Create board","depth":20,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Jiminny (New)","depth":18,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Jiminny (New)","depth":20,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Platform Team","depth":19,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Team","depth":22,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Capture Team","depth":19,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Capture Team","depth":22,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise Stability Issues 🤕","depth":19,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise Stability Issues 🤕","depth":22,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Processing Team","depth":19,"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Processing Team","depth":22,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false}]...
|
5948432346191134539
|
1176861893563666510
|
app_switch
|
accessibility
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
3 Notifications
3 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions
Processing Team
Processing Team
Board actions...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50195
|
1780
|
9
|
2026-05-18T07:23:01.964334+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088981964_m2.jpg...
|
Firefox
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira — Work...
|
1
|
jiminny.atlassian.net/jira/software/c/projects/JY/ jiminny.atlassian.net/jira/software/c/projects/JY/boards/37?selectedIssue=JY-20613...
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
3 Notifications
3 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.06304868,"width":0.10106383,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.05905826,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.09577015,"width":0.15658244,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"bounds":{"left":0.0,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.12849163,"width":0.064494684,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"bounds":{"left":0.0,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.16121309,"width":0.18068483,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"bounds":{"left":0.0,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"bounds":{"left":0.013297873,"top":0.19393456,"width":0.029920213,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"bounds":{"left":0.0,"top":0.21548285,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.22665602,"width":0.09158909,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2482043,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.25937748,"width":0.039228722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.28092578,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.29209897,"width":0.042719416,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.31364724,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.32482043,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"bounds":{"left":0.0,"top":0.3463687,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"bounds":{"left":0.013297873,"top":0.3575419,"width":0.07679521,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"bounds":{"left":0.0,"top":0.3790902,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"bounds":{"left":0.013297873,"top":0.39026338,"width":0.08543883,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.41181165,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.013297873,"top":0.42298484,"width":0.21791889,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.4445331,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4557063,"width":0.04537899,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"bounds":{"left":0.0,"top":0.4772546,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.4884278,"width":0.15259309,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.509976,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.5211492,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.5442937,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to:","depth":9,"bounds":{"left":0.090259306,"top":0.07861133,"width":0.016954787,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Top Bar","depth":10,"bounds":{"left":0.090259306,"top":0.097765364,"width":0.016954787,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Top Bar","depth":11,"bounds":{"left":0.090259306,"top":0.097765364,"width":0.016954787,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Sidebar","depth":10,"bounds":{"left":0.090259306,"top":0.11691939,"width":0.016954787,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Sidebar","depth":11,"bounds":{"left":0.090259306,"top":0.11691939,"width":0.016954787,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Main Content","depth":10,"bounds":{"left":0.090259306,"top":0.13607343,"width":0.029421542,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Main Content","depth":11,"bounds":{"left":0.090259306,"top":0.13607343,"width":0.029421542,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Space navigation","depth":10,"bounds":{"left":0.090259306,"top":0.15522745,"width":0.037898935,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Space navigation","depth":11,"bounds":{"left":0.090259306,"top":0.15522745,"width":0.037898935,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Collapse sidebar [","depth":9,"bounds":{"left":0.08361037,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Collapse sidebar [","depth":11,"bounds":{"left":0.0887633,"top":0.06344773,"width":0.039727394,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Switch sites or apps","depth":10,"bounds":{"left":0.095578454,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Switch sites or apps","depth":12,"bounds":{"left":0.10073138,"top":0.06344773,"width":0.044215426,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Go to your Jira homepage","depth":9,"bounds":{"left":0.10887633,"top":0.057861134,"width":0.029421542,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXComboBox","text":"Search, press enter to navigate to advanced search with your text query","depth":11,"bounds":{"left":0.40475398,"top":0.06264964,"width":0.24268617,"height":0.015961692},"on_screen":true,"help_text":"","placeholder":"Search","role_description":"combo box","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"Create","depth":10,"bounds":{"left":0.65575135,"top":0.057861134,"width":0.030086435,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create","depth":12,"bounds":{"left":0.66705453,"top":0.06384677,"width":0.014793883,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Rovo Ask Rovo","depth":12,"bounds":{"left":0.91223407,"top":0.057861134,"width":0.035904255,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Ask Rovo","depth":14,"bounds":{"left":0.92353725,"top":0.06384677,"width":0.020611702,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"3 Notifications","depth":12,"bounds":{"left":0.9494681,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 Notifications","depth":14,"bounds":{"left":0.954621,"top":0.06344773,"width":0.031914894,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Help","depth":12,"bounds":{"left":0.96143615,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Help","depth":14,"bounds":{"left":0.9665891,"top":0.06344773,"width":0.010139627,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Settings","depth":12,"bounds":{"left":0.9734042,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Settings","depth":14,"bounds":{"left":0.97855717,"top":0.06344773,"width":0.017952127,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"lukas.kovalik@jiminny.com","depth":12,"bounds":{"left":0.98537236,"top":0.057861134,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"lukas.kovalik@jiminny.com","depth":14,"bounds":{"left":0.99052525,"top":0.06344773,"width":0.009474754,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"For you","depth":12,"bounds":{"left":0.08361037,"top":0.09976058,"width":0.071476065,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"For you","depth":15,"bounds":{"left":0.09424867,"top":0.10574621,"width":0.01662234,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Recent","depth":12,"bounds":{"left":0.08361037,"top":0.12529927,"width":0.071476065,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Recent","depth":15,"bounds":{"left":0.09424867,"top":0.13128492,"width":0.015458777,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Starred","depth":12,"bounds":{"left":0.08361037,"top":0.15083799,"width":0.071476065,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Starred","depth":15,"bounds":{"left":0.09424867,"top":0.15682362,"width":0.016456118,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Apps","depth":12,"bounds":{"left":0.08361037,"top":0.1763767,"width":0.071476065,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Apps","depth":15,"bounds":{"left":0.09424867,"top":0.18236233,"width":0.011635638,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Apps","depth":13,"bounds":{"left":0.15309176,"top":0.17956904,"width":0.0039893617,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Apps","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Spaces","depth":12,"bounds":{"left":0.08361037,"top":0.2019154,"width":0.071476065,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXStaticText","text":"Spaces","depth":15,"bounds":{"left":0.09424867,"top":0.20790103,"width":0.016456118,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Create space","depth":13,"bounds":{"left":0.13646941,"top":0.20510775,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Create space","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for spaces","depth":13,"bounds":{"left":0.14577793,"top":0.20510775,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for spaces","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Recent","depth":16,"bounds":{"left":0.08959442,"top":0.23423783,"width":0.013464096,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Jiminny (New)","depth":17,"bounds":{"left":0.08759973,"top":0.2529928,"width":0.0674867,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Jiminny (New)","depth":20,"bounds":{"left":0.09823803,"top":0.25897846,"width":0.032081116,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Jiminny (New)","depth":18,"bounds":{"left":0.08892952,"top":0.25618514,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":true},{"role":"AXMenuButton","text":"Create board","depth":18,"bounds":{"left":0.13646941,"top":0.25618514,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Create board","depth":20,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"More actions for Jiminny (New)","depth":18,"bounds":{"left":0.14577793,"top":0.25618514,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"More actions for Jiminny (New)","depth":20,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Platform Team","depth":19,"bounds":{"left":0.09158909,"top":0.27853152,"width":0.06349734,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Team","depth":22,"bounds":{"left":0.1022274,"top":0.28451717,"width":0.032247342,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.15309176,"top":0.28172386,"width":0.0039893617,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Capture Team","depth":19,"bounds":{"left":0.09158909,"top":0.30407023,"width":0.06349734,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Capture Team","depth":22,"bounds":{"left":0.1022274,"top":0.31005585,"width":0.03125,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.15309176,"top":0.30726257,"width":0.0039893617,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Enterprise Stability Issues 🤕","depth":19,"bounds":{"left":0.09158909,"top":0.32960895,"width":0.06349734,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Enterprise Stability Issues 🤕","depth":22,"bounds":{"left":0.1022274,"top":0.33559456,"width":0.050531916,"height":0.030726258},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Board actions","depth":20,"bounds":{"left":0.15309176,"top":0.33280128,"width":0.0039893617,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Board actions","depth":22,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-1505505581421893470
|
1176861893563666510
|
app_switch
|
accessibility
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Close tab
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to:
Top Bar
Top Bar
Sidebar
Sidebar
Main Content
Main Content
Space navigation
Space navigation
Collapse sidebar [
Collapse sidebar [
Switch sites or apps
Switch sites or apps
Go to your Jira homepage
Search, press enter to navigate to advanced search with your text query
Create
Create
Rovo Ask Rovo
Ask Rovo
3 Notifications
3 Notifications
Help
Help
Settings
Settings
[EMAIL]
[EMAIL]
For you
For you
Recent
Recent
Starred
Starred
Apps
Apps
More actions for Apps
More actions for Apps
Spaces
Spaces
Create space
Create space
More actions for spaces
More actions for spaces
Recent
Jiminny (New)
Jiminny (New)
Jiminny (New)
Create board
Create board
More actions for Jiminny (New)
More actions for Jiminny (New)
Platform Team
Platform Team
Board actions
Board actions
Capture Team
Capture Team
Board actions
Board actions
Enterprise Stability Issues 🤕
Enterprise Stability Issues 🤕
Board actions
Board actions...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50196
|
1780
|
10
|
2026-05-18T07:23:04.470341+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088984470_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
DMSActivityMoreSlackcalVIewJiminny…..# * More unre DMSActivityMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messagesG. Vasil Vasilevf. Nikolay YankovP. Galya DimitrovaR Aneliva Angelova8. Stoyan Tomov. Stefka StoyanovaC8 Todor Stamatov *&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:AppsS Jira Cloud® ToastMistonWindowhelp@ Describe what you are looking for& Nikolay Yankov• Messagest Add canvasMoreреално Monday. April 27th ~ N0 3aoromolluncryaне е ли по-добре да го четем от отделенenapointNikolay Yankov 7:10PMПредлагаш в отделен ендпойнт да се•взима инфо дали useг-а има генериранирепорти ли.За този флагДето слагам в user обекта?Lukas Kovalik 7:18 PMда, нали то се ползва само на еднастпанишa. User ransformer сe полава надоста места. Или пак да го оставим, edgecase eNikolay Yankov 7:18PMНе, ползва се на всяка страницаТо е в навигациятаЗа кога показваме бутонаSidebaraikolav Yankov 10:03 AMIlanivilsettines /ordenizationsMessage Nikolay Yankov+ AalQ Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epic vTypeorama promots isAJ Report7 eeee —is celered out Is250000 =Maysuagestions? ooed —IN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update…..ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:045 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
NULL
|
441834977969412555
|
NULL
|
visual_change
|
ocr
|
NULL
|
DMSActivityMoreSlackcalVIewJiminny…..# * More unre DMSActivityMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messagesG. Vasil Vasilevf. Nikolay YankovP. Galya DimitrovaR Aneliva Angelova8. Stoyan Tomov. Stefka StoyanovaC8 Todor Stamatov *&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:AppsS Jira Cloud® ToastMistonWindowhelp@ Describe what you are looking for& Nikolay Yankov• Messagest Add canvasMoreреално Monday. April 27th ~ N0 3aoromolluncryaне е ли по-добре да го четем от отделенenapointNikolay Yankov 7:10PMПредлагаш в отделен ендпойнт да се•взима инфо дали useг-а има генериранирепорти ли.За този флагДето слагам в user обекта?Lukas Kovalik 7:18 PMда, нали то се ползва само на еднастпанишa. User ransformer сe полава надоста места. Или пак да го оставим, edgecase eNikolay Yankov 7:18PMНе, ползва се на всяка страницаТо е в навигациятаЗа кога показваме бутонаSidebaraikolav Yankov 10:03 AMIlanivilsettines /ordenizationsMessage Nikolay Yankov+ AalQ Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epic vTypeorama promots isAJ Report7 eeee —is celered out Is250000 =Maysuagestions? ooed —IN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update…..ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:045 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
50195
|
NULL
|
NULL
|
NULL
|
|
50197
|
1779
|
14
|
2026-05-18T07:23:05.385758+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088985385_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0.Preparation for Refi…. in 4 h 37 m100% <78• Mon 18 May 10:23:04DOCKER (docker-compose)О ₴2181DOCKER81DEV (-zsh)DOCKER (docker-compose)proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh].2S DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 > '/proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:count]2s DONE• '/usr/local/bin/php' 'artisan'conference:monitor:count > '/proc/1/docker_1amp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch: create › '/proc/1/fd/12>&1docker_lamp_12026-05-18 07:22:20 Running ['artisan' activity:sync 'ringcentral' 'avaya' 'telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches2026docker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_lamp_12s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan'datadog: report:failed-processing-states]2S DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1APP (-zsh)*3screenpipe"PROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
-8935058744292167685
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0.Preparation for Refi…. in 4 h 37 m100% <78• Mon 18 May 10:23:04DOCKER (docker-compose)О ₴2181DOCKER81DEV (-zsh)DOCKER (docker-compose)proc/1/fd/1' 2>&1docker_lamp_112026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh].2S DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 > '/proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:count]2s DONE• '/usr/local/bin/php' 'artisan'conference:monitor:count > '/proc/1/docker_1amp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch: create › '/proc/1/fd/12>&1docker_lamp_12026-05-18 07:22:20 Running ['artisan' activity:sync 'ringcentral' 'avaya' 'telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches2026docker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_lamp_12s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan'datadog: report:failed-processing-states]2S DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1APP (-zsh)*3screenpipe"PROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
50194
|
NULL
|
NULL
|
NULL
|
|
50198
|
1780
|
11
|
2026-05-18T07:23:05.385782+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088985385_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
DMSActivityLaterMoreSlackcalVIewJiminny…..# * More DMSActivityLaterMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf. Nikolay YankovP. Galya DimitrovaAneliva Angelova8. Stoyan Tomov. Stefka StoyanovaC8 Todor Stamatov *&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:AppsS Jira Cloud® ToastMistonWindowhelp@ Describe what you are looking for& Nikolay Yankov• Messagest Add canvasMoreреално Monday. April 27th ~ N0 3aoromolluncryaне е ли по-добре да го четем от отделенenapointNikolay Yankov 7:10PMПредлагаш в отделен ендпойнт да се•взима инфо дали useг-а има генериранирепорти ли.За този флагДето слагам в user обекта?Lukas Kovalik 7:18 PMда, нали то се ползва само на еднастраница. UserTransformer се ползва надоста места. Или пак да го оставим, edgecase eNikolay Yankov 7:18 PMНе, ползва се на всяка страницаТо е в навигациятаЗа кога показваме бутонаSidebaraNikolav Yankov 10:03 AM/api/v1/settings/organizationsMessage Nikolay Yankov+ Aa €Q Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epicynorama promots isAJ Report7 eeee — |is celered out Is250000 =May1[PASSWORD_DOTS]= (asuagestionsTY TYPEI? ooed —TypeIN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update...ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:055 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
NULL
|
413524815620490808
|
NULL
|
click
|
ocr
|
NULL
|
DMSActivityLaterMoreSlackcalVIewJiminny…..# * More DMSActivityLaterMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf. Nikolay YankovP. Galya DimitrovaAneliva Angelova8. Stoyan Tomov. Stefka StoyanovaC8 Todor Stamatov *&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:AppsS Jira Cloud® ToastMistonWindowhelp@ Describe what you are looking for& Nikolay Yankov• Messagest Add canvasMoreреално Monday. April 27th ~ N0 3aoromolluncryaне е ли по-добре да го четем от отделенenapointNikolay Yankov 7:10PMПредлагаш в отделен ендпойнт да се•взима инфо дали useг-а има генериранирепорти ли.За този флагДето слагам в user обекта?Lukas Kovalik 7:18 PMда, нали то се ползва само на еднастраница. UserTransformer се ползва надоста места. Или пак да го оставим, edgecase eNikolay Yankov 7:18 PMНе, ползва се на всяка страницаТо е в навигациятаЗа кога показваме бутонаSidebaraNikolav Yankov 10:03 AM/api/v1/settings/organizationsMessage Nikolay Yankov+ Aa €Q Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epicynorama promots isAJ Report7 eeee — |is celered out Is250000 =May1[PASSWORD_DOTS]= (asuagestionsTY TYPEI? ooed —TypeIN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update...ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:055 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50199
|
1779
|
15
|
2026-05-18T07:23:06.387109+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088986387_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0.Preparation for Refi…. in 4 h 37 m100% (78• Mon 18 May 10:23:05• •DOCKER (docker-compose)О 82181DOCKER81DEV (-zsh)DOCKER (docker-compose)proc/1/fd/1' 2>&1docker_lamp_12026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh].2S DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 > */proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:countl2s DONE• '/usr/local/bin/php' 'artisan'conference:monitor:count> '/proc/1/docker_1amp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch: create › '/proc/1/fd/12>&1docker_lamp_12026-05-18 07:22:20 Running ['artisan' activity:sync 'ringcentral' 'avaya' 'telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches2026docker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_lamp_12s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan'datadog: report:failed-processing-states]2S DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1APP (-zsh)*3screenpipe"Y2PROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 ExT(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
8035718443413937627
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelp> 0.Preparation for Refi…. in 4 h 37 m100% (78• Mon 18 May 10:23:05• •DOCKER (docker-compose)О 82181DOCKER81DEV (-zsh)DOCKER (docker-compose)proc/1/fd/1' 2>&1docker_lamp_12026-05-18 07:22:09 Running ['artisan'mailbox:skip-lists:refresh].2S DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4S DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:process --max-batches=15 > */proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:countl2s DONE• '/usr/local/bin/php' 'artisan'conference:monitor:count> '/proc/1/docker_1amp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'mailbox:batch: create › '/proc/1/fd/12>&1docker_lamp_12026-05-18 07:22:20 Running ['artisan' activity:sync 'ringcentral' 'avaya' 'telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches2026docker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67ms DONEdocker_lamp_12s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' activity:sync 'ringcentral' 'avaya''telus' 'talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_lamp_11 l '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan'datadog: report:failed-processing-states]2S DONEdocker_1amp_1" '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1APP (-zsh)*3screenpipe"Y2PROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ IX 17 ExT(-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsEXTENSIONPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|View in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50200
|
1779
|
16
|
2026-05-18T07:23:09.394148+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088989394_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKER81DEV (-zsh)DOCKER (docker-compose)1/fd/1'2>&1docker_lamp_112026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' mailbox:batch:process --max-batches=15 >*/proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:count2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' conference:monitor:count > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2s DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:create > */proc/1/fd/1• 2>&1docker_1amp_12026-05-18 07:22:20 Running ['artisan'activity:sync'ringcentral' 'a'talkdesk'--from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1 | 2s DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan''telus'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00' > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan'twilio:recover-tracks]......3S DONEdocker_lamp_11'• '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'2>&1docker_lamp_1ng-states]252026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processiDONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states >*/proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_1amp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan' meeting-bot:schedule-bot] ...4S DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot> */proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable Watch> 0.Preparation for Refi…. in 4 h 37 mDOCKER (docker-compose)• $2APP (-zsh)*3PROD (ssh)Run'do-release-upgrade'to upgrade to it.100% <78• Mon 18 May 10:23:08screenpipe"T81PROD*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
NULL
|
-4035567148213668121
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKER81DEV (-zsh)DOCKER (docker-compose)1/fd/1'2>&1docker_lamp_112026-05-18 07:22:12 Running ['artisan'mailbox:batch:process --max-batches=15]4s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan' mailbox:batch:process --max-batches=15 >*/proc/1/fd/1'docker_lamp_12026-05-18 07:22:16 Running ['artisan'conference:monitor:count2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' conference:monitor:count > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]2s DONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'mailbox:batch:create > */proc/1/fd/1• 2>&1docker_1amp_12026-05-18 07:22:20 Running ['artisan'activity:sync'ringcentral' 'a'talkdesk'--from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1 | 2s DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan''telus'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00' --t0='2026-05-18 07:22:00' > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan'twilio:recover-tracks]......3S DONEdocker_lamp_11'• '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2sDONEdocker_1amp_1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'2>&1docker_lamp_1ng-states]252026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processiDONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states >*/proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_1amp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan' meeting-bot:schedule-bot] ...4S DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot> */proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable Watch> 0.Preparation for Refi…. in 4 h 37 mDOCKER (docker-compose)• $2APP (-zsh)*3PROD (ssh)Run'do-release-upgrade'to upgrade to it.100% <78• Mon 18 May 10:23:08screenpipe"T81PROD*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
50199
|
NULL
|
NULL
|
NULL
|
|
50202
|
1780
|
12
|
2026-05-18T07:23:11.785830+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088991785_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeActivityLaterMoreSlackcalVIewJiminny…..# * Mor HomeActivityLaterMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf.. Nikolay YankovP. Galya DimitrovaR. Aneliya Angelova8. Stoyan Tomov. Stefka StoyanovaSà Todor Stamatov&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:Apps© Jira Cloud® ToastMistonWindowHelp@ Describe what you are looking for& e. Vasil Vasilev• Messagest Add canvasMoreизключепниdаy May 5th.ElasticSearch и базата са споделени съсLukas Kovalik 1:31 PMда, мислех си такаVasil Vasilev 1:31 PMно прод средите са изолираниLukas Kovalik 1:31 PMVasil Vasilev 1:31 PMмоляVasil Vasilev 10:17 AMЛwvaш anupoт loditodlтрябват ми няколко ревюта за разни ЕСaielalMet10:18 httos://github.com/uminnv/a0b/0ull/12086https://github.com/jiminny/app/pull/12088changesMessage Vasil Vasilev+ Aa €Q Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epicynorama promots isAJ Report7 eeee — |is celered out Is250000 =May1[PASSWORD_DOTS]= (asuagestionsTY TYPE? ooed —TypeIN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update...ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:115 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
NULL
|
562866721593165823
|
NULL
|
click
|
ocr
|
NULL
|
HomeActivityLaterMoreSlackcalVIewJiminny…..# * Mor HomeActivityLaterMoreSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf.. Nikolay YankovP. Galya DimitrovaR. Aneliya Angelova8. Stoyan Tomov. Stefka StoyanovaSà Todor Stamatov&. Mario GeorgievC. Nikolay Ivanov&o James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:Apps© Jira Cloud® ToastMistonWindowHelp@ Describe what you are looking for& e. Vasil Vasilev• Messagest Add canvasMoreизключепниdаy May 5th.ElasticSearch и базата са споделени съсLukas Kovalik 1:31 PMда, мислех си такаVasil Vasilev 1:31 PMно прод средите са изолираниLukas Kovalik 1:31 PMVasil Vasilev 1:31 PMмоляVasil Vasilev 10:17 AMЛwvaш anupoт loditodlтрябват ми няколко ревюта за разни ЕСaielalMet10:18 httos://github.com/uminnv/a0b/0ull/12086https://github.com/jiminny/app/pull/12088changesMessage Vasil Vasilev+ Aa €Q Search& JY-12253 / [I JY-20613E BacklogI Active sprintsAllow owner's role to be selected when setting up a trial00О008Epicynorama promots isAJ Report7 eeee — |is celered out Is250000 =May1[PASSWORD_DOTS]= (asuagestionsTY TYPE? ooed —TypeIN DEV 3MCP > Enable u:and their detailsJIMINNY MCP COIIn DevI JY-20833MCP > Enable u:and their detailsJIMINNY MCP COIn Dev[ JY-20835DescriptionStoyan is seeing more cases where the Owner doesn't want to connect their calendar and email to Jiminny.This is because they don't want to be a recorder. Currently when a trial is created we give the Owner aRecorder role by default. In most cases he really needs to be a recorder.• allow Implementations to select the role of the owner when setting up a trialoput the field bellow the Owner email fieldo the choices should only be - Recorder, Recorder & Voice, Analyst• single select• this option shouldn't appear when editing an organisation• when the owner signs in, they should have the selected role + Admin permissionsAllow owner's rosettina uo a triaEMPROVEMENT OFIn Dev# JY-20613SubtasksAdd subtaskLinked work itemsAdd linked work itemActivityAll Comments History Work logAdd a comment...Suggest a reply... Status update...ThankS….Pro tip: press (M) to commentN0 x0ny 2028 41 15:57• The new field will be at the place of Import Opportunities Sync Period• Import Opportunities Sync Period goes on 3rd row, 1st column+ CreateIn Dev v* Improve StoryDetailsAssigneeReporterDeveloomentIComponentsSub-ProductLabelsStory pointestimateStory PointsOrganisatioPriorityFix versionsSprintDaysNeed QA@ Lukas Kovalik@ Galya DimitrovaQ Open with VS Code33 Create branch& Create commitPlatformAdd optionsNoneNone2NoneParent= MediumNonePlatform Sprint 4 Q21.5Yes→ JY-12253 Improvement of ourCanny LinksOpen Canny Links> More fields Original estimate, Time tracking"Preparation tor Kell... n 4h 37m100% 28• Mon 18 May 10:23:115 Ask Rovowork itemsE Docs@ Shortcutsil Slack integration§ Reporting CenterComplete sprintGroup: QueriesPO ACCEPTANCEDEPLOY 7AJ Panorama tor Call Scorina in ODAUTOMATED AL SCORINGDeoloved… JY-2036105 • •00=[Deadline 25 May] Migrate depricatedGemini s.l rlash Lue Preview modelMAINTENANCEDeployed…JY-208801Al•00=Setup test coverage for Prophet in SonarMAINTENANCEDeplovedv JY-19951[Deadline 17 Junel Miarate depricatedGemini modelsMATNTENANCEDeployedE JY-202720 •.=₽Sidekick SMS issueDeployed8 JY-2089172 •0=@Update activity stage on opportunityuodateDeployed** JY-20903UndateActivitvElasticSearchDocumentCcmmand...
|
50198
|
NULL
|
NULL
|
NULL
|
|
50201
|
1779
|
17
|
2026-05-18T07:23:11.796523+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088991796_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKERDOCKER (docker-compose)15 > */proc/1/fd/1' 2>&1docker_lamp_12s DONEdocker_1amp_1fd/1'2>&1docker_lamp_12s DONEdocker_lamp_181DEV (-zsh)2026-05-18 07:22:16 Running ['artisan'conference:monitor:count]• '/usr/local/bin/php' 'artisan' conference:monitor: count > */proc/1/2026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]l '/usr/local/bin/php' 'artisan' mailbox:batch:create › */proc/1/fd/1docker_lamp_12026-05-18 07:22:20 Running ['artisan'activity:sync'ringcentral' 'a'talkdesk'--from='2026-05-18 07:06:00'--to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1 | 2s DONEdocker_lamp_1'telus'1 '/usr/local/bin/php' 'artisan'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00'--to=* 2026-05-18 07:22:00' > */proc/1/fd/1' 2>&1docker_lamp_1 |2026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › */proc/1/fd/1' 2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan'dialers:sync-users]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'2>&1docker_1amp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan'datadog:report:failed-processing-states >*/proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_1amp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]4sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:07 Running ['artisan' dialers:monitor-activities].2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' dialers:monitor-activities › '/proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchPreparation for Refi…. in 4 h 37 m100% <DOCKER (docker-compose)O ₴2APP (-zsh)*3ffmpegPROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
NULL
|
-7180416346993526357
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKERDOCKER (docker-compose)15 > */proc/1/fd/1' 2>&1docker_lamp_12s DONEdocker_1amp_1fd/1'2>&1docker_lamp_12s DONEdocker_lamp_181DEV (-zsh)2026-05-18 07:22:16 Running ['artisan'conference:monitor:count]• '/usr/local/bin/php' 'artisan' conference:monitor: count > */proc/1/2026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]l '/usr/local/bin/php' 'artisan' mailbox:batch:create › */proc/1/fd/1docker_lamp_12026-05-18 07:22:20 Running ['artisan'activity:sync'ringcentral' 'a'talkdesk'--from='2026-05-18 07:06:00'--to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1 | 2s DONEdocker_lamp_1'telus'1 '/usr/local/bin/php' 'artisan'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00'--to=* 2026-05-18 07:22:00' > */proc/1/fd/1' 2>&1docker_lamp_1 |2026-05-18 07:22:23 Running ['artisan' twilio:recover-tracks]3S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › */proc/1/fd/1' 2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan'dialers:sync-users]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'2>&1docker_1amp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2s DONEdocker_1amp_1• '/usr/local/bin/php' 'artisan'datadog:report:failed-processing-states >*/proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_1amp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]4sDONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:07 Running ['artisan' dialers:monitor-activities].2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' dialers:monitor-activities › '/proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchPreparation for Refi…. in 4 h 37 m100% <DOCKER (docker-compose)O ₴2APP (-zsh)*3ffmpegPROD (ssh)Run'do-release-upgrade'to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50203
|
1780
|
13
|
2026-05-18T07:23:13.614498+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088993614_m2.jpg...
|
Firefox
|
Work — Mozilla Firefox
|
1
|
github.com/jiminny/app/pull/12086
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
pipedrive/client-php: Pipedrive API client for PHP pipedrive/client-php: Pipedrive API client for PHP
github.com
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
Close tab
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
github.com/jiminny/app/pull/12086
github.com/jiminny/app/pull/12086
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Waiting for github.com…...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"bounds":{"left":0.08361037,"top":0.38627294,"width":0.080784574,"height":0.021548284},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"github.com","depth":4,"bounds":{"left":0.08361037,"top":0.40782124,"width":0.019614361,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.06304868,"width":0.10106383,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.09577015,"width":0.15658244,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"bounds":{"left":0.0,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.12849163,"width":0.064494684,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"bounds":{"left":0.0,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.16121309,"width":0.18068483,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"bounds":{"left":0.0,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"bounds":{"left":0.013297873,"top":0.19393456,"width":0.029920213,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"bounds":{"left":0.0,"top":0.21548285,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.22665602,"width":0.09158909,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2482043,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.25937748,"width":0.039228722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.28092578,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.29209897,"width":0.042719416,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.31364724,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.32482043,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"bounds":{"left":0.0,"top":0.3463687,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"bounds":{"left":0.013297873,"top":0.3575419,"width":0.07679521,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"bounds":{"left":0.0,"top":0.3790902,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"bounds":{"left":0.013297873,"top":0.39026338,"width":0.08543883,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.38627294,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.41181165,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.013297873,"top":0.42298484,"width":0.21791889,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.4445331,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4557063,"width":0.04537899,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"bounds":{"left":0.0,"top":0.4772546,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.4884278,"width":0.15259309,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.509976,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.5211492,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"github.com/jiminny/app/pull/12086","depth":4,"bounds":{"left":0.0,"top":0.54269755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"github.com/jiminny/app/pull/12086","depth":5,"bounds":{"left":0.013297873,"top":0.55387074,"width":0.059840426,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.54988027,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.57701516,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Waiting for github.com…","depth":5,"bounds":{"left":0.0809508,"top":0.9876297,"width":0.04255319,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
2521554550432584901
|
-5168692114337662642
|
visual_change
|
accessibility
|
NULL
|
pipedrive/client-php: Pipedrive API client for PHP pipedrive/client-php: Pipedrive API client for PHP
github.com
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
Close tab
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
github.com/jiminny/app/pull/12086
github.com/jiminny/app/pull/12086
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Waiting for github.com…...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50204
|
1779
|
18
|
2026-05-18T07:23:14.121563+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088994121_m1.jpg...
|
Firefox
|
Finance Hub — Personal
|
1
|
finance-hub.lakylak.xyz
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…
Source
Status
Type
Tag
From date
01
/
05
/
2026
Calendar
To date
18
/
05
/
2026
Calendar
78
transaction
s
(balance alerts hidden)
·
Total:
2,246.65
EUR
incl. BGN→EUR
·
2026-05-01 → 2026-05-18
DATE
RECIPIENT
AMOUNT
TAGS
18 May 2026, 08:06
hostinger
Raw data
23.03 EUR
Subscription
Send
Send
Skip
Skip
Delete
17 May 2026, 16:34
BILLA 101 18, SOFIA, BG
Raw data...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Getting Started · AFFiNE","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Getting Started · AFFiNE","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Download screenpipe — get started in minutes","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download screenpipe — get started in minutes","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Self-Hosted Software and Apps","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Self-Hosted Software and Apps","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Finance Hub","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Завеждане на щета онлайн | Euroins","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Завеждане на щета онлайн | Euroins","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Photos - Google Photos","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos - Google Photos","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.48576388,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.5086806,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.53194445,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.5552083,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5784722,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Finance Hub","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finance Hub","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"s","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Payments","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Payments","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Upload CSV","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Upload CSV","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Refresh","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Display settings","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Sign out","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Filters 2","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Filters","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clear","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Recipient, description…","depth":10,"on_screen":true,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Source","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Status","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tag","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"From date","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"01","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":10,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"To date","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"05","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Calendar","depth":10,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"78","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"s","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(balance alerts hidden)","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Total:","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2,246.65","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"EUR","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"incl. BGN→EUR","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"·","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2026-05-01 → 2026-05-18","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"DATE","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"RECIPIENT","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"AMOUNT","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TAGS","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"18 May 2026, 08:06","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"hostinger","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Raw data","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":true,"is_selected":false},{"role":"AXStaticText","text":"23.03 EUR","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Subscription","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Send","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Send","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Skip","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Delete","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"17 May 2026, 16:34","depth":13,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"BILLA 101 18, SOFIA, BG","depth":14,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Raw data","depth":13,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
6463694158519364630
|
3918435194932686593
|
app_switch
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…
Source
Status
Type
Tag
From date
01
/
05
/
2026
Calendar
To date
18
/
05
/
2026
Calendar
78
transaction
s
(balance alerts hidden)
·
Total:
2,246.65
EUR
incl. BGN→EUR
·
2026-05-01 → 2026-05-18
DATE
RECIPIENT
AMOUNT
TAGS
18 May 2026, 08:06
hostinger
Raw data
23.03 EUR
Subscription
Send
Send
Skip
Skip
Delete
17 May 2026, 16:34
BILLA 101 18, SOFIA, BG
Raw data...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50206
|
1780
|
14
|
2026-05-18T07:23:16.302722+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088996302_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
HomeActivityLaterSlackcalVIewJiminny…..# * More un HomeActivityLaterSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf.. Nikolay YankovP. Galya DimitrovaR. Aneliya Angelova8. Stoyan Tomov. Stefka StoyanovaSà Todor Stamatov&. Mario GeorgievC. Nikolay Ivanovd James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:Apps© Jira Cloud® ToastMistonWindowHelp@ Describe what you are looking forC. Vasil Vasilev• Messagest Add canvasMoreизключепниdаy May 5th.ElasticSearch и базата са споделени съси контеинерите са разхвърляниLukas Kovalik 1:31 PMда, мислех си такаVasil Vasilev 1:31 PMно прод средите са изолираниLukas Kovalik 1:31 PMVasil Vasilev 1:31 PMмоляVasil Vasilev 10:17 AMAwvam anupoт loditodlтрябват ми няколко ревюта за разни ЕСaislaMe tiразделени са на относително малкиЦƠAN:10:18httos:/gitnub.com/minnv/aoo/oullv1088changesMessage Vasil Vasilev+ Aalnance-hub.lakylak.xyz0 Wiki© Security and qualityInsightsộ Settingsror Al model trainina unless vou opt out. Review this update and manage vour preferences in vour Github account settinas.A Vasil-Jiminny requested your review on this pull request.JY 20893 chunk control per update87 OpenVasi -Jiminny wants to merae 17 commits into master trom@ Conversation 15a Commits 17El Checks 2Đ FIVasil-Jiminny commented 3 days ago • edited -JIRA: JY-20893Chanaes:• Add a dedicated class to keep the chunk sizes for various up• Update user classes and tests.• Dron obsolete constantsi• Chunking algorithm tested with full local reset - works as expC Vasil-Jiminny added 4 commits 3 davs ago5) Introduce ChunkSize to control the size of a chunk? SelectionListTest uses ChunkSize.- SelectionList droo reference to TargetEntitiesSelect€ Update TargetEntitiesSelector to use ChunkSize insVasil-Jiminny commented 3 davs ago@claude0+ → C(I) DXP4800PLUS-B5F8& Getting Started • AFFINE(*) Screenpipe - ArchiveDownload screenpipe — ge•• Self-Hosted Software and Arõ Finance HubNew TabM As I get older, now 79, 1 amNew jobs similar to Yeб nodЗавеждане на щета онлайнPhotos - Google Photos) New Tab- New TabFinance HubY Filters (2SearchQ Recipient, description...SourceAll SourcesAll Statuses01/05/202678 transactions (balance alerts hidden)Total: 2,246.65 EUR incl. BGN→EURDATE &RECIPIENT18 May 2026, 08:06hostinger17 May 2026, 16:34BILLA 101 18, SOFIA, BG16 Mav 2026. 13:38VIVACOM, SOFIA, BG16 Mav 2026. 10.59PARKING, SOFIA, BG15 May 2026, 17:52VIMARD EOOD, SOFIA, BG15 May 2026, 08:53LIDL BALGARIYA EOOD, SOFIYA, BGR15 May 2026, 08:48LIDL BALGARIYA EOOD, SOFIYA, BGR14 May 2026, 16:10Boosteroid, Bucharest, RO14 Mav 2026 15:191CI AUDFV14 Mav 2026. 12:08FANTASTICO 43, SOFIA, BG13 May 2026, 08:46CBA EKO MARKET, SOFIA, BG12 May 2026, 08:45BGR SOFIA CBA EKO MARKET10 May 2026, 21:57IRL 08000480408 APPLE COM BILL10 May 2026, 17:16CBA ECO MARKET, SOFIA, BG10 Mav 2026 04:26CitvGate Cofia Trancit COFIA RGP09 Mav 2026. 15:45RGR SOFIA CRA ECO MARKET09 Mav 2026. 15:02VIADENTAL, SOFIA, BG88 Payments# Preparation for Refi... in 4 h 37 m100% 2• мon 1o May 10.23.10I Upload CSV^ X ClearAll Types18/ 05 /20262026-05-01 → 2026-05-18AMOUNT 1I23.03 EUR3.65 EUR36.91 EURI6.00 EUR7.98 EUR0.01 EUR87.51 EUR9.89 EUR21.60 SUP13.36 EUR3.50 EUR7.20 EUR3.99 EUR5.38 EUR160 SIIP8.87 EUR124.00 EURAll Tags@ Skip© Skip*) Skip@ Skip@Skip• Skip© SkipSkip• Skip• Skip• Skip@ Skip@ Skip*) Skin@ Skio* Skip...
|
NULL
|
-1085860497380571875
|
NULL
|
click
|
ocr
|
NULL
|
HomeActivityLaterSlackcalVIewJiminny…..# * More un HomeActivityLaterSlackcalVIewJiminny…..# * More unreads# randomi releases# sofia-office# support# thank-yous# the_people_of jimi...^ Direct messages€. Vasil Vasilevf.. Nikolay YankovP. Galya DimitrovaR. Aneliya Angelova8. Stoyan Tomov. Stefka StoyanovaSà Todor Stamatov&. Mario GeorgievC. Nikolay Ivanovd James Graham2. Stoyan Tanev. Steliyan Georgiev& Petko KashinskiLukas Kovalik y...#:Apps© Jira Cloud® ToastMistonWindowHelp@ Describe what you are looking forC. Vasil Vasilev• Messagest Add canvasMoreизключепниdаy May 5th.ElasticSearch и базата са споделени съси контеинерите са разхвърляниLukas Kovalik 1:31 PMда, мислех си такаVasil Vasilev 1:31 PMно прод средите са изолираниLukas Kovalik 1:31 PMVasil Vasilev 1:31 PMмоляVasil Vasilev 10:17 AMAwvam anupoт loditodlтрябват ми няколко ревюта за разни ЕСaislaMe tiразделени са на относително малкиЦƠAN:10:18httos:/gitnub.com/minnv/aoo/oullv1088changesMessage Vasil Vasilev+ Aalnance-hub.lakylak.xyz0 Wiki© Security and qualityInsightsộ Settingsror Al model trainina unless vou opt out. Review this update and manage vour preferences in vour Github account settinas.A Vasil-Jiminny requested your review on this pull request.JY 20893 chunk control per update87 OpenVasi -Jiminny wants to merae 17 commits into master trom@ Conversation 15a Commits 17El Checks 2Đ FIVasil-Jiminny commented 3 days ago • edited -JIRA: JY-20893Chanaes:• Add a dedicated class to keep the chunk sizes for various up• Update user classes and tests.• Dron obsolete constantsi• Chunking algorithm tested with full local reset - works as expC Vasil-Jiminny added 4 commits 3 davs ago5) Introduce ChunkSize to control the size of a chunk? SelectionListTest uses ChunkSize.- SelectionList droo reference to TargetEntitiesSelect€ Update TargetEntitiesSelector to use ChunkSize insVasil-Jiminny commented 3 davs ago@claude0+ → C(I) DXP4800PLUS-B5F8& Getting Started • AFFINE(*) Screenpipe - ArchiveDownload screenpipe — ge•• Self-Hosted Software and Arõ Finance HubNew TabM As I get older, now 79, 1 amNew jobs similar to Yeб nodЗавеждане на щета онлайнPhotos - Google Photos) New Tab- New TabFinance HubY Filters (2SearchQ Recipient, description...SourceAll SourcesAll Statuses01/05/202678 transactions (balance alerts hidden)Total: 2,246.65 EUR incl. BGN→EURDATE &RECIPIENT18 May 2026, 08:06hostinger17 May 2026, 16:34BILLA 101 18, SOFIA, BG16 Mav 2026. 13:38VIVACOM, SOFIA, BG16 Mav 2026. 10.59PARKING, SOFIA, BG15 May 2026, 17:52VIMARD EOOD, SOFIA, BG15 May 2026, 08:53LIDL BALGARIYA EOOD, SOFIYA, BGR15 May 2026, 08:48LIDL BALGARIYA EOOD, SOFIYA, BGR14 May 2026, 16:10Boosteroid, Bucharest, RO14 Mav 2026 15:191CI AUDFV14 Mav 2026. 12:08FANTASTICO 43, SOFIA, BG13 May 2026, 08:46CBA EKO MARKET, SOFIA, BG12 May 2026, 08:45BGR SOFIA CBA EKO MARKET10 May 2026, 21:57IRL 08000480408 APPLE COM BILL10 May 2026, 17:16CBA ECO MARKET, SOFIA, BG10 Mav 2026 04:26CitvGate Cofia Trancit COFIA RGP09 Mav 2026. 15:45RGR SOFIA CRA ECO MARKET09 Mav 2026. 15:02VIADENTAL, SOFIA, BG88 Payments# Preparation for Refi... in 4 h 37 m100% 2• мon 1o May 10.23.10I Upload CSV^ X ClearAll Types18/ 05 /20262026-05-01 → 2026-05-18AMOUNT 1I23.03 EUR3.65 EUR36.91 EURI6.00 EUR7.98 EUR0.01 EUR87.51 EUR9.89 EUR21.60 SUP13.36 EUR3.50 EUR7.20 EUR3.99 EUR5.38 EUR160 SIIP8.87 EUR124.00 EURAll Tags@ Skip© Skip*) Skip@ Skip@Skip• Skip© SkipSkip• Skip• Skip• Skip@ Skip@ Skip*) Skin@ Skio* Skip...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50205
|
1779
|
19
|
2026-05-18T07:23:16.315787+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088996315_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDEV (-zsh)DOCKER11DOCKER (docker-compose)fd/1'2>81docker_lamp_12s DONEdocker_1amp_1' 2>&1docker_lamp_1812026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]......., '/usr/local/bin/php' 'artisan' mailbox:batch:create › '/proc/1/fd/12026-05-18 07:22:20 Running ['artisan'activity:sync 'ringcentral''a--from='2026-05-18 07:06:00'07:22:00']2026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67mS DONEdocker_lamp_12S DONEdocker_lamp_1'telus'• '/usr/local/bin/php' 'artisan'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00' > */proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:22:23Running ['artisan' twilio:recover-tracks]…...3s DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1' 2>81docker_lamp_112026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2S DONEdocker_lamp_12>&1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'docker_lamp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2sDONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]4s DONEdocker_lamp_1, '/usr/local/bin/php' 'artisan' meeting-bot:schedule-bot › */proc/1/docker_1amp_12026-05-18 07:23:07 Running ['artisan'dialers:monitor-activities].2sdocker_lamp_1, '/usr/local/bin/php' 'artisan' dialers:monitor-activities › '/proc/docker_lamp_1s]2S DONEdocker_lamp_11proc/1/fd/1' 2>&12026-05-18 07:23:10 Running ['artisan' jiminny:monitor-social-account1 '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/# Preparation for Refi... in 4 h 37 m100% <78• Mon 18 May 10:23:15DOCKER (docker-compose)O ₴2APP (-zsh)screenpipe"*3PROD (ssh)Run'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X T3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSIONView in Docker Desktop@ View ConfigEnable Watch...
|
NULL
|
-4724473484190937890
|
NULL
|
click
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDEV (-zsh)DOCKER11DOCKER (docker-compose)fd/1'2>81docker_lamp_12s DONEdocker_1amp_1' 2>&1docker_lamp_1812026-05-18 07:22:18 Running ['artisan'mailbox:batch: create]......., '/usr/local/bin/php' 'artisan' mailbox:batch:create › '/proc/1/fd/12026-05-18 07:22:20 Running ['artisan'activity:sync 'ringcentral''a--from='2026-05-18 07:06:00'07:22:00']2026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_12026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatches130.67mS DONEdocker_lamp_12S DONEdocker_lamp_1'telus'• '/usr/local/bin/php' 'artisan'activity:sync 'ringcentral' 'avaya''talkdesk' --from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00' > */proc/1/fd/1'2>&1docker_lamp_1 |2026-05-18 07:22:23Running ['artisan' twilio:recover-tracks]…...3s DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › '/proc/1/fd/1' 2>81docker_lamp_112026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2S DONEdocker_lamp_12>&1l '/usr/local/bin/php' 'artisan' dialers:sync-users › '/proc/1/fd/1'docker_lamp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2sDONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states > */proc/1/fd/1' 2>&1docker_lamp_1docker_lamp_1run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]4s DONEdocker_lamp_1, '/usr/local/bin/php' 'artisan' meeting-bot:schedule-bot › */proc/1/docker_1amp_12026-05-18 07:23:07 Running ['artisan'dialers:monitor-activities].2sdocker_lamp_1, '/usr/local/bin/php' 'artisan' dialers:monitor-activities › '/proc/docker_lamp_1s]2S DONEdocker_lamp_11proc/1/fd/1' 2>&12026-05-18 07:23:10 Running ['artisan' jiminny:monitor-social-account1 '/usr/local/bin/php' 'artisan' jiminny:monitor-social-accounts > '/# Preparation for Refi... in 4 h 37 m100% <78• Mon 18 May 10:23:15DOCKER (docker-compose)O ₴2APP (-zsh)screenpipe"*3PROD (ssh)Run'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X T3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXT (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSIONView in Docker Desktop@ View ConfigEnable Watch...
|
50204
|
NULL
|
NULL
|
NULL
|
|
50207
|
1779
|
20
|
2026-05-18T07:23:18.438911+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088998438_m1.jpg...
|
Firefox
|
Page not found · GitHub · GitHub — Personal
|
1
|
finance-hub.lakylak.xyz
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Getting Started · AFFiNE","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Getting Started · AFFiNE","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Download screenpipe — get started in minutes","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download screenpipe — get started in minutes","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Self-Hosted Software and Apps","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Self-Hosted Software and Apps","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Finance Hub","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Завеждане на щета онлайн | Euroins","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Завеждане на щета онлайн | Euroins","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Photos - Google Photos","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos - Google Photos","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.48576388,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.5086806,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.53194445,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.5552083,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5784722,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Finance Hub","depth":8,"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finance Hub","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"s","depth":9,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Payments","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Payments","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Upload CSV","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Upload CSV","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Refresh","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Display settings","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Sign out","depth":8,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Filters 2","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Filters","depth":11,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clear","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search","depth":10,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Recipient, description…","depth":10,"on_screen":true,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
7355854830669919468
|
4494879454426951425
|
click
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50208
|
1780
|
15
|
2026-05-18T07:23:18.789267+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088998789_m2.jpg...
|
Firefox
|
Finance Hub — Personal
|
1
|
finance-hub.lakylak.xyz
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…
Source
Status
Type
Tag
From date
01...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"bounds":{"left":0.5,"top":0.0518755,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"bounds":{"left":0.51329786,"top":0.06304868,"width":0.036901597,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Getting Started · AFFiNE","depth":4,"bounds":{"left":0.5,"top":0.08459697,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Getting Started · AFFiNE","depth":5,"bounds":{"left":0.51329786,"top":0.09577015,"width":0.04255319,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.5,"top":0.11731844,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.51329786,"top":0.12849163,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Download screenpipe — get started in minutes","depth":4,"bounds":{"left":0.5,"top":0.15003991,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download screenpipe — get started in minutes","depth":5,"bounds":{"left":0.51329786,"top":0.16121309,"width":0.0809508,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Self-Hosted Software and Apps","depth":4,"bounds":{"left":0.5,"top":0.18276137,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Self-Hosted Software and Apps","depth":5,"bounds":{"left":0.51329786,"top":0.19393456,"width":0.054853722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"bounds":{"left":0.5,"top":0.21548285,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Finance Hub","depth":5,"bounds":{"left":0.51329786,"top":0.22665602,"width":0.021609042,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.55651593,"top":0.22266561,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.2482043,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.25937748,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.5,"top":0.28092578,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":5,"bounds":{"left":0.51329786,"top":0.29209897,"width":0.31382978,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.5,"top":0.31364724,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":5,"bounds":{"left":0.51329786,"top":0.32482043,"width":0.19414894,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Завеждане на щета онлайн | Euroins","depth":4,"bounds":{"left":0.5,"top":0.3463687,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Завеждане на щета онлайн | Euroins","depth":5,"bounds":{"left":0.51329786,"top":0.3575419,"width":0.0653258,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Photos - Google Photos","depth":4,"bounds":{"left":0.5,"top":0.3790902,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos - Google Photos","depth":5,"bounds":{"left":0.51329786,"top":0.39026338,"width":0.04138963,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.41181165,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.42298484,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.5028258,"top":0.4461293,"width":0.06333112,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.5028258,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.51379657,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.5249335,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.53607047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5472075,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Finance Hub","depth":8,"bounds":{"left":0.5962433,"top":0.0622506,"width":0.032081116,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finance Hub","depth":9,"bounds":{"left":0.5962433,"top":0.06264964,"width":0.032081116,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":9,"bounds":{"left":0.5962433,"top":0.07861133,"width":0.0048204786,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":9,"bounds":{"left":0.60106385,"top":0.07861133,"width":0.022273935,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"s","depth":9,"bounds":{"left":0.62333775,"top":0.07861133,"width":0.0019946808,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Payments","depth":8,"bounds":{"left":0.7506649,"top":0.06384677,"width":0.036070477,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Payments","depth":10,"bounds":{"left":0.7613032,"top":0.0698324,"width":0.02144282,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Upload CSV","depth":8,"bounds":{"left":0.78740025,"top":0.06384677,"width":0.04105718,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Upload CSV","depth":10,"bounds":{"left":0.79803854,"top":0.0698324,"width":0.02642952,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Refresh","depth":8,"bounds":{"left":0.9506317,"top":0.06384677,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Display settings","depth":8,"bounds":{"left":0.96326464,"top":0.06384677,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Sign out","depth":8,"bounds":{"left":0.9758976,"top":0.06384677,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Filters 2","depth":9,"bounds":{"left":0.58793217,"top":0.1300878,"width":0.3698471,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Filters","depth":11,"bounds":{"left":0.5959109,"top":0.13128492,"width":0.013630319,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":10,"bounds":{"left":0.61419547,"top":0.132083,"width":0.002493351,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Clear","depth":9,"bounds":{"left":0.96043885,"top":0.12849163,"width":0.02044548,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Clear","depth":10,"bounds":{"left":0.9684175,"top":0.132083,"width":0.009807181,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Search","depth":10,"bounds":{"left":0.58793217,"top":0.16799681,"width":0.013297873,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXTextField","text":"Recipient, description…","depth":10,"bounds":{"left":0.58793217,"top":0.18355946,"width":0.3929521,"height":0.030327214},"on_screen":true,"help_text":"","role_description":"text field","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Source","depth":10,"bounds":{"left":0.58793217,"top":0.22386272,"width":0.013464096,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Status","depth":10,"bounds":{"left":0.6871675,"top":0.22386272,"width":0.012466756,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Type","depth":10,"bounds":{"left":0.78640294,"top":0.22386272,"width":0.009474734,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Tag","depth":10,"bounds":{"left":0.8856383,"top":0.22386272,"width":0.006981383,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"From date","depth":10,"bounds":{"left":0.58793217,"top":0.2773344,"width":0.019448139,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"01","depth":11,"bounds":{"left":0.59325135,"top":0.30127692,"width":0.004986702,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-6781581409061280090
|
3344236103553117953
|
visual_change
|
accessibility
|
NULL
|
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction
s
Payments
Payments
Upload CSV
Upload CSV
Refresh
Display settings
Sign out
Filters 2
Filters
2
Clear
Clear
Search
Recipient, description…
Source
Status
Type
Tag
From date
01...
|
50206
|
NULL
|
NULL
|
NULL
|
|
50210
|
1780
|
16
|
2026-05-18T07:23:19.691278+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088999691_m2.jpg...
|
Firefox
|
Finance Hub — Personal
|
1
|
finance-hub.lakylak.xyz
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS- New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"New Tab","depth":4,"bounds":{"left":0.5728058,"top":0.41899443,"width":0.015458777,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"about:newtab","depth":4,"bounds":{"left":0.5728058,"top":0.42976856,"width":0.023936171,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"bounds":{"left":0.5,"top":0.0518755,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"bounds":{"left":0.51329786,"top":0.06304868,"width":0.036901597,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Getting Started · AFFiNE","depth":4,"bounds":{"left":0.5,"top":0.08459697,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Getting Started · AFFiNE","depth":5,"bounds":{"left":0.51329786,"top":0.09577015,"width":0.04255319,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"bounds":{"left":0.5,"top":0.11731844,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"bounds":{"left":0.51329786,"top":0.12849163,"width":0.037898935,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Download screenpipe — get started in minutes","depth":4,"bounds":{"left":0.5,"top":0.15003991,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download screenpipe — get started in minutes","depth":5,"bounds":{"left":0.51329786,"top":0.16121309,"width":0.0809508,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Self-Hosted Software and Apps","depth":4,"bounds":{"left":0.5,"top":0.18276137,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Self-Hosted Software and Apps","depth":5,"bounds":{"left":0.51329786,"top":0.19393456,"width":0.054853722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"bounds":{"left":0.5,"top":0.21548285,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Finance Hub","depth":5,"bounds":{"left":0.51329786,"top":0.22665602,"width":0.021609042,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.55651593,"top":0.22266561,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.2482043,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.25937748,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.5,"top":0.28092578,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":5,"bounds":{"left":0.51329786,"top":0.29209897,"width":0.31382978,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":4,"bounds":{"left":0.5,"top":0.31364724,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":5,"bounds":{"left":0.51329786,"top":0.32482043,"width":0.19414894,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Завеждане на щета онлайн | Euroins","depth":4,"bounds":{"left":0.5,"top":0.3463687,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Завеждане на щета онлайн | Euroins","depth":5,"bounds":{"left":0.51329786,"top":0.3575419,"width":0.0653258,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Photos - Google Photos","depth":4,"bounds":{"left":0.5,"top":0.3790902,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos - Google Photos","depth":5,"bounds":{"left":0.51329786,"top":0.39026338,"width":0.04138963,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"bounds":{"left":0.5,"top":0.41181165,"width":0.06881649,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"bounds":{"left":0.51329786,"top":0.42298484,"width":0.014960106,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.55651593,"top":0.41899443,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.5028258,"top":0.4461293,"width":0.06333112,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.5028258,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.51379657,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.5249335,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.53607047,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Bitwarden","depth":6,"bounds":{"left":0.5472075,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Finance Hub","depth":8,"bounds":{"left":0.5962433,"top":0.0622506,"width":0.032081116,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Finance Hub","depth":9,"bounds":{"left":0.5962433,"top":0.06264964,"width":0.032081116,"height":0.015163607},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"78","depth":9,"bounds":{"left":0.5962433,"top":0.07861133,"width":0.0048204786,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"transaction","depth":9,"bounds":{"left":0.60106385,"top":0.07861133,"width":0.022273935,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-8696404950026985199
|
4501660280074399497
|
click
|
accessibility
|
NULL
|
New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS- New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)
Bitwarden
Finance Hub
Finance Hub
78
transaction...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50209
|
1779
|
21
|
2026-05-18T07:23:19.710910+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779088999710_m1.jpg...
|
Firefox
|
Finance Hub — Personal
|
1
|
finance-hub.lakylak.xyz
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS- New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
[{"role":"AXStaticText","text& [{"role":"AXStaticText","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"about:newtab","depth":4,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"DXP4800PLUS-B5F8","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"DXP4800PLUS-B5F8","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Getting Started · AFFiNE","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Getting Started · AFFiNE","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Screenpipe — Archive","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Screenpipe — Archive","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Download screenpipe — get started in minutes","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Download screenpipe — get started in minutes","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Self-Hosted Software and Apps","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Self-Hosted Software and Apps","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Finance Hub","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Finance Hub","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New Tab","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - kovaliklukas@gmail.com - Gmail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Завеждане на щета онлайн | Euroins","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Завеждане на щета онлайн | Euroins","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Photos - Google Photos","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Photos - Google Photos","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.48576388,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.5086806,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.53194445,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.5552083,"top":0.0,"width":0.022222223,"height":0.035555556},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
5704605095524851909
|
4492653080819656449
|
click
|
accessibility
|
NULL
|
New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS- New Tab
about:newtab
DXP4800PLUS-B5F8
DXP4800PLUS-B5F8
Getting Started · AFFiNE
Getting Started · AFFiNE
Screenpipe — Archive
Screenpipe — Archive
Download screenpipe — get started in minutes
Download screenpipe — get started in minutes
Self-Hosted Software and Apps
Self-Hosted Software and Apps
Finance Hub
Finance Hub
Close tab
New Tab
New Tab
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
As I get older, now 79, I am viewing, seeing or realizing more and more disturbing things that are finally hitting home more profoundly and affecti... - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
New jobs similar to Уеб Програмист/ PHP at M3 Communications Group, Inc. - [EMAIL] - Gmail
Завеждане на щета онлайн | Euroins
Завеждане на щета онлайн | Euroins
Photos - Google Photos
Photos - Google Photos
New Tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Open history (⇧⌘H)
Open bookmarks (⌘B)...
|
50207
|
NULL
|
NULL
|
NULL
|
|
50212
|
1780
|
17
|
2026-05-18T07:23:21.148065+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779089001148_m2.jpg...
|
Firefox
|
JY 20893 chunk control per update target by Vasil- JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app — Work...
|
1
|
github.com/jiminny/app/pull/12086
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.06304868,"width":0.10106383,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.09577015,"width":0.15658244,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"bounds":{"left":0.0,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.12849163,"width":0.064494684,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"bounds":{"left":0.0,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.16121309,"width":0.18068483,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"bounds":{"left":0.0,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"bounds":{"left":0.013297873,"top":0.19393456,"width":0.029920213,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"bounds":{"left":0.0,"top":0.21548285,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.22665602,"width":0.09158909,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2482043,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.25937748,"width":0.039228722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.28092578,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.29209897,"width":0.042719416,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.31364724,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.32482043,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"bounds":{"left":0.0,"top":0.3463687,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"bounds":{"left":0.013297873,"top":0.3575419,"width":0.07679521,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"bounds":{"left":0.0,"top":0.3790902,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"bounds":{"left":0.013297873,"top":0.39026338,"width":0.08543883,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.41181165,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.013297873,"top":0.42298484,"width":0.21791889,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.4445331,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4557063,"width":0.04537899,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"bounds":{"left":0.0,"top":0.4772546,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.4884278,"width":0.15259309,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.509976,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.5211492,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.54269755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.55387074,"width":0.16472739,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.54988027,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-8504951575630997336
|
-8051011264739348146
|
click
|
accessibility
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab...
|
50210
|
NULL
|
NULL
|
NULL
|
|
50211
|
1779
|
22
|
2026-05-18T07:23:21.148089+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779089001148_m1.jpg...
|
Firefox
|
JY 20893 chunk control per update target by Vasil- JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app — Work...
|
1
|
github.com/jiminny/app/pull/12086
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":4,"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":5,"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false}]...
|
-8504951575630997336
|
-8051011264739348146
|
click
|
accessibility
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50213
|
1780
|
18
|
2026-05-18T07:23:21.865061+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779089001865_m2.jpg...
|
Firefox
|
JY 20893 chunk control per update target by Vasil- JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app — Work...
|
1
|
github.com/jiminny/app/pull/12086
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
All issues(g then i)
All pull requests
All repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (29)
Pull requests
(
29
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality
Security and quality
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Review requested
Review requested
Vasil-Jiminny
Vasil-Jiminny
requested your review on this pull request.
Add your review
Add your review
JY 20893 chunk control per update target #12086 Edit title
JY 20893 chunk control per update target
#
12086
Edit title
Checks pending
Checks pending
Code
Code
Open
Vasil-Jiminny
Vasil-Jiminny
wants to merge 17 commits into
master
master
from
JY-20893-chunk-control-per-update-target
JY-20893-chunk-control-per-update-target
Copy head branch name to clipboard
Lines changed: 158 additions & 35 deletions
Conversation (15)
Conversation
(
15
)
Commits (17)
Commits
(
17
)
Checks (2)
Checks
(
2
)
Files changed (6)
Files changed
(
6
)
Conversation
Conversation
@Vasil-Jiminny
Show options
Vasil-Jiminny commented 3 days ago •
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
•
edited
edited
JIRA: JY-20893
JIRA:
JY-20893
JY-20893
Changes:
Changes:
Add a dedicated class to keep the chunk sizes for various updated targets for ES.
Update user classes and tests.
Drop obsolete constants.
Chunking algorithm tested with full local reset - works as expected.
Add or remove reactions
Vasil-Jiminny
Vasil-Jiminny
added
4
commits
3 days ago
3 days ago
@Vasil-Jiminny
Introduce ChunkSize to control the size of a chunk per update target.
Introduce ChunkSize to control the size of a chunk per update target.
731bdb6
731bdb6
@Vasil-Jiminny
SelectionListTest uses ChunkSize.
SelectionListTest uses ChunkSize.
6cda5d1
6cda5d1
@Vasil-Jiminny
SelectionList drop reference to TargetEntitiesSelector::ES_CHUNK_SIZE
SelectionList drop reference to
TargetEntitiesSelector::ES_CHUNK_SIZE
52848f5
52848f5
@Vasil-Jiminny
Update TargetEntitiesSelector to use ChunkSize instead of internal co…
Update TargetEntitiesSelector to use ChunkSize instead of internal co…
Commit message body
8 / 10 checks OK
f32fb68
f32fb68
@Vasil-Jiminny
Show options
Author
Vasil-Jiminny commented 3 days ago
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
@claude
@claude
Add or remove reactions
react with eyes
👀
1
@claude
This comment was marked as outdated. Show comment
This comment was marked as outdated.
This comment was marked as outdated.
Show comment
@Vasil-Jiminny
Remove an unused import.
Remove an unused import.
8715e69
8715e69
@Vasil-Jiminny
Show options
Author
Vasil-Jiminny commented 3 days ago
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
@claude
@claude
The changes in this PR are part of a series of PRs. Currently the SelectionList class requires something to provide a default value for the chunk size comparison. Within the next revision this class will be revised, and the constructor will be removed entirely in favor of accessor methods, including one about chunk size.
Rules such as adding comments, or using final are mostly dedicated to code generated by a model. The current changes are done by me (as part of a larger functional change), so they are okay.
Currently we use actively only one update targets - activity. Opportunity will have support added soon, hence why it is in the allowed list. All other options are currently not supported, and actively planned, but were intentionally added as potential candidates for future developments, if deemed necesary.
Add or remove reactions
react with eyes
👀
1
@Vasil-Jiminny
Remove comments.
Remove comments.
8 / 10 checks OK
36ce6e8
36ce6e8
@claude
This comment was marked as outdated. Show comment
This comment was marked as outdated.
This comment was marked as outdated.
Show comment
Vasil-Jiminny
Vasil-Jiminny
added
2
commits
3 days ago
3 days ago...
|
[{"role":"AXRadioButton","text [{"role":"AXRadioButton","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":4,"bounds":{"left":0.0,"top":0.0518755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.06304868,"width":0.10106383,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.08459697,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.09577015,"width":0.15658244,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20891] Sidekick SMS issue - Jira","depth":4,"bounds":{"left":0.0,"top":0.11731844,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20891] Sidekick SMS issue - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.12849163,"width":0.064494684,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":4,"bounds":{"left":0.0,"top":0.15003991,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.16121309,"width":0.18068483,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Usage | Windsurf","depth":4,"bounds":{"left":0.0,"top":0.18276137,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Usage | Windsurf","depth":5,"bounds":{"left":0.013297873,"top":0.19393456,"width":0.029920213,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":4,"bounds":{"left":0.0,"top":0.21548285,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[SRD-6853] Moxso - Potential deal stages bug - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.22665602,"width":0.09158909,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipelines - jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.2482043,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipelines - jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.25937748,"width":0.039228722,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Feed — jiminny — Sentry","depth":4,"bounds":{"left":0.0,"top":0.28092578,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Feed — jiminny — Sentry","depth":5,"bounds":{"left":0.013297873,"top":0.29209897,"width":0.042719416,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.31364724,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.32482043,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pipedrive API Reference and Documentation","depth":4,"bounds":{"left":0.0,"top":0.3463687,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pipedrive API Reference and Documentation","depth":5,"bounds":{"left":0.013297873,"top":0.3575419,"width":0.07679521,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":4,"bounds":{"left":0.0,"top":0.3790902,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"pipedrive/client-php: Pipedrive API client for PHP","depth":5,"bounds":{"left":0.013297873,"top":0.39026338,"width":0.08543883,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":4,"bounds":{"left":0.0,"top":0.41181165,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - lukas.kovalik@jiminny.com - Jiminny Mail","depth":5,"bounds":{"left":0.013297873,"top":0.42298484,"width":0.21791889,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Pull requests · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.4445331,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.4557063,"width":0.04537899,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":4,"bounds":{"left":0.0,"top":0.4772546,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.4884278,"width":0.15259309,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":4,"bounds":{"left":0.0,"top":0.509976,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"[JY-20906] Review of Pipedrive SDK - Jira","depth":5,"bounds":{"left":0.013297873,"top":0.5211492,"width":0.07413564,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":4,"bounds":{"left":0.0,"top":0.54269755,"width":0.07962101,"height":0.032721467},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app","depth":5,"bounds":{"left":0.013297873,"top":0.55387074,"width":0.16472739,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Close tab","depth":5,"bounds":{"left":0.06732048,"top":0.54988027,"width":0.007978723,"height":0.01915403},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"New Tab","depth":4,"bounds":{"left":0.0028257978,"top":0.57701516,"width":0.07413564,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Customize sidebar","depth":6,"bounds":{"left":0.0028257978,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open Google Gemini (⌃X)","depth":6,"bounds":{"left":0.013796543,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Tabs from other devices","depth":6,"bounds":{"left":0.024933511,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open history (⇧⌘H)","depth":6,"bounds":{"left":0.036070477,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXCheckBox","text":"Open bookmarks (⌘B)","depth":6,"bounds":{"left":0.04720745,"top":0.97007185,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Skip to content","depth":6,"bounds":{"left":0.07962101,"top":0.0518755,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Skip to content","depth":7,"bounds":{"left":0.07962101,"top":0.05347167,"width":0.0029920214,"height":0.21468475},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Open menu","depth":10,"bounds":{"left":0.08494016,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Homepage (g then d)","depth":9,"bounds":{"left":0.099567816,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"jiminny","depth":12,"bounds":{"left":0.112865694,"top":0.06464485,"width":0.018949468,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"jiminny","depth":14,"bounds":{"left":0.11486037,"top":0.07063048,"width":0.014960106,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"app","depth":12,"bounds":{"left":0.13680187,"top":0.06464485,"width":0.017785905,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"app","depth":14,"bounds":{"left":0.13879654,"top":0.07063048,"width":0.008477394,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Search or jump to…","depth":9,"bounds":{"left":0.81698805,"top":0.06464485,"width":0.06565824,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Type","depth":12,"bounds":{"left":0.82928854,"top":0.07063048,"width":0.011801862,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"/","depth":12,"bounds":{"left":0.8424202,"top":0.07222666,"width":0.002493351,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"to search","depth":12,"bounds":{"left":0.84640956,"top":0.07063048,"width":0.021276595,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Chat with Copilot","depth":10,"bounds":{"left":0.88464093,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXMenuButton","text":"Open Copilot…","depth":9,"bounds":{"left":0.8949468,"top":0.06464485,"width":0.008643617,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXMenuButton","text":"Create new...","depth":9,"bounds":{"left":0.9115692,"top":0.06464485,"width":0.01662234,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"All issues(g then i)","depth":9,"bounds":{"left":0.93085104,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"All pull requests","depth":9,"bounds":{"left":0.94414896,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"All repositories","depth":9,"bounds":{"left":0.9574468,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"You have unread notifications(g then n)","depth":9,"bounds":{"left":0.97074467,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Open user navigation menu","depth":9,"bounds":{"left":0.9840425,"top":0.06464485,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Repository navigation","depth":9,"bounds":{"left":0.079288565,"top":0.051077414,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Repository navigation","depth":10,"bounds":{"left":0.079288565,"top":0.05387071,"width":0.0787899,"height":0.023144454},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Code","depth":12,"bounds":{"left":0.08494016,"top":0.09936153,"width":0.025099734,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Code","depth":14,"bounds":{"left":0.095744684,"top":0.10574621,"width":0.011469414,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Pull requests (29)","depth":12,"bounds":{"left":0.11269947,"top":0.09936153,"width":0.05501995,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Pull requests","depth":14,"bounds":{"left":0.12333777,"top":0.10574621,"width":0.02925532,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":14,"bounds":{"left":0.15525267,"top":0.113727055,"width":0.0029920214,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"29","depth":14,"bounds":{"left":0.15824468,"top":0.113727055,"width":0.0056515955,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":14,"bounds":{"left":0.16389628,"top":0.113727055,"width":0.0018284575,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Agents","depth":12,"bounds":{"left":0.17037898,"top":0.09936153,"width":0.029089095,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Agents","depth":14,"bounds":{"left":0.18151596,"top":0.10574621,"width":0.014960106,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Actions","depth":12,"bounds":{"left":0.20212767,"top":0.09936153,"width":0.03025266,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Actions","depth":14,"bounds":{"left":0.21326463,"top":0.10574621,"width":0.016123671,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Wiki","depth":12,"bounds":{"left":0.23503989,"top":0.09936153,"width":0.023105053,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Wiki","depth":14,"bounds":{"left":0.24601063,"top":0.10574621,"width":0.009142287,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Security and quality","depth":12,"bounds":{"left":0.26080453,"top":0.09936153,"width":0.058011968,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Security and quality","depth":14,"bounds":{"left":0.27244017,"top":0.10574621,"width":0.042719416,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Insights","depth":12,"bounds":{"left":0.32147607,"top":0.09936153,"width":0.03125,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Insights","depth":14,"bounds":{"left":0.33277926,"top":0.10574621,"width":0.016788565,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Settings","depth":12,"bounds":{"left":0.35538563,"top":0.09936153,"width":0.032081116,"height":0.026336791},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Settings","depth":14,"bounds":{"left":0.3665226,"top":0.10574621,"width":0.017785905,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Important update","depth":10,"bounds":{"left":0.09325133,"top":0.14365523,"width":0.0003324468,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Important update","depth":11,"bounds":{"left":0.09325133,"top":0.1452514,"width":0.039228722,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.","depth":10,"bounds":{"left":0.09325133,"top":0.1452514,"width":0.2159242,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Review this update","depth":10,"bounds":{"left":0.30917552,"top":0.1452514,"width":0.04055851,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Review this update","depth":11,"bounds":{"left":0.30917552,"top":0.1452514,"width":0.04055851,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"and manage your preferences in your","depth":10,"bounds":{"left":0.34973404,"top":0.1452514,"width":0.08261303,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"GitHub account settings","depth":10,"bounds":{"left":0.4323471,"top":0.1452514,"width":0.05219415,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"GitHub account settings","depth":11,"bounds":{"left":0.4323471,"top":0.1452514,"width":0.05219415,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":".","depth":10,"bounds":{"left":0.48454124,"top":0.1452514,"width":0.0013297872,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Dismiss banner","depth":9,"bounds":{"left":0.98636967,"top":0.13886672,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXHeading","text":"Review requested","depth":15,"bounds":{"left":0.35006648,"top":0.2019154,"width":0.0003324468,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Review requested","depth":16,"bounds":{"left":0.35006648,"top":0.20351157,"width":0.039893616,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"bounds":{"left":0.35006648,"top":0.20351157,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"bounds":{"left":0.35006648,"top":0.20351157,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"requested your review on this pull request.","depth":15,"bounds":{"left":0.38148272,"top":0.20351157,"width":0.09158909,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Add your review","depth":14,"bounds":{"left":0.70212764,"top":0.19872306,"width":0.036901597,"height":0.022346368},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Add your review","depth":16,"bounds":{"left":0.70511967,"top":0.20391062,"width":0.030917553,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"JY 20893 chunk control per update target #12086 Edit title","depth":13,"bounds":{"left":0.33776596,"top":0.24221867,"width":0.2421875,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JY 20893 chunk control per update target","depth":14,"bounds":{"left":0.33776596,"top":0.24301676,"width":0.19082446,"height":0.030327214},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"#","depth":15,"bounds":{"left":0.53125,"top":0.24301676,"width":0.006482713,"height":0.030327214},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"12086","depth":15,"bounds":{"left":0.5377327,"top":0.24301676,"width":0.03025266,"height":0.030327214},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Edit title","depth":14,"bounds":{"left":0.56931514,"top":0.24541101,"width":0.010638298,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Checks pending","depth":13,"bounds":{"left":0.6590758,"top":0.24860336,"width":0.052027926,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks pending","depth":15,"bounds":{"left":0.67137635,"top":0.254589,"width":0.035405584,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXMenuButton","text":"Code","depth":13,"bounds":{"left":0.7137633,"top":0.24860336,"width":0.02825798,"height":0.025538707},"on_screen":true,"help_text":"","role_description":"menu button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Code","depth":15,"bounds":{"left":0.7180851,"top":0.254589,"width":0.011635638,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Open","depth":13,"bounds":{"left":0.34840426,"top":0.28651237,"width":0.011968086,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"bounds":{"left":0.36702126,"top":0.28332004,"width":0.030086435,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"bounds":{"left":0.36702126,"top":0.2849162,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"wants to merge 17 commits into","depth":15,"bounds":{"left":0.3984375,"top":0.2849162,"width":0.068317816,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"master","depth":15,"bounds":{"left":0.4680851,"top":0.282921,"width":0.018450798,"height":0.017557861},"on_screen":true,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"master","depth":16,"bounds":{"left":0.47007978,"top":0.28611332,"width":0.014461436,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"from","depth":16,"bounds":{"left":0.4878657,"top":0.2849162,"width":0.009973404,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20893-chunk-control-per-update-target","depth":16,"bounds":{"left":0.49916887,"top":0.282921,"width":0.09990027,"height":0.017557861},"on_screen":true,"role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20893-chunk-control-per-update-target","depth":17,"bounds":{"left":0.50116354,"top":0.28611332,"width":0.09591091,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Copy head branch name to clipboard","depth":16,"bounds":{"left":0.60039896,"top":0.28052673,"width":0.00930851,"height":0.022346368},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Lines changed: 158 additions & 35 deletions","depth":14,"bounds":{"left":0.7072806,"top":0.3367917,"width":0.019946808,"height":0.11412609},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Conversation (15)","depth":16,"bounds":{"left":0.33776596,"top":0.31883478,"width":0.05668218,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":true},{"role":"AXStaticText","text":"Conversation","depth":17,"bounds":{"left":0.35006648,"top":0.32841182,"width":0.028091755,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.39012632,"top":0.32841182,"width":0.0029920214,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"15","depth":18,"bounds":{"left":0.39311835,"top":0.32841182,"width":0.004986702,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"bounds":{"left":0.39810506,"top":0.32841182,"width":0.0016622341,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Commits (17)","depth":16,"bounds":{"left":0.39444813,"top":0.31883478,"width":0.04737367,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Commits","depth":17,"bounds":{"left":0.40674868,"top":0.32841182,"width":0.019115692,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.4375,"top":0.32841182,"width":0.0029920214,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"17","depth":18,"bounds":{"left":0.44049203,"top":0.32841182,"width":0.004654255,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"bounds":{"left":0.44514626,"top":0.32841182,"width":0.0016622341,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Checks (2)","depth":16,"bounds":{"left":0.4418218,"top":0.31883478,"width":0.042386968,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Checks","depth":17,"bounds":{"left":0.45412233,"top":0.32841182,"width":0.015791224,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.47988698,"top":0.32841182,"width":0.0028257978,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":18,"bounds":{"left":0.48271278,"top":0.32841182,"width":0.0028257978,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"bounds":{"left":0.48553857,"top":0.32841182,"width":0.0016622341,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXRadioButton","text":"Files changed (6)","depth":16,"bounds":{"left":0.48420876,"top":0.31883478,"width":0.056349736,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"tab","subrole":"AXTabButton","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Files changed","depth":17,"bounds":{"left":0.4965093,"top":0.32841182,"width":0.029753989,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"(","depth":18,"bounds":{"left":0.5362367,"top":0.32841182,"width":0.0029920214,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"6","depth":18,"bounds":{"left":0.53922874,"top":0.32841182,"width":0.0028257978,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":")","depth":18,"bounds":{"left":0.54205453,"top":0.32841182,"width":0.0018284575,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Conversation","depth":12,"bounds":{"left":0.33776596,"top":0.3643256,"width":0.0003324468,"height":0.0007980846},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Conversation","depth":13,"bounds":{"left":0.33776596,"top":0.36711892,"width":0.048204787,"height":0.023144454},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.33776596,"top":0.3643256,"width":0.013297873,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show options","depth":15,"bounds":{"left":0.61136967,"top":0.3651237,"width":0.007978723,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"Vasil-Jiminny commented 3 days ago •","depth":14,"bounds":{"left":0.3620346,"top":0.3651237,"width":0.24135639,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":16,"bounds":{"left":0.3620346,"top":0.37310454,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":17,"bounds":{"left":0.3620346,"top":0.37310454,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"commented","depth":15,"bounds":{"left":0.3934508,"top":0.37310454,"width":0.025598405,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"3 days ago","depth":15,"bounds":{"left":0.42037898,"top":0.3715084,"width":0.023603724,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 days ago","depth":17,"bounds":{"left":0.42037898,"top":0.37310454,"width":0.023603724,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"•","depth":17,"bounds":{"left":0.4453125,"top":0.37310454,"width":0.0019946808,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"edited","depth":17,"bounds":{"left":0.44863698,"top":0.3715084,"width":0.020279255,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"edited","depth":19,"bounds":{"left":0.44863698,"top":0.37310454,"width":0.014960106,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"JIRA: JY-20893","depth":16,"bounds":{"left":0.3620346,"top":0.40822026,"width":0.25731382,"height":0.017557861},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"JIRA:","depth":17,"bounds":{"left":0.3620346,"top":0.4086193,"width":0.015791224,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"JY-20893","depth":17,"bounds":{"left":0.3778258,"top":0.4086193,"width":0.027759308,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"JY-20893","depth":18,"bounds":{"left":0.3778258,"top":0.4086193,"width":0.027759308,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Changes:","depth":16,"bounds":{"left":0.3620346,"top":0.44493216,"width":0.25731382,"height":0.01396648},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Changes:","depth":17,"bounds":{"left":0.3620346,"top":0.44493216,"width":0.021110373,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Add a dedicated class to keep the chunk sizes for various updated targets for ES.","depth":19,"bounds":{"left":0.3700133,"top":0.47326416,"width":0.17453457,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Update user classes and tests.","depth":19,"bounds":{"left":0.3700133,"top":0.5027933,"width":0.065990694,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Drop obsolete constants.","depth":19,"bounds":{"left":0.3700133,"top":0.5323224,"width":0.054022606,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Chunking algorithm tested with full local reset - works as expected.","depth":19,"bounds":{"left":0.3700133,"top":0.56185156,"width":0.14461437,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add or remove reactions","depth":16,"bounds":{"left":0.3620346,"top":0.60255384,"width":0.008643617,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"Vasil-Jiminny","depth":14,"bounds":{"left":0.3700133,"top":0.6679968,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":15,"bounds":{"left":0.3700133,"top":0.6679968,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"added","depth":14,"bounds":{"left":0.40009972,"top":0.6679968,"width":0.016289894,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"4","depth":14,"bounds":{"left":0.4163896,"top":0.6679968,"width":0.0028257978,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"commits","depth":14,"bounds":{"left":0.4192154,"top":0.6679968,"width":0.020944148,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"3 days ago","depth":14,"bounds":{"left":0.4401596,"top":0.6679968,"width":0.023603724,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 days ago","depth":16,"bounds":{"left":0.4401596,"top":0.6679968,"width":0.023603724,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.3700133,"top":0.70790106,"width":0.0066489363,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Introduce ChunkSize to control the size of a chunk per update target.","depth":14,"bounds":{"left":0.37865692,"top":0.7114924,"width":0.1653923,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Introduce ChunkSize to control the size of a chunk per update target.","depth":15,"bounds":{"left":0.37865692,"top":0.7114924,"width":0.1653923,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"731bdb6","depth":14,"bounds":{"left":0.6080452,"top":0.7114924,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"731bdb6","depth":15,"bounds":{"left":0.6080452,"top":0.7114924,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.3700133,"top":0.74940145,"width":0.0066489363,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"SelectionListTest uses ChunkSize.","depth":14,"bounds":{"left":0.37865692,"top":0.7529928,"width":0.07912234,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SelectionListTest uses ChunkSize.","depth":15,"bounds":{"left":0.37865692,"top":0.7529928,"width":0.07912234,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"6cda5d1","depth":14,"bounds":{"left":0.6080452,"top":0.7529928,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"6cda5d1","depth":15,"bounds":{"left":0.6080452,"top":0.7529928,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.3700133,"top":0.7781325,"width":0.0066489363,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"SelectionList drop reference to TargetEntitiesSelector::ES_CHUNK_SIZE","depth":14,"bounds":{"left":0.37865692,"top":0.78172386,"width":0.15924202,"height":0.011572227},"on_screen":true,"help_text":"SelectionList drop reference to `TargetEntitiesSelector::ES_CHUNK_SIZE`","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"SelectionList drop reference to","depth":15,"bounds":{"left":0.37865692,"top":0.78172386,"width":0.07662899,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"TargetEntitiesSelector::ES_CHUNK_SIZE","depth":16,"bounds":{"left":0.4566157,"top":0.78252196,"width":0.079953454,"height":0.010774142},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"52848f5","depth":14,"bounds":{"left":0.6080452,"top":0.78172386,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"52848f5","depth":15,"bounds":{"left":0.6080452,"top":0.78172386,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.3700133,"top":0.80686355,"width":0.0066489363,"height":0.015961692},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Update TargetEntitiesSelector to use ChunkSize instead of internal co…","depth":14,"bounds":{"left":0.37865692,"top":0.8104549,"width":0.16788563,"height":0.011572227},"on_screen":true,"help_text":"Update TargetEntitiesSelector to use ChunkSize instead of internal const. Update test","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Update TargetEntitiesSelector to use ChunkSize instead of internal co…","depth":15,"bounds":{"left":0.37865692,"top":0.8104549,"width":0.16788563,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Commit message body","depth":14,"bounds":{"left":0.5505319,"top":0.81085396,"width":0.006981383,"height":0.009577015},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXButton","text":"8 / 10 checks OK","depth":14,"bounds":{"left":0.60139626,"top":0.80686355,"width":0.005319149,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"f32fb68","depth":14,"bounds":{"left":0.6080452,"top":0.8104549,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"f32fb68","depth":15,"bounds":{"left":0.6080452,"top":0.8104549,"width":0.016954787,"height":0.011572227},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":13,"bounds":{"left":0.33776596,"top":0.8539505,"width":0.013297873,"height":0.031923383},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show options","depth":14,"bounds":{"left":0.61136967,"top":0.8547486,"width":0.007978723,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Author","depth":15,"bounds":{"left":0.5934175,"top":0.8639266,"width":0.012965426,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Vasil-Jiminny commented 3 days ago","depth":13,"bounds":{"left":0.3620346,"top":0.8547486,"width":0.22240691,"height":0.02952913},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"bounds":{"left":0.3620346,"top":0.86272943,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"bounds":{"left":0.3620346,"top":0.86272943,"width":0.030086435,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"commented","depth":14,"bounds":{"left":0.3934508,"top":0.86272943,"width":0.025598405,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"3 days ago","depth":14,"bounds":{"left":0.42037898,"top":0.8611333,"width":0.023603724,"height":0.016759777},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 days ago","depth":16,"bounds":{"left":0.42037898,"top":0.86272943,"width":0.023603724,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@claude","depth":17,"bounds":{"left":0.3620346,"top":0.89944136,"width":0.019115692,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"@claude","depth":18,"bounds":{"left":0.3620346,"top":0.89944136,"width":0.019115692,"height":0.013567438},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add or remove reactions","depth":15,"bounds":{"left":0.3620346,"top":0.9273743,"width":0.008643617,"height":0.0207502},"on_screen":true,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"react with eyes","depth":14,"bounds":{"left":0.37200797,"top":0.9273743,"width":0.013796543,"height":0.0207502},"on_screen":true,"role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"👀","depth":16,"bounds":{"left":0.37416887,"top":0.9325619,"width":0.004155585,"height":0.012769354},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"bounds":{"left":0.38098404,"top":0.9325619,"width":0.0018284575,"height":0.011971269},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@claude","depth":13,"bounds":{"left":0.33776596,"top":0.98723066,"width":0.013297873,"height":0.0127693415},"on_screen":true,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"This comment was marked as outdated. Show comment","depth":14,"bounds":{"left":0.3567154,"top":0.9880287,"width":0.2679521,"height":0.011971295},"on_screen":true,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"This comment was marked as outdated.","depth":15,"bounds":{"left":0.359375,"top":0.9880287,"width":0.22689494,"height":0.011971295},"on_screen":true,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This comment was marked as outdated.","depth":16,"bounds":{"left":0.359375,"top":0.9960096,"width":0.08543883,"height":0.0039904118},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Show comment","depth":16,"bounds":{"left":0.5929189,"top":0.9972067,"width":0.029089095,"height":0.002793312},"on_screen":true,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"bounds":{"left":0.3700133,"top":1.0,"width":0.0066489363,"height":-0.048683167},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Remove an unused import.","depth":14,"bounds":{"left":0.37865692,"top":1.0,"width":0.057513297,"height":-0.052274585},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Remove an unused import.","depth":15,"bounds":{"left":0.37865692,"top":1.0,"width":0.057513297,"height":-0.052274585},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"8715e69","depth":14,"bounds":{"left":0.6080452,"top":1.0,"width":0.016954787,"height":-0.052274585},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"8715e69","depth":15,"bounds":{"left":0.6080452,"top":1.0,"width":0.016954787,"height":-0.052274585},"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":13,"bounds":{"left":0.33776596,"top":1.0,"width":0.013297873,"height":-0.09577012},"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"Show options","depth":14,"bounds":{"left":0.61136967,"top":1.0,"width":0.007978723,"height":-0.09656823},"on_screen":false,"help_text":"","role_description":"button","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXStaticText","text":"Author","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXHeading","text":"Vasil-Jiminny commented 3 days ago","depth":13,"bounds":{"left":0.3620346,"top":1.0,"width":0.22240691,"height":-0.09656823},"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":15,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"commented","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"3 days ago","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 days ago","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@claude","depth":17,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"@claude","depth":18,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"The changes in this PR are part of a series of PRs. Currently the SelectionList class requires something to provide a default value for the chunk size comparison. Within the next revision this class will be revised, and the constructor will be removed entirely in favor of accessor methods, including one about chunk size.","depth":17,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Rules such as adding comments, or using final are mostly dedicated to code generated by a model. The current changes are done by me (as part of a larger functional change), so they are okay.","depth":17,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Currently we use actively only one update targets - activity. Opportunity will have support added soon, hence why it is in the allowed list. All other options are currently not supported, and actively planned, but were intentionally added as potential candidates for future developments, if deemed necesary.","depth":17,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"Add or remove reactions","depth":15,"on_screen":false,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXCheckBox","text":"react with eyes","depth":14,"on_screen":false,"role_description":"toggle button","subrole":"AXToggle","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"👀","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"1","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@Vasil-Jiminny","depth":12,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXLink","text":"Remove comments.","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Remove comments.","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXButton","text":"8 / 10 checks OK","depth":14,"on_screen":false,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXLink","text":"36ce6e8","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"36ce6e8","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"@claude","depth":13,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXButton","text":"This comment was marked as outdated. Show comment","depth":14,"on_screen":false,"help_text":"","role_description":"summary","subrole":"AXSummary","is_enabled":true,"is_focused":false,"is_selected":false,"is_expanded":false},{"role":"AXHeading","text":"This comment was marked as outdated.","depth":15,"on_screen":false,"help_text":"","role_description":"heading","subrole":"AXUnknown"},{"role":"AXStaticText","text":"This comment was marked as outdated.","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"Show comment","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"Vasil-Jiminny","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"Vasil-Jiminny","depth":15,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"added","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"2","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXStaticText","text":"commits","depth":14,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"},{"role":"AXLink","text":"3 days ago","depth":14,"on_screen":false,"help_text":"","role_description":"link","subrole":"AXUnknown","is_enabled":true,"is_focused":false,"is_selected":false},{"role":"AXStaticText","text":"3 days ago","depth":16,"on_screen":false,"help_text":"","role_description":"text","subrole":"AXUnknown"}]...
|
-7766314822470776076
|
-500570324709354678
|
visual_change
|
accessibility
|
NULL
|
Platform Sprint 4 Q2 - Platform Team - Scrum Board Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
Platform Sprint 4 Q2 - Platform Team - Scrum Board - Jira
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
JY-20891 add support for secondary email by LakyLak · Pull Request #12073 · jiminny/app
[JY-20891] Sidekick SMS issue - Jira
[JY-20891] Sidekick SMS issue - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
[JY-20915] Add environment-specific email domains for text relay to prevent duplicate processing - Jira
Usage | Windsurf
Usage | Windsurf
[SRD-6853] Moxso - Potential deal stages bug - Jira
[SRD-6853] Moxso - Potential deal stages bug - Jira
Pipelines - jiminny/app
Pipelines - jiminny/app
Feed — jiminny — Sentry
Feed — jiminny — Sentry
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
Pipedrive API Reference and Documentation
Pipedrive API Reference and Documentation
pipedrive/client-php: Pipedrive API client for PHP
pipedrive/client-php: Pipedrive API client for PHP
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
[jiminny/infrastructure] JY-20623 Add SQS queue for panorama reports (PR #728) - [EMAIL] - Jiminny Mail
Pull requests · jiminny/app
Pull requests · jiminny/app
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20912] Fallback mechanism for users with active SF tokens for CRM Matching - Jira
[JY-20906] Review of Pipedrive SDK - Jira
[JY-20906] Review of Pipedrive SDK - Jira
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
JY 20893 chunk control per update target by Vasil-Jiminny · Pull Request #12086 · jiminny/app
Close tab
New Tab
Customize sidebar
Open Google Gemini (⌃X)
Tabs from other devices
Open history (⇧⌘H)
Open bookmarks (⌘B)
Skip to content
Skip to content
Open menu
Homepage (g then d)
jiminny
jiminny
app
app
Search or jump to…
Type
/
to search
Chat with Copilot
Open Copilot…
Create new...
All issues(g then i)
All pull requests
All repositories
You have unread notifications(g then n)
Open user navigation menu
Repository navigation
Repository navigation
Code
Code
Pull requests (29)
Pull requests
(
29
)
Agents
Agents
Actions
Actions
Wiki
Wiki
Security and quality
Security and quality
Insights
Insights
Settings
Settings
Important update
Important update
On April 24 we'll start using GitHub Copilot interaction data for AI model training unless you opt out.
Review this update
Review this update
and manage your preferences in your
GitHub account settings
GitHub account settings
.
Dismiss banner
Review requested
Review requested
Vasil-Jiminny
Vasil-Jiminny
requested your review on this pull request.
Add your review
Add your review
JY 20893 chunk control per update target #12086 Edit title
JY 20893 chunk control per update target
#
12086
Edit title
Checks pending
Checks pending
Code
Code
Open
Vasil-Jiminny
Vasil-Jiminny
wants to merge 17 commits into
master
master
from
JY-20893-chunk-control-per-update-target
JY-20893-chunk-control-per-update-target
Copy head branch name to clipboard
Lines changed: 158 additions & 35 deletions
Conversation (15)
Conversation
(
15
)
Commits (17)
Commits
(
17
)
Checks (2)
Checks
(
2
)
Files changed (6)
Files changed
(
6
)
Conversation
Conversation
@Vasil-Jiminny
Show options
Vasil-Jiminny commented 3 days ago •
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
•
edited
edited
JIRA: JY-20893
JIRA:
JY-20893
JY-20893
Changes:
Changes:
Add a dedicated class to keep the chunk sizes for various updated targets for ES.
Update user classes and tests.
Drop obsolete constants.
Chunking algorithm tested with full local reset - works as expected.
Add or remove reactions
Vasil-Jiminny
Vasil-Jiminny
added
4
commits
3 days ago
3 days ago
@Vasil-Jiminny
Introduce ChunkSize to control the size of a chunk per update target.
Introduce ChunkSize to control the size of a chunk per update target.
731bdb6
731bdb6
@Vasil-Jiminny
SelectionListTest uses ChunkSize.
SelectionListTest uses ChunkSize.
6cda5d1
6cda5d1
@Vasil-Jiminny
SelectionList drop reference to TargetEntitiesSelector::ES_CHUNK_SIZE
SelectionList drop reference to
TargetEntitiesSelector::ES_CHUNK_SIZE
52848f5
52848f5
@Vasil-Jiminny
Update TargetEntitiesSelector to use ChunkSize instead of internal co…
Update TargetEntitiesSelector to use ChunkSize instead of internal co…
Commit message body
8 / 10 checks OK
f32fb68
f32fb68
@Vasil-Jiminny
Show options
Author
Vasil-Jiminny commented 3 days ago
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
@claude
@claude
Add or remove reactions
react with eyes
👀
1
@claude
This comment was marked as outdated. Show comment
This comment was marked as outdated.
This comment was marked as outdated.
Show comment
@Vasil-Jiminny
Remove an unused import.
Remove an unused import.
8715e69
8715e69
@Vasil-Jiminny
Show options
Author
Vasil-Jiminny commented 3 days ago
Vasil-Jiminny
Vasil-Jiminny
commented
3 days ago
3 days ago
@claude
@claude
The changes in this PR are part of a series of PRs. Currently the SelectionList class requires something to provide a default value for the chunk size comparison. Within the next revision this class will be revised, and the constructor will be removed entirely in favor of accessor methods, including one about chunk size.
Rules such as adding comments, or using final are mostly dedicated to code generated by a model. The current changes are done by me (as part of a larger functional change), so they are okay.
Currently we use actively only one update targets - activity. Opportunity will have support added soon, hence why it is in the allowed list. All other options are currently not supported, and actively planned, but were intentionally added as potential candidates for future developments, if deemed necesary.
Add or remove reactions
react with eyes
👀
1
@Vasil-Jiminny
Remove comments.
Remove comments.
8 / 10 checks OK
36ce6e8
36ce6e8
@claude
This comment was marked as outdated. Show comment
This comment was marked as outdated.
This comment was marked as outdated.
Show comment
Vasil-Jiminny
Vasil-Jiminny
added
2
commits
3 days ago
3 days ago...
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50214
|
1780
|
19
|
2026-05-18T07:23:24.876730+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779089004876_m2.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_2
|
NULL
|
NULL
|
NULL
|
NULL
|
FirefoxFile EditVIew•••D+→ cPlatform Sprint 4 Q2 - FirefoxFile EditVIew•••D+→ cPlatform Sprint 4 Q2 - Platform Te()JY-20891 add support for seconda[UY-20891] Sidekick SMS issue - JJY-20915) Add environment-spedUsage | Windsurf+ (SRD-6853] Moxso - Potential deaPipelines - jiminny/appFeed - jiminny - Sentry# (UY-20906) Review of Pipedrive StP Pipedrive API Reference and Docurpipedrive/client-php: Pipedrive AP/fiiminny/infrastructurel.JY-20623Pull requests - jiminny/app(UY-20912) Fallback mechanism fo÷1 tJy-209061 Reviow of Pinedrive Sf. JY 20893 chunk control per up xJ New TabHistory BookmarksProfiles ToolsWindow Help• github.com/jiminny/app/pull/12086jiminny / app 8<> Code 82 Pullrequests 29 Agents Actions M Wiki Security and quality ~ Insights Lộ Settings@ On April 24 we'll start using GitHub Copilot interaction data for Al model training unless you opt out. Review this update and manage your preferences in your GitHub account settings.A Vasil-Jiminny requested your review on this pull request.JY 20893 chunk control per update target #12086 •(83 OpenVasil-Jiminny wants to merae 17 commits into master from JY-20893-chunk-control-per-update-target O@ Conversation 15-• Commits 17 |# Checks 2* Files changed 6Vasil-Jiminny commented 3 days ago • edited -JIRA: JY-20893Chanaes:• Add a dedicated class to keen the chunk sizes tor various uodated tardets tor ESI• Update user classes and tests.• Dron obsolete constantsi• Chunking algorithm tested with full local reset - works as expected.C Vasil-Jiminny added 4 commits 3 davs aco• @) Introduce ChunkSize to control the size of a chunk per uodate taraet.• • SelectionListTest uses ChunkSize.• @ SelectionList droo reference to TargetEntitiesSelector::ES CHUNK SIZEa @ Update TargetEntitiesSelector to use ChunkSize instead of internal co... -Vasil-Jiminny commented 3 days ago@claude1)7310d066cda5d152848f5X f32fb68Authora 40 0 1 Preparation for Refi...in 4h 37m A 100% C/7 & • Mon 18 May 10:23:24Q Type D to search• Checks pendingCode -+158 -35 BBBnReviewers• LakyLak|ilian-jiminny@ yalokin-jiminny€ vkulovAt least 1 approving review is required to merge this pullStill in progress? Convert to draftAssigneesNo one-assign yourselfLabelsNone vetPtatnNone yetMilestoneNo milestoneDevelopmentSuccessfully meraina this pull reguest may close theseNone yetNotificationsUnsubscribeVou'ro rocoivina notificatione hocalico vouiro watchinalthis repository....
|
NULL
|
-4114539997264774359
|
NULL
|
visual_change
|
ocr
|
NULL
|
FirefoxFile EditVIew•••D+→ cPlatform Sprint 4 Q2 - FirefoxFile EditVIew•••D+→ cPlatform Sprint 4 Q2 - Platform Te()JY-20891 add support for seconda[UY-20891] Sidekick SMS issue - JJY-20915) Add environment-spedUsage | Windsurf+ (SRD-6853] Moxso - Potential deaPipelines - jiminny/appFeed - jiminny - Sentry# (UY-20906) Review of Pipedrive StP Pipedrive API Reference and Docurpipedrive/client-php: Pipedrive AP/fiiminny/infrastructurel.JY-20623Pull requests - jiminny/app(UY-20912) Fallback mechanism fo÷1 tJy-209061 Reviow of Pinedrive Sf. JY 20893 chunk control per up xJ New TabHistory BookmarksProfiles ToolsWindow Help• github.com/jiminny/app/pull/12086jiminny / app 8<> Code 82 Pullrequests 29 Agents Actions M Wiki Security and quality ~ Insights Lộ Settings@ On April 24 we'll start using GitHub Copilot interaction data for Al model training unless you opt out. Review this update and manage your preferences in your GitHub account settings.A Vasil-Jiminny requested your review on this pull request.JY 20893 chunk control per update target #12086 •(83 OpenVasil-Jiminny wants to merae 17 commits into master from JY-20893-chunk-control-per-update-target O@ Conversation 15-• Commits 17 |# Checks 2* Files changed 6Vasil-Jiminny commented 3 days ago • edited -JIRA: JY-20893Chanaes:• Add a dedicated class to keen the chunk sizes tor various uodated tardets tor ESI• Update user classes and tests.• Dron obsolete constantsi• Chunking algorithm tested with full local reset - works as expected.C Vasil-Jiminny added 4 commits 3 davs aco• @) Introduce ChunkSize to control the size of a chunk per uodate taraet.• • SelectionListTest uses ChunkSize.• @ SelectionList droo reference to TargetEntitiesSelector::ES CHUNK SIZEa @ Update TargetEntitiesSelector to use ChunkSize instead of internal co... -Vasil-Jiminny commented 3 days ago@claude1)7310d066cda5d152848f5X f32fb68Authora 40 0 1 Preparation for Refi...in 4h 37m A 100% C/7 & • Mon 18 May 10:23:24Q Type D to search• Checks pendingCode -+158 -35 BBBnReviewers• LakyLak|ilian-jiminny@ yalokin-jiminny€ vkulovAt least 1 approving review is required to merge this pullStill in progress? Convert to draftAssigneesNo one-assign yourselfLabelsNone vetPtatnNone yetMilestoneNo milestoneDevelopmentSuccessfully meraina this pull reguest may close theseNone yetNotificationsUnsubscribeVou'ro rocoivina notificatione hocalico vouiro watchinalthis repository....
|
NULL
|
NULL
|
NULL
|
NULL
|
|
50215
|
1779
|
23
|
2026-05-18T07:23:25.260555+00:00
|
/Users/lukas/.screenpipe/data/data/2026-05-18/1779 /Users/lukas/.screenpipe/data/data/2026-05-18/1779089005260_m1.jpg...
|
iTerm2
|
NULL
|
1
|
NULL
|
monitor_1
|
NULL
|
NULL
|
NULL
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKERX 11DOCKER (docker-compose)81DEV (-zsh)docker_lamp_12026-05-18 07:22:20 Running ['artisan'activity:sync 'ringcentral''telus' 'talkdesk'--from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_1 |2026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1docker_lamp_11 25 0/us• '/usr/local/bin/php''artisan''telus''talkdesk' --from='2026-05-18 07:06:00'activity:sync 'ringcentral' 'avaya'--to='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan'twilio:recover-tracks]3S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states >'/proc/1/fd/1'2>&1docker_lamp_1docker_1amp_1I run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]...4sDONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:07 Running ['artisan' dialers:monitor-activities] .2s DONEdocker_lamp_11/fd/1', '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2>81docker_lamp_12026-05-18 07:23:10 Running ['artisan'jiminny:monitor-social-accountSJ2S DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'jiminny:monitor-social-accounts > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:13 Running ['artisan' mailbox:skip-lists:refresh]8S DONEdocker_lamp_1" '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh> '/proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchPreparation for Refi….. in 4 h 37 m100% (78• Mon 18 May 10:23:24DOCKER (docker-compose)O 82APP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXt (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
NULL
|
-3800323498339176981
|
NULL
|
visual_change
|
ocr
|
NULL
|
iTerm2ShellEditViewSessionScriptsProfilesWindowHel iTerm2ShellEditViewSessionScriptsProfilesWindowHelpDOCKERX 11DOCKER (docker-compose)81DEV (-zsh)docker_lamp_12026-05-18 07:22:20 Running ['artisan'activity:sync 'ringcentral''telus' 'talkdesk'--from='2026-05-18 07:06:00' --to='2026-05-18 07:22:00']-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesdocker_lamp_1 |2026-05-18 07:22:22 Jiminny\Jobs\Mailbox\CreateBatchesms DONEdocker_lamp_1docker_lamp_11 25 0/us• '/usr/local/bin/php''artisan''telus''talkdesk' --from='2026-05-18 07:06:00'activity:sync 'ringcentral' 'avaya'--to='2026-05-18 07:22:00'> */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:23 Running ['artisan'twilio:recover-tracks]3S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' twilio:recover-tracks › */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:26 Running ['artisan' dialers:sync-users]2s DONEdocker_1amp_1, '/usr/local/bin/php' 'artisan' dialers:sync-users > '/proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:22:28 Running ['artisan' datadog:report:failed-processing-states]2S DONEdocker_lamp_1l '/usr/local/bin/php' 'artisan' datadog:report:failed-processing-states >'/proc/1/fd/1'2>&1docker_lamp_1docker_1amp_1I run_artisan_schedule: Done waiting for schedule:rundocker_lamp_1docker_lamp_12026-05-18 07:23:03 Running ['artisan'meeting-bot:schedule-bot]...4sDONEdocker_lamp_1• '/usr/local/bin/php' 'artisan'meeting-bot:schedule-bot > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:07 Running ['artisan' dialers:monitor-activities] .2s DONEdocker_lamp_11/fd/1', '/usr/local/bin/php' 'artisan' dialers:monitor-activities > '/proc/2>81docker_lamp_12026-05-18 07:23:10 Running ['artisan'jiminny:monitor-social-accountSJ2S DONEdocker_lamp_11 '/usr/local/bin/php' 'artisan'jiminny:monitor-social-accounts > */proc/1/fd/1'2>&1docker_lamp_12026-05-18 07:23:13 Running ['artisan' mailbox:skip-lists:refresh]8S DONEdocker_lamp_1" '/usr/local/bin/php' 'artisan' mailbox:skip-lists:refresh> '/proc/1/fd/1' 2>&1View in Docker Desktop@ View ConfigEnable WatchPreparation for Refi….. in 4 h 37 m100% (78• Mon 18 May 10:23:24DOCKER (docker-compose)O 82APP (-zsh)*3screenpipe"RunPROD (ssh)'do-release-upgrade' to upgrade to it.*** System restart required ***Last login: Thu May 14 07:41:362026 from 212.5.153.87lukas@jiminny-prod-bastion:~$X L3 EU (-zsh)Last login: Sat May 16 18:04:33on ttys001Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.toml file in /Users/lukas or its parents@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ I|T4STAGE (ssh)See [URL_WITH_CREDENTIALS] ~ $ I17 EXt (-zsh)Poetry could not find a pyproject.toml file in /Users/lukas or its parentsPoetry could not find a pyproject.tomlfile in /Users/lukas or its parentslukas@Lukas-Kovaliks-MacBook-Pro-Jiminny ~ $ [|FRONTENDEXTENSION...
|
NULL
|
NULL
|
NULL
|
NULL
|