@agent-relay/cloud 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/admin.d.ts +8 -0
- package/dist/api/admin.d.ts.map +1 -0
- package/dist/api/admin.js +225 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/auth.d.ts +20 -0
- package/dist/api/auth.d.ts.map +1 -0
- package/dist/api/auth.js +136 -0
- package/dist/api/auth.js.map +1 -0
- package/dist/api/billing.d.ts +7 -0
- package/dist/api/billing.d.ts.map +1 -0
- package/dist/api/billing.js +564 -0
- package/dist/api/billing.js.map +1 -0
- package/dist/api/cli-pty-runner.d.ts +53 -0
- package/dist/api/cli-pty-runner.d.ts.map +1 -0
- package/dist/api/cli-pty-runner.js +193 -0
- package/dist/api/cli-pty-runner.js.map +1 -0
- package/dist/api/codex-auth-helper.d.ts +21 -0
- package/dist/api/codex-auth-helper.d.ts.map +1 -0
- package/dist/api/codex-auth-helper.js +327 -0
- package/dist/api/codex-auth-helper.js.map +1 -0
- package/dist/api/consensus.d.ts +13 -0
- package/dist/api/consensus.d.ts.map +1 -0
- package/dist/api/consensus.js +261 -0
- package/dist/api/consensus.js.map +1 -0
- package/dist/api/coordinators.d.ts +8 -0
- package/dist/api/coordinators.d.ts.map +1 -0
- package/dist/api/coordinators.js +750 -0
- package/dist/api/coordinators.js.map +1 -0
- package/dist/api/daemons.d.ts +12 -0
- package/dist/api/daemons.d.ts.map +1 -0
- package/dist/api/daemons.js +535 -0
- package/dist/api/daemons.js.map +1 -0
- package/dist/api/generic-webhooks.d.ts +8 -0
- package/dist/api/generic-webhooks.d.ts.map +1 -0
- package/dist/api/generic-webhooks.js +129 -0
- package/dist/api/generic-webhooks.js.map +1 -0
- package/dist/api/git.d.ts +8 -0
- package/dist/api/git.d.ts.map +1 -0
- package/dist/api/git.js +269 -0
- package/dist/api/git.js.map +1 -0
- package/dist/api/github-app.d.ts +11 -0
- package/dist/api/github-app.d.ts.map +1 -0
- package/dist/api/github-app.js +223 -0
- package/dist/api/github-app.js.map +1 -0
- package/dist/api/middleware/planLimits.d.ts +43 -0
- package/dist/api/middleware/planLimits.d.ts.map +1 -0
- package/dist/api/middleware/planLimits.js +202 -0
- package/dist/api/middleware/planLimits.js.map +1 -0
- package/dist/api/monitoring.d.ts +11 -0
- package/dist/api/monitoring.d.ts.map +1 -0
- package/dist/api/monitoring.js +578 -0
- package/dist/api/monitoring.js.map +1 -0
- package/dist/api/nango-auth.d.ts +9 -0
- package/dist/api/nango-auth.d.ts.map +1 -0
- package/dist/api/nango-auth.js +674 -0
- package/dist/api/nango-auth.js.map +1 -0
- package/dist/api/onboarding.d.ts +15 -0
- package/dist/api/onboarding.d.ts.map +1 -0
- package/dist/api/onboarding.js +679 -0
- package/dist/api/onboarding.js.map +1 -0
- package/dist/api/policy.d.ts +8 -0
- package/dist/api/policy.d.ts.map +1 -0
- package/dist/api/policy.js +229 -0
- package/dist/api/policy.js.map +1 -0
- package/dist/api/provider-env.d.ts +14 -0
- package/dist/api/provider-env.d.ts.map +1 -0
- package/dist/api/provider-env.js +75 -0
- package/dist/api/provider-env.js.map +1 -0
- package/dist/api/providers.d.ts +7 -0
- package/dist/api/providers.d.ts.map +1 -0
- package/dist/api/providers.js +564 -0
- package/dist/api/providers.js.map +1 -0
- package/dist/api/repos.d.ts +8 -0
- package/dist/api/repos.d.ts.map +1 -0
- package/dist/api/repos.js +577 -0
- package/dist/api/repos.js.map +1 -0
- package/dist/api/sessions.d.ts +11 -0
- package/dist/api/sessions.d.ts.map +1 -0
- package/dist/api/sessions.js +302 -0
- package/dist/api/sessions.js.map +1 -0
- package/dist/api/teams.d.ts +7 -0
- package/dist/api/teams.d.ts.map +1 -0
- package/dist/api/teams.js +281 -0
- package/dist/api/teams.js.map +1 -0
- package/dist/api/test-helpers.d.ts +10 -0
- package/dist/api/test-helpers.d.ts.map +1 -0
- package/dist/api/test-helpers.js +745 -0
- package/dist/api/test-helpers.js.map +1 -0
- package/dist/api/usage.d.ts +7 -0
- package/dist/api/usage.d.ts.map +1 -0
- package/dist/api/usage.js +111 -0
- package/dist/api/usage.js.map +1 -0
- package/dist/api/webhooks.d.ts +8 -0
- package/dist/api/webhooks.d.ts.map +1 -0
- package/dist/api/webhooks.js +645 -0
- package/dist/api/webhooks.js.map +1 -0
- package/dist/api/workspaces.d.ts +25 -0
- package/dist/api/workspaces.d.ts.map +1 -0
- package/dist/api/workspaces.js +1799 -0
- package/dist/api/workspaces.js.map +1 -0
- package/dist/billing/index.d.ts +9 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +9 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/plans.d.ts +39 -0
- package/dist/billing/plans.d.ts.map +1 -0
- package/dist/billing/plans.js +245 -0
- package/dist/billing/plans.js.map +1 -0
- package/dist/billing/service.d.ts +80 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +388 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/billing/types.d.ts +141 -0
- package/dist/billing/types.d.ts.map +1 -0
- package/dist/billing/types.js +7 -0
- package/dist/billing/types.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +5 -0
- package/dist/config.js.map +1 -0
- package/dist/db/bulk-ingest.d.ts +89 -0
- package/dist/db/bulk-ingest.d.ts.map +1 -0
- package/dist/db/bulk-ingest.js +268 -0
- package/dist/db/bulk-ingest.js.map +1 -0
- package/dist/db/drizzle.d.ts +256 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/drizzle.js +1286 -0
- package/dist/db/drizzle.js.map +1 -0
- package/dist/db/index.d.ts +55 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +68 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/schema.d.ts +4873 -0
- package/dist/db/schema.d.ts.map +1 -0
- package/dist/db/schema.js +620 -0
- package/dist/db/schema.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/provisioner/index.d.ts +207 -0
- package/dist/provisioner/index.d.ts.map +1 -0
- package/dist/provisioner/index.js +2114 -0
- package/dist/provisioner/index.js.map +1 -0
- package/dist/server.d.ts +17 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1924 -0
- package/dist/server.js.map +1 -0
- package/dist/services/auto-scaler.d.ts +152 -0
- package/dist/services/auto-scaler.d.ts.map +1 -0
- package/dist/services/auto-scaler.js +439 -0
- package/dist/services/auto-scaler.js.map +1 -0
- package/dist/services/capacity-manager.d.ts +148 -0
- package/dist/services/capacity-manager.d.ts.map +1 -0
- package/dist/services/capacity-manager.js +449 -0
- package/dist/services/capacity-manager.js.map +1 -0
- package/dist/services/ci-agent-spawner.d.ts +49 -0
- package/dist/services/ci-agent-spawner.d.ts.map +1 -0
- package/dist/services/ci-agent-spawner.js +373 -0
- package/dist/services/ci-agent-spawner.js.map +1 -0
- package/dist/services/cloud-message-bus.d.ts +28 -0
- package/dist/services/cloud-message-bus.d.ts.map +1 -0
- package/dist/services/cloud-message-bus.js +19 -0
- package/dist/services/cloud-message-bus.js.map +1 -0
- package/dist/services/compute-enforcement.d.ts +57 -0
- package/dist/services/compute-enforcement.d.ts.map +1 -0
- package/dist/services/compute-enforcement.js +175 -0
- package/dist/services/compute-enforcement.js.map +1 -0
- package/dist/services/coordinator.d.ts +62 -0
- package/dist/services/coordinator.d.ts.map +1 -0
- package/dist/services/coordinator.js +389 -0
- package/dist/services/coordinator.js.map +1 -0
- package/dist/services/index.d.ts +17 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +25 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/intro-expiration.d.ts +60 -0
- package/dist/services/intro-expiration.d.ts.map +1 -0
- package/dist/services/intro-expiration.js +252 -0
- package/dist/services/intro-expiration.js.map +1 -0
- package/dist/services/mention-handler.d.ts +65 -0
- package/dist/services/mention-handler.d.ts.map +1 -0
- package/dist/services/mention-handler.js +405 -0
- package/dist/services/mention-handler.js.map +1 -0
- package/dist/services/nango.d.ts +201 -0
- package/dist/services/nango.d.ts.map +1 -0
- package/dist/services/nango.js +392 -0
- package/dist/services/nango.js.map +1 -0
- package/dist/services/persistence.d.ts +131 -0
- package/dist/services/persistence.d.ts.map +1 -0
- package/dist/services/persistence.js +200 -0
- package/dist/services/persistence.js.map +1 -0
- package/dist/services/planLimits.d.ts +147 -0
- package/dist/services/planLimits.d.ts.map +1 -0
- package/dist/services/planLimits.js +335 -0
- package/dist/services/planLimits.js.map +1 -0
- package/dist/services/presence-registry.d.ts +56 -0
- package/dist/services/presence-registry.d.ts.map +1 -0
- package/dist/services/presence-registry.js +91 -0
- package/dist/services/presence-registry.js.map +1 -0
- package/dist/services/scaling-orchestrator.d.ts +159 -0
- package/dist/services/scaling-orchestrator.d.ts.map +1 -0
- package/dist/services/scaling-orchestrator.js +502 -0
- package/dist/services/scaling-orchestrator.js.map +1 -0
- package/dist/services/scaling-policy.d.ts +121 -0
- package/dist/services/scaling-policy.d.ts.map +1 -0
- package/dist/services/scaling-policy.js +415 -0
- package/dist/services/scaling-policy.js.map +1 -0
- package/dist/services/ssh-security.d.ts +31 -0
- package/dist/services/ssh-security.d.ts.map +1 -0
- package/dist/services/ssh-security.js +63 -0
- package/dist/services/ssh-security.js.map +1 -0
- package/dist/services/workspace-keepalive.d.ts +76 -0
- package/dist/services/workspace-keepalive.d.ts.map +1 -0
- package/dist/services/workspace-keepalive.js +234 -0
- package/dist/services/workspace-keepalive.js.map +1 -0
- package/dist/shims/consensus.d.ts +23 -0
- package/dist/shims/consensus.d.ts.map +1 -0
- package/dist/shims/consensus.js +5 -0
- package/dist/shims/consensus.js.map +1 -0
- package/dist/webhooks/index.d.ts +24 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +29 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/parsers/github.d.ts +8 -0
- package/dist/webhooks/parsers/github.d.ts.map +1 -0
- package/dist/webhooks/parsers/github.js +234 -0
- package/dist/webhooks/parsers/github.js.map +1 -0
- package/dist/webhooks/parsers/index.d.ts +23 -0
- package/dist/webhooks/parsers/index.d.ts.map +1 -0
- package/dist/webhooks/parsers/index.js +30 -0
- package/dist/webhooks/parsers/index.js.map +1 -0
- package/dist/webhooks/parsers/linear.d.ts +9 -0
- package/dist/webhooks/parsers/linear.d.ts.map +1 -0
- package/dist/webhooks/parsers/linear.js +258 -0
- package/dist/webhooks/parsers/linear.js.map +1 -0
- package/dist/webhooks/parsers/slack.d.ts +9 -0
- package/dist/webhooks/parsers/slack.d.ts.map +1 -0
- package/dist/webhooks/parsers/slack.js +214 -0
- package/dist/webhooks/parsers/slack.js.map +1 -0
- package/dist/webhooks/responders/github.d.ts +8 -0
- package/dist/webhooks/responders/github.d.ts.map +1 -0
- package/dist/webhooks/responders/github.js +73 -0
- package/dist/webhooks/responders/github.js.map +1 -0
- package/dist/webhooks/responders/index.d.ts +23 -0
- package/dist/webhooks/responders/index.d.ts.map +1 -0
- package/dist/webhooks/responders/index.js +30 -0
- package/dist/webhooks/responders/index.js.map +1 -0
- package/dist/webhooks/responders/linear.d.ts +9 -0
- package/dist/webhooks/responders/linear.d.ts.map +1 -0
- package/dist/webhooks/responders/linear.js +149 -0
- package/dist/webhooks/responders/linear.js.map +1 -0
- package/dist/webhooks/responders/slack.d.ts +20 -0
- package/dist/webhooks/responders/slack.d.ts.map +1 -0
- package/dist/webhooks/responders/slack.js +178 -0
- package/dist/webhooks/responders/slack.js.map +1 -0
- package/dist/webhooks/router.d.ts +25 -0
- package/dist/webhooks/router.d.ts.map +1 -0
- package/dist/webhooks/router.js +504 -0
- package/dist/webhooks/router.js.map +1 -0
- package/dist/webhooks/rules-engine.d.ts +24 -0
- package/dist/webhooks/rules-engine.d.ts.map +1 -0
- package/dist/webhooks/rules-engine.js +287 -0
- package/dist/webhooks/rules-engine.js.map +1 -0
- package/dist/webhooks/types.d.ts +186 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/types.js +8 -0
- package/dist/webhooks/types.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Services Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all cloud-side services for easy importing.
|
|
5
|
+
*/
|
|
6
|
+
export { ScalingPolicyService, type ScalingThresholds, type ScalingPolicy, type ScalingCondition, type ScalingAction, type ScalingDecision, type UserScalingContext, type WorkspaceMetrics, getScalingPolicyService, } from './scaling-policy.js';
|
|
7
|
+
export { AutoScaler, type AutoScalerConfig, type ScalingOperation, type MetricsSnapshot, getAutoScaler, createAutoScaler, } from './auto-scaler.js';
|
|
8
|
+
export { CapacityManager, type CapacityManagerConfig, type WorkspaceCapacity, type PlacementRecommendation, type CapacitySnapshot, type CapacityForecast, getCapacityManager, createCapacityManager, } from './capacity-manager.js';
|
|
9
|
+
export { ScalingOrchestrator, type OrchestratorConfig, type ScalingEvent, getScalingOrchestrator, createScalingOrchestrator, } from './scaling-orchestrator.js';
|
|
10
|
+
export { spawnCIFixAgent, notifyAgentOfCIFailure, completeFixAttempt, getFailureHistory, getPRFailureHistory, } from './ci-agent-spawner.js';
|
|
11
|
+
export { handleMention, handleIssueAssignment, getPendingMentions, getPendingIssueAssignments, processPendingMentions, processPendingIssueAssignments, KNOWN_AGENTS, isKnownAgent, } from './mention-handler.js';
|
|
12
|
+
export { ComputeEnforcementService, type ComputeEnforcementConfig, type EnforcementResult, getComputeEnforcementService, createComputeEnforcementService, } from './compute-enforcement.js';
|
|
13
|
+
export { IntroExpirationService, type IntroExpirationConfig, type IntroStatus, type ExpirationResult as IntroExpirationResult, INTRO_PERIOD_DAYS, DESTROY_GRACE_PERIOD_DAYS, getIntroStatus, getIntroExpirationService, startIntroExpirationService, stopIntroExpirationService, } from './intro-expiration.js';
|
|
14
|
+
export { WorkspaceKeepaliveService, type WorkspaceKeepaliveConfig, type KeepaliveStats, getWorkspaceKeepaliveService, createWorkspaceKeepaliveService, } from './workspace-keepalive.js';
|
|
15
|
+
export { registerUserPresence, unregisterUserPresence, updateUserLastSeen, isUserOnline, getOnlineUser, getOnlineUsers, getOnlineUsersForDiscovery, clearAllPresence, type PresenceUserInfo, } from './presence-registry.js';
|
|
16
|
+
export { cloudMessageBus, type CloudMessage, } from './cloud-message-bus.js';
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EACL,oBAAoB,EACpB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EACV,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EACf,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,mBAAmB,EACnB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EACL,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,WAAW,EAChB,KAAK,gBAAgB,IAAI,qBAAqB,EAC9C,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,yBAAyB,EACzB,KAAK,wBAAwB,EAC7B,KAAK,cAAc,EACnB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,EAChB,KAAK,gBAAgB,GACtB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,eAAe,EACf,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud Services Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all cloud-side services for easy importing.
|
|
5
|
+
*/
|
|
6
|
+
// Scaling infrastructure
|
|
7
|
+
export { ScalingPolicyService, getScalingPolicyService, } from './scaling-policy.js';
|
|
8
|
+
export { AutoScaler, getAutoScaler, createAutoScaler, } from './auto-scaler.js';
|
|
9
|
+
export { CapacityManager, getCapacityManager, createCapacityManager, } from './capacity-manager.js';
|
|
10
|
+
export { ScalingOrchestrator, getScalingOrchestrator, createScalingOrchestrator, } from './scaling-orchestrator.js';
|
|
11
|
+
// CI failure handling
|
|
12
|
+
export { spawnCIFixAgent, notifyAgentOfCIFailure, completeFixAttempt, getFailureHistory, getPRFailureHistory, } from './ci-agent-spawner.js';
|
|
13
|
+
// Issue and mention handling
|
|
14
|
+
export { handleMention, handleIssueAssignment, getPendingMentions, getPendingIssueAssignments, processPendingMentions, processPendingIssueAssignments, KNOWN_AGENTS, isKnownAgent, } from './mention-handler.js';
|
|
15
|
+
// Compute enforcement (free tier limits)
|
|
16
|
+
export { ComputeEnforcementService, getComputeEnforcementService, createComputeEnforcementService, } from './compute-enforcement.js';
|
|
17
|
+
// Intro expiration (auto-resize/destroy after free tier intro period)
|
|
18
|
+
export { IntroExpirationService, INTRO_PERIOD_DAYS, DESTROY_GRACE_PERIOD_DAYS, getIntroStatus, getIntroExpirationService, startIntroExpirationService, stopIntroExpirationService, } from './intro-expiration.js';
|
|
19
|
+
// Workspace keepalive (prevent Fly.io from idling machines with active agents)
|
|
20
|
+
export { WorkspaceKeepaliveService, getWorkspaceKeepaliveService, createWorkspaceKeepaliveService, } from './workspace-keepalive.js';
|
|
21
|
+
// Presence registry (shared registry for tracking online users)
|
|
22
|
+
export { registerUserPresence, unregisterUserPresence, updateUserLastSeen, isUserOnline, getOnlineUser, getOnlineUsers, getOnlineUsersForDiscovery, clearAllPresence, } from './presence-registry.js';
|
|
23
|
+
// Cloud message bus (event-based message delivery for cloud users)
|
|
24
|
+
export { cloudMessageBus, } from './cloud-message-bus.js';
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yBAAyB;AACzB,OAAO,EACL,oBAAoB,EAQpB,uBAAuB,GACxB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,UAAU,EAIV,aAAa,EACb,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,eAAe,EAMf,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,mBAAmB,EAGnB,sBAAsB,EACtB,yBAAyB,GAC1B,MAAM,2BAA2B,CAAC;AAEnC,sBAAsB;AACtB,OAAO,EACL,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAE/B,6BAA6B;AAC7B,OAAO,EACL,aAAa,EACb,qBAAqB,EACrB,kBAAkB,EAClB,0BAA0B,EAC1B,sBAAsB,EACtB,8BAA8B,EAC9B,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAC;AAE9B,yCAAyC;AACzC,OAAO,EACL,yBAAyB,EAGzB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,sEAAsE;AACtE,OAAO,EACL,sBAAsB,EAItB,iBAAiB,EACjB,yBAAyB,EACzB,cAAc,EACd,yBAAyB,EACzB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,+EAA+E;AAC/E,OAAO,EACL,yBAAyB,EAGzB,4BAA4B,EAC5B,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,gEAAgE;AAChE,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,0BAA0B,EAC1B,gBAAgB,GAEjB,MAAM,wBAAwB,CAAC;AAEhC,mEAAmE;AACnE,OAAO,EACL,eAAe,GAEhB,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intro Expiration Service
|
|
3
|
+
*
|
|
4
|
+
* Handles auto-resize and auto-destroy of free tier workspaces:
|
|
5
|
+
* 1. Resize: Free users get Pro-level resources (2 CPU / 4GB) for the first 14 days,
|
|
6
|
+
* then get automatically downsized to standard free tier (1 CPU / 2GB).
|
|
7
|
+
* 2. Destroy: Free workspaces inactive for 7+ days after intro expires get auto-destroyed
|
|
8
|
+
* to prevent ongoing infrastructure costs for churned users.
|
|
9
|
+
*/
|
|
10
|
+
export declare const INTRO_PERIOD_DAYS = 14;
|
|
11
|
+
export declare const DESTROY_GRACE_PERIOD_DAYS = 7;
|
|
12
|
+
export interface IntroExpirationConfig {
|
|
13
|
+
enabled: boolean;
|
|
14
|
+
checkIntervalMs: number;
|
|
15
|
+
}
|
|
16
|
+
export interface IntroStatus {
|
|
17
|
+
isIntroPeriod: boolean;
|
|
18
|
+
daysRemaining: number;
|
|
19
|
+
introPeriodDays: number;
|
|
20
|
+
expiresAt: Date | null;
|
|
21
|
+
}
|
|
22
|
+
export interface ExpirationResult {
|
|
23
|
+
userId: string;
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
workspaceName: string;
|
|
26
|
+
action: 'resized' | 'destroyed' | 'skipped' | 'error';
|
|
27
|
+
reason?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get intro period status for a user
|
|
31
|
+
*/
|
|
32
|
+
export declare function getIntroStatus(userCreatedAt: Date | string | null, plan: string): IntroStatus;
|
|
33
|
+
export declare class IntroExpirationService {
|
|
34
|
+
private config;
|
|
35
|
+
private checkTimer;
|
|
36
|
+
private isRunning;
|
|
37
|
+
constructor(config?: Partial<IntroExpirationConfig>);
|
|
38
|
+
/**
|
|
39
|
+
* Start the expiration service
|
|
40
|
+
*/
|
|
41
|
+
start(): void;
|
|
42
|
+
/**
|
|
43
|
+
* Stop the expiration service
|
|
44
|
+
*/
|
|
45
|
+
stop(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Run expiration check for all free tier users with expired intro periods
|
|
48
|
+
*/
|
|
49
|
+
runExpirationCheck(): Promise<ExpirationResult[]>;
|
|
50
|
+
/**
|
|
51
|
+
* Check and process workspaces for a user whose intro period has expired
|
|
52
|
+
* - Resize workspaces that are still at intro-tier resources
|
|
53
|
+
* - Destroy workspaces that have been inactive for DESTROY_GRACE_PERIOD_DAYS
|
|
54
|
+
*/
|
|
55
|
+
private checkAndProcessUserWorkspaces;
|
|
56
|
+
}
|
|
57
|
+
export declare function getIntroExpirationService(): IntroExpirationService;
|
|
58
|
+
export declare function startIntroExpirationService(): void;
|
|
59
|
+
export declare function stopIntroExpirationService(): void;
|
|
60
|
+
//# sourceMappingURL=intro-expiration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intro-expiration.d.ts","sourceRoot":"","sources":["../../src/services/intro-expiration.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,yBAAyB,IAAI,CAAC;AAE3C,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAOD,MAAM,WAAW,WAAW;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CA0B7F;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAkB;gBAEvB,MAAM,GAAE,OAAO,CAAC,qBAAqB,CAAM;IAIvD;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IA6CvD;;;;OAIG;YACW,6BAA6B;CAkH5C;AAKD,wBAAgB,yBAAyB,IAAI,sBAAsB,CAKlE;AAED,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED,wBAAgB,0BAA0B,IAAI,IAAI,CAIjD"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intro Expiration Service
|
|
3
|
+
*
|
|
4
|
+
* Handles auto-resize and auto-destroy of free tier workspaces:
|
|
5
|
+
* 1. Resize: Free users get Pro-level resources (2 CPU / 4GB) for the first 14 days,
|
|
6
|
+
* then get automatically downsized to standard free tier (1 CPU / 2GB).
|
|
7
|
+
* 2. Destroy: Free workspaces inactive for 7+ days after intro expires get auto-destroyed
|
|
8
|
+
* to prevent ongoing infrastructure costs for churned users.
|
|
9
|
+
*/
|
|
10
|
+
import { db } from '../db/index.js';
|
|
11
|
+
import { getProvisioner } from '../provisioner/index.js';
|
|
12
|
+
export const INTRO_PERIOD_DAYS = 14;
|
|
13
|
+
export const DESTROY_GRACE_PERIOD_DAYS = 7; // Days of inactivity after intro before auto-destroy
|
|
14
|
+
const DEFAULT_CONFIG = {
|
|
15
|
+
enabled: true,
|
|
16
|
+
checkIntervalMs: 60 * 60 * 1000, // 1 hour
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Get intro period status for a user
|
|
20
|
+
*/
|
|
21
|
+
export function getIntroStatus(userCreatedAt, plan) {
|
|
22
|
+
const introPeriodDays = INTRO_PERIOD_DAYS;
|
|
23
|
+
// Only free tier users get intro bonus
|
|
24
|
+
if (plan !== 'free' || !userCreatedAt) {
|
|
25
|
+
return {
|
|
26
|
+
isIntroPeriod: false,
|
|
27
|
+
daysRemaining: 0,
|
|
28
|
+
introPeriodDays,
|
|
29
|
+
expiresAt: null,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const createdAt = typeof userCreatedAt === 'string' ? new Date(userCreatedAt) : userCreatedAt;
|
|
33
|
+
const daysSinceSignup = (Date.now() - createdAt.getTime()) / (1000 * 60 * 60 * 24);
|
|
34
|
+
const isIntroPeriod = daysSinceSignup < introPeriodDays;
|
|
35
|
+
const daysRemaining = Math.max(0, Math.ceil(introPeriodDays - daysSinceSignup));
|
|
36
|
+
const expiresAt = new Date(createdAt.getTime() + introPeriodDays * 24 * 60 * 60 * 1000);
|
|
37
|
+
return {
|
|
38
|
+
isIntroPeriod,
|
|
39
|
+
daysRemaining,
|
|
40
|
+
introPeriodDays,
|
|
41
|
+
expiresAt,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export class IntroExpirationService {
|
|
45
|
+
config;
|
|
46
|
+
checkTimer = null;
|
|
47
|
+
isRunning = false;
|
|
48
|
+
constructor(config = {}) {
|
|
49
|
+
this.config = { ...DEFAULT_CONFIG, ...config };
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Start the expiration service
|
|
53
|
+
*/
|
|
54
|
+
start() {
|
|
55
|
+
if (!this.config.enabled) {
|
|
56
|
+
console.log('[intro-expiration] Service disabled');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (this.isRunning) {
|
|
60
|
+
console.warn('[intro-expiration] Service already running');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.isRunning = true;
|
|
64
|
+
console.log(`[intro-expiration] Started (checking every ${this.config.checkIntervalMs / 1000 / 60} minutes)`);
|
|
65
|
+
// Run immediately on start
|
|
66
|
+
this.runExpirationCheck().catch((err) => {
|
|
67
|
+
console.error('[intro-expiration] Initial run failed:', err);
|
|
68
|
+
});
|
|
69
|
+
// Then run periodically
|
|
70
|
+
this.checkTimer = setInterval(() => {
|
|
71
|
+
this.runExpirationCheck().catch((err) => {
|
|
72
|
+
console.error('[intro-expiration] Periodic run failed:', err);
|
|
73
|
+
});
|
|
74
|
+
}, this.config.checkIntervalMs);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Stop the expiration service
|
|
78
|
+
*/
|
|
79
|
+
stop() {
|
|
80
|
+
if (this.checkTimer) {
|
|
81
|
+
clearInterval(this.checkTimer);
|
|
82
|
+
this.checkTimer = null;
|
|
83
|
+
}
|
|
84
|
+
this.isRunning = false;
|
|
85
|
+
console.log('[intro-expiration] Stopped');
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Run expiration check for all free tier users with expired intro periods
|
|
89
|
+
*/
|
|
90
|
+
async runExpirationCheck() {
|
|
91
|
+
const results = [];
|
|
92
|
+
try {
|
|
93
|
+
// Get all users on free tier
|
|
94
|
+
const freeUsers = await db.users.findByPlan('free');
|
|
95
|
+
// Filter to users whose intro period has expired
|
|
96
|
+
const expiredUsers = freeUsers.filter((user) => {
|
|
97
|
+
const status = getIntroStatus(user.createdAt, user.plan || 'free');
|
|
98
|
+
return !status.isIntroPeriod && status.expiresAt !== null;
|
|
99
|
+
});
|
|
100
|
+
if (expiredUsers.length === 0) {
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
console.log(`[intro-expiration] Checking ${expiredUsers.length} users with expired intro periods`);
|
|
104
|
+
for (const user of expiredUsers) {
|
|
105
|
+
try {
|
|
106
|
+
const userResults = await this.checkAndProcessUserWorkspaces(user.id, user.createdAt);
|
|
107
|
+
results.push(...userResults);
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
console.error(`[intro-expiration] Error checking user ${user.id}:`, err);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
// Summary
|
|
114
|
+
const resized = results.filter((r) => r.action === 'resized').length;
|
|
115
|
+
const destroyed = results.filter((r) => r.action === 'destroyed').length;
|
|
116
|
+
const skipped = results.filter((r) => r.action === 'skipped').length;
|
|
117
|
+
const errors = results.filter((r) => r.action === 'error').length;
|
|
118
|
+
if (resized > 0 || destroyed > 0 || errors > 0) {
|
|
119
|
+
console.log(`[intro-expiration] Results: ${resized} resized, ${destroyed} destroyed, ${skipped} skipped, ${errors} errors`);
|
|
120
|
+
}
|
|
121
|
+
return results;
|
|
122
|
+
}
|
|
123
|
+
catch (err) {
|
|
124
|
+
console.error('[intro-expiration] Run failed:', err);
|
|
125
|
+
return results;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check and process workspaces for a user whose intro period has expired
|
|
130
|
+
* - Resize workspaces that are still at intro-tier resources
|
|
131
|
+
* - Destroy workspaces that have been inactive for DESTROY_GRACE_PERIOD_DAYS
|
|
132
|
+
*/
|
|
133
|
+
async checkAndProcessUserWorkspaces(userId, userCreatedAt) {
|
|
134
|
+
const results = [];
|
|
135
|
+
const provisioner = getProvisioner();
|
|
136
|
+
// Get user's workspaces
|
|
137
|
+
const workspaces = await db.workspaces.findByUserId(userId);
|
|
138
|
+
// Calculate when intro period expired for this user
|
|
139
|
+
const introExpiredAt = new Date(userCreatedAt.getTime() + INTRO_PERIOD_DAYS * 24 * 60 * 60 * 1000);
|
|
140
|
+
const destroyThreshold = new Date(introExpiredAt.getTime() + DESTROY_GRACE_PERIOD_DAYS * 24 * 60 * 60 * 1000);
|
|
141
|
+
const now = new Date();
|
|
142
|
+
for (const workspace of workspaces) {
|
|
143
|
+
try {
|
|
144
|
+
// Check if workspace has intro-sized resources
|
|
145
|
+
const config = workspace.config;
|
|
146
|
+
const resourceTier = config?.resourceTier;
|
|
147
|
+
// Check last activity via linked daemons
|
|
148
|
+
const daemons = await db.linkedDaemons.findByWorkspaceId(workspace.id);
|
|
149
|
+
const lastActivity = daemons.length > 0
|
|
150
|
+
? daemons.reduce((latest, d) => {
|
|
151
|
+
const seen = d.lastSeenAt ? new Date(d.lastSeenAt) : new Date(0);
|
|
152
|
+
return seen > latest ? seen : latest;
|
|
153
|
+
}, new Date(0))
|
|
154
|
+
: workspace.updatedAt; // Fall back to workspace updatedAt
|
|
155
|
+
// Check if workspace should be destroyed (inactive for grace period after intro)
|
|
156
|
+
const daysSinceActivity = (now.getTime() - lastActivity.getTime()) / (1000 * 60 * 60 * 24);
|
|
157
|
+
const shouldDestroy = now > destroyThreshold && daysSinceActivity >= DESTROY_GRACE_PERIOD_DAYS;
|
|
158
|
+
if (shouldDestroy) {
|
|
159
|
+
console.log(`[intro-expiration] Destroying inactive free workspace ${workspace.name} (${daysSinceActivity.toFixed(1)} days inactive)`);
|
|
160
|
+
try {
|
|
161
|
+
await provisioner.deprovision(workspace.id);
|
|
162
|
+
results.push({
|
|
163
|
+
userId,
|
|
164
|
+
workspaceId: workspace.id,
|
|
165
|
+
workspaceName: workspace.name,
|
|
166
|
+
action: 'destroyed',
|
|
167
|
+
reason: `Inactive for ${Math.round(daysSinceActivity)} days after intro period expired`,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
catch (deprovisionErr) {
|
|
171
|
+
console.error(`[intro-expiration] Failed to destroy workspace ${workspace.id}:`, deprovisionErr);
|
|
172
|
+
results.push({
|
|
173
|
+
userId,
|
|
174
|
+
workspaceId: workspace.id,
|
|
175
|
+
workspaceName: workspace.name,
|
|
176
|
+
action: 'error',
|
|
177
|
+
reason: `Failed to destroy: ${deprovisionErr instanceof Error ? deprovisionErr.message : 'Unknown error'}`,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
// Skip resize if already at standard free tier
|
|
183
|
+
if (resourceTier === 'small') {
|
|
184
|
+
results.push({
|
|
185
|
+
userId,
|
|
186
|
+
workspaceId: workspace.id,
|
|
187
|
+
workspaceName: workspace.name,
|
|
188
|
+
action: 'skipped',
|
|
189
|
+
reason: 'Already at standard free tier size',
|
|
190
|
+
});
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
// Skip if workspace is not running (resize happens on next start)
|
|
194
|
+
if (workspace.status !== 'running') {
|
|
195
|
+
results.push({
|
|
196
|
+
userId,
|
|
197
|
+
workspaceId: workspace.id,
|
|
198
|
+
workspaceName: workspace.name,
|
|
199
|
+
action: 'skipped',
|
|
200
|
+
reason: `Workspace status is ${workspace.status}`,
|
|
201
|
+
});
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
// Resize to standard free tier (small: 2 CPU / 2GB)
|
|
205
|
+
// Use skipRestart=true to not disrupt running agents
|
|
206
|
+
console.log(`[intro-expiration] Resizing workspace ${workspace.name} to standard free tier`);
|
|
207
|
+
await provisioner.resize(workspace.id, {
|
|
208
|
+
name: 'small',
|
|
209
|
+
cpuCores: 2,
|
|
210
|
+
cpuKind: 'shared',
|
|
211
|
+
memoryMb: 2048,
|
|
212
|
+
maxAgents: 2,
|
|
213
|
+
}, true); // skipRestart = true for graceful resize
|
|
214
|
+
results.push({
|
|
215
|
+
userId,
|
|
216
|
+
workspaceId: workspace.id,
|
|
217
|
+
workspaceName: workspace.name,
|
|
218
|
+
action: 'resized',
|
|
219
|
+
reason: 'Intro period expired, downsized to standard free tier (applies on next restart)',
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
console.error(`[intro-expiration] Failed to process workspace ${workspace.id}:`, err);
|
|
224
|
+
results.push({
|
|
225
|
+
userId,
|
|
226
|
+
workspaceId: workspace.id,
|
|
227
|
+
workspaceName: workspace.name,
|
|
228
|
+
action: 'error',
|
|
229
|
+
reason: err instanceof Error ? err.message : 'Unknown error',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
// Singleton instance
|
|
237
|
+
let _service = null;
|
|
238
|
+
export function getIntroExpirationService() {
|
|
239
|
+
if (!_service) {
|
|
240
|
+
_service = new IntroExpirationService();
|
|
241
|
+
}
|
|
242
|
+
return _service;
|
|
243
|
+
}
|
|
244
|
+
export function startIntroExpirationService() {
|
|
245
|
+
getIntroExpirationService().start();
|
|
246
|
+
}
|
|
247
|
+
export function stopIntroExpirationService() {
|
|
248
|
+
if (_service) {
|
|
249
|
+
_service.stop();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=intro-expiration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"intro-expiration.js","sourceRoot":"","sources":["../../src/services/intro-expiration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mention Handler Service
|
|
3
|
+
*
|
|
4
|
+
* Handles @mentions of agents in GitHub issues and PR comments.
|
|
5
|
+
* Routes mentions to appropriate agents for response.
|
|
6
|
+
*
|
|
7
|
+
* Flow:
|
|
8
|
+
* 1. App posts acknowledgment comment
|
|
9
|
+
* 2. Finds a linked daemon for the repository
|
|
10
|
+
* 3. Queues spawn command for the daemon
|
|
11
|
+
* 4. Agent works and posts response comment
|
|
12
|
+
*/
|
|
13
|
+
import { CommentMention, IssueAssignment } from '../db/index.js';
|
|
14
|
+
/**
|
|
15
|
+
* Known agent types that can be mentioned
|
|
16
|
+
*/
|
|
17
|
+
export declare const KNOWN_AGENTS: {
|
|
18
|
+
readonly 'agent-relay': "General purpose agent for any task";
|
|
19
|
+
readonly lead: "Lead agent for coordination and delegation";
|
|
20
|
+
readonly developer: "Developer agent for coding tasks";
|
|
21
|
+
readonly reviewer: "Code review agent";
|
|
22
|
+
readonly 'ci-fix': "CI failure fixing agent";
|
|
23
|
+
readonly debugger: "Bug investigation and fixing agent";
|
|
24
|
+
readonly docs: "Documentation agent";
|
|
25
|
+
readonly test: "Test writing agent";
|
|
26
|
+
readonly refactor: "Code refactoring agent";
|
|
27
|
+
};
|
|
28
|
+
export type KnownAgentType = keyof typeof KNOWN_AGENTS;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a mention is for a known agent type
|
|
31
|
+
*/
|
|
32
|
+
export declare function isKnownAgent(mention: string): mention is KnownAgentType;
|
|
33
|
+
/**
|
|
34
|
+
* Handle a mention record
|
|
35
|
+
*
|
|
36
|
+
* This function:
|
|
37
|
+
* 1. Validates the mention is for a known agent
|
|
38
|
+
* 2. Posts an acknowledgment comment
|
|
39
|
+
* 3. Finds a linked daemon
|
|
40
|
+
* 4. Queues a spawn command for the agent
|
|
41
|
+
*/
|
|
42
|
+
export declare function handleMention(mention: CommentMention): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Handle an issue assignment
|
|
45
|
+
*
|
|
46
|
+
* Called when an issue should be assigned to an agent
|
|
47
|
+
*/
|
|
48
|
+
export declare function handleIssueAssignment(assignment: IssueAssignment): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Get pending mentions for processing
|
|
51
|
+
*/
|
|
52
|
+
export declare function getPendingMentions(limit?: number): Promise<CommentMention[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Get pending issue assignments for processing
|
|
55
|
+
*/
|
|
56
|
+
export declare function getPendingIssueAssignments(limit?: number): Promise<IssueAssignment[]>;
|
|
57
|
+
/**
|
|
58
|
+
* Process all pending mentions (background job)
|
|
59
|
+
*/
|
|
60
|
+
export declare function processPendingMentions(): Promise<number>;
|
|
61
|
+
/**
|
|
62
|
+
* Process all pending issue assignments (background job)
|
|
63
|
+
*/
|
|
64
|
+
export declare function processPendingIssueAssignments(): Promise<number>;
|
|
65
|
+
//# sourceMappingURL=mention-handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mention-handler.d.ts","sourceRoot":"","sources":["../../src/services/mention-handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAM,cAAc,EAAE,eAAe,EAAc,MAAM,gBAAgB,CAAC;AAGjF;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;;;;;CAaf,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,YAAY,CAAC;AAEvD;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,IAAI,cAAc,CAEvE;AA0GD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E1E;AAyED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAyEtF;AA4DD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAE9E;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAEvF;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc9D;AAED;;GAEG;AACH,wBAAsB,8BAA8B,IAAI,OAAO,CAAC,MAAM,CAAC,CActE"}
|