@locusai/sdk 0.14.4 → 0.15.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.
Files changed (52) hide show
  1. package/dist/agent/worker.js +67 -4
  2. package/dist/ai/claude-runner.d.ts +1 -0
  3. package/dist/ai/claude-runner.d.ts.map +1 -1
  4. package/dist/ai/codex-runner.d.ts +1 -0
  5. package/dist/ai/codex-runner.d.ts.map +1 -1
  6. package/dist/events.d.ts +2 -0
  7. package/dist/events.d.ts.map +1 -1
  8. package/dist/index-node.d.ts +1 -0
  9. package/dist/index-node.d.ts.map +1 -1
  10. package/dist/index-node.js +2130 -204
  11. package/dist/index.d.ts +6 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +56 -0
  14. package/dist/jobs/__tests__/job-runner.test.d.ts +2 -0
  15. package/dist/jobs/__tests__/job-runner.test.d.ts.map +1 -0
  16. package/dist/jobs/__tests__/lint-scan.test.d.ts +2 -0
  17. package/dist/jobs/__tests__/lint-scan.test.d.ts.map +1 -0
  18. package/dist/jobs/__tests__/scheduler.test.d.ts +2 -0
  19. package/dist/jobs/__tests__/scheduler.test.d.ts.map +1 -0
  20. package/dist/jobs/base-job.d.ts +29 -0
  21. package/dist/jobs/base-job.d.ts.map +1 -0
  22. package/dist/jobs/default-registry.d.ts +3 -0
  23. package/dist/jobs/default-registry.d.ts.map +1 -0
  24. package/dist/jobs/index.d.ts +12 -0
  25. package/dist/jobs/index.d.ts.map +1 -0
  26. package/dist/jobs/job-registry.d.ts +10 -0
  27. package/dist/jobs/job-registry.d.ts.map +1 -0
  28. package/dist/jobs/job-runner.d.ts +33 -0
  29. package/dist/jobs/job-runner.d.ts.map +1 -0
  30. package/dist/jobs/proposals/context-gatherer.d.ts +35 -0
  31. package/dist/jobs/proposals/context-gatherer.d.ts.map +1 -0
  32. package/dist/jobs/proposals/index.d.ts +4 -0
  33. package/dist/jobs/proposals/index.d.ts.map +1 -0
  34. package/dist/jobs/proposals/proposal-engine.d.ts +21 -0
  35. package/dist/jobs/proposals/proposal-engine.d.ts.map +1 -0
  36. package/dist/jobs/scans/dependency-scan.d.ts +28 -0
  37. package/dist/jobs/scans/dependency-scan.d.ts.map +1 -0
  38. package/dist/jobs/scans/index.d.ts +5 -0
  39. package/dist/jobs/scans/index.d.ts.map +1 -0
  40. package/dist/jobs/scans/lint-scan.d.ts +20 -0
  41. package/dist/jobs/scans/lint-scan.d.ts.map +1 -0
  42. package/dist/jobs/scans/test-scan.d.ts +20 -0
  43. package/dist/jobs/scans/test-scan.d.ts.map +1 -0
  44. package/dist/jobs/scans/todo-scan.d.ts +15 -0
  45. package/dist/jobs/scans/todo-scan.d.ts.map +1 -0
  46. package/dist/jobs/scheduler.d.ts +80 -0
  47. package/dist/jobs/scheduler.d.ts.map +1 -0
  48. package/dist/modules/jobs.d.ts +14 -0
  49. package/dist/modules/jobs.d.ts.map +1 -0
  50. package/dist/modules/suggestions.d.ts +12 -0
  51. package/dist/modules/suggestions.d.ts.map +1 -0
  52. package/package.json +7 -5
package/dist/index.d.ts CHANGED
@@ -4,8 +4,10 @@ import { CiModule } from "./modules/ci.js";
4
4
  import { DocsModule } from "./modules/docs.js";
5
5
  import { InstancesModule } from "./modules/instances.js";
6
6
  import { InvitationsModule } from "./modules/invitations.js";
7
+ import { JobsModule } from "./modules/jobs.js";
7
8
  import { OrganizationsModule } from "./modules/organizations.js";
8
9
  import { SprintsModule } from "./modules/sprints.js";
10
+ import { SuggestionsModule } from "./modules/suggestions.js";
9
11
  import { TasksModule } from "./modules/tasks.js";
10
12
  import { WorkspacesModule } from "./modules/workspaces.js";
11
13
  export type { Discussion, DiscussionInsight, DiscussionMessage, } from "./discussion/discussion-types.js";
@@ -16,8 +18,10 @@ export * from "./modules/ci.js";
16
18
  export * from "./modules/docs.js";
17
19
  export * from "./modules/instances.js";
18
20
  export * from "./modules/invitations.js";
21
+ export * from "./modules/jobs.js";
19
22
  export * from "./modules/organizations.js";
20
23
  export * from "./modules/sprints.js";
24
+ export * from "./modules/suggestions.js";
21
25
  export * from "./modules/tasks.js";
22
26
  export * from "./modules/workspaces.js";
23
27
  export declare class LocusClient {
@@ -32,6 +36,8 @@ export declare class LocusClient {
32
36
  readonly docs: DocsModule;
33
37
  readonly ci: CiModule;
34
38
  readonly instances: InstancesModule;
39
+ readonly jobs: JobsModule;
40
+ readonly suggestions: SuggestionsModule;
35
41
  constructor(config: LocusConfig);
36
42
  private setupRetryInterceptor;
37
43
  private setupInterceptors;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAE1C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AAExC,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,SAAgB,OAAO,EAAE,YAAY,CAAC;IAEtC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,OAAO,EAAE,aAAa,CAAC;IACvC,SAAgB,UAAU,EAAE,gBAAgB,CAAC;IAC7C,SAAgB,aAAa,EAAE,mBAAmB,CAAC;IACnD,SAAgB,WAAW,EAAE,iBAAiB,CAAC;IAC/C,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,SAAgB,SAAS,EAAE,eAAe,CAAC;gBAE/B,MAAM,EAAE,WAAW;IA8B/B,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,iBAAiB;IAmDlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAOrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAc,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAI3D,YAAY,EACV,UAAU,EACV,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAE1C,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,sBAAsB,CAAC;AACrC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AAExC,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,SAAgB,OAAO,EAAE,YAAY,CAAC;IAEtC,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,KAAK,EAAE,WAAW,CAAC;IACnC,SAAgB,OAAO,EAAE,aAAa,CAAC;IACvC,SAAgB,UAAU,EAAE,gBAAgB,CAAC;IAC7C,SAAgB,aAAa,EAAE,mBAAmB,CAAC;IACnD,SAAgB,WAAW,EAAE,iBAAiB,CAAC;IAC/C,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,EAAE,EAAE,QAAQ,CAAC;IAC7B,SAAgB,SAAS,EAAE,eAAe,CAAC;IAC3C,SAAgB,IAAI,EAAE,UAAU,CAAC;IACjC,SAAgB,WAAW,EAAE,iBAAiB,CAAC;gBAEnC,MAAM,EAAE,WAAW;IAgC/B,OAAO,CAAC,qBAAqB;IAmC7B,OAAO,CAAC,iBAAiB;IAmDlB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAOrC"}
package/dist/index.js CHANGED
@@ -225,6 +225,29 @@ var init_invitations = __esm(() => {
225
225
  };
226
226
  });
227
227
 
228
+ // src/modules/jobs.ts
229
+ var JobsModule;
230
+ var init_jobs = __esm(() => {
231
+ JobsModule = class JobsModule extends BaseModule {
232
+ async create(workspaceId, data) {
233
+ const { data: res } = await this.api.post(`/workspaces/${workspaceId}/job-runs`, data);
234
+ return res.jobRun;
235
+ }
236
+ async list(workspaceId, params) {
237
+ const { data } = await this.api.get(`/workspaces/${workspaceId}/job-runs`, { params });
238
+ return data.jobRuns;
239
+ }
240
+ async get(workspaceId, id) {
241
+ const { data } = await this.api.get(`/workspaces/${workspaceId}/job-runs/${id}`);
242
+ return data.jobRun;
243
+ }
244
+ async update(workspaceId, id, data) {
245
+ const { data: res } = await this.api.patch(`/workspaces/${workspaceId}/job-runs/${id}`, data);
246
+ return res.jobRun;
247
+ }
248
+ };
249
+ });
250
+
228
251
  // src/modules/organizations.ts
229
252
  var OrganizationsModule;
230
253
  var init_organizations = __esm(() => {
@@ -307,6 +330,29 @@ var init_sprints = __esm(() => {
307
330
  };
308
331
  });
309
332
 
333
+ // src/modules/suggestions.ts
334
+ var SuggestionsModule;
335
+ var init_suggestions = __esm(() => {
336
+ SuggestionsModule = class SuggestionsModule extends BaseModule {
337
+ async create(workspaceId, data) {
338
+ const { data: res } = await this.api.post(`/workspaces/${workspaceId}/suggestions`, data);
339
+ return res.suggestion;
340
+ }
341
+ async list(workspaceId, params) {
342
+ const { data } = await this.api.get(`/workspaces/${workspaceId}/suggestions`, { params });
343
+ return data.suggestions;
344
+ }
345
+ async get(workspaceId, id) {
346
+ const { data } = await this.api.get(`/workspaces/${workspaceId}/suggestions/${id}`);
347
+ return data.suggestion;
348
+ }
349
+ async updateStatus(workspaceId, id, status) {
350
+ const { data } = await this.api.patch(`/workspaces/${workspaceId}/suggestions/${id}/status`, status);
351
+ return data.suggestion;
352
+ }
353
+ };
354
+ });
355
+
310
356
  // src/modules/tasks.ts
311
357
  var import_shared, TasksModule;
312
358
  var init_tasks = __esm(() => {
@@ -483,11 +529,13 @@ var exports_src = {};
483
529
  __export(exports_src, {
484
530
  WorkspacesModule: () => WorkspacesModule,
485
531
  TasksModule: () => TasksModule,
532
+ SuggestionsModule: () => SuggestionsModule,
486
533
  SprintsModule: () => SprintsModule,
487
534
  OrganizationsModule: () => OrganizationsModule,
488
535
  LocusEvent: () => LocusEvent,
489
536
  LocusEmitter: () => LocusEmitter,
490
537
  LocusClient: () => LocusClient,
538
+ JobsModule: () => JobsModule,
491
539
  InvitationsModule: () => InvitationsModule,
492
540
  InstancesModule: () => InstancesModule,
493
541
  DocsModule: () => DocsModule,
@@ -511,6 +559,8 @@ class LocusClient {
511
559
  docs;
512
560
  ci;
513
561
  instances;
562
+ jobs;
563
+ suggestions;
514
564
  constructor(config) {
515
565
  this.emitter = new LocusEmitter;
516
566
  this.api = import_axios.default.create({
@@ -531,6 +581,8 @@ class LocusClient {
531
581
  this.docs = new DocsModule(this.api, this.emitter);
532
582
  this.ci = new CiModule(this.api, this.emitter);
533
583
  this.instances = new InstancesModule(this.api, this.emitter);
584
+ this.jobs = new JobsModule(this.api, this.emitter);
585
+ this.suggestions = new SuggestionsModule(this.api, this.emitter);
534
586
  if (config.retryOptions) {
535
587
  this.setupRetryInterceptor(config.retryOptions);
536
588
  }
@@ -598,8 +650,10 @@ var init_src = __esm(() => {
598
650
  init_docs();
599
651
  init_instances();
600
652
  init_invitations();
653
+ init_jobs();
601
654
  init_organizations();
602
655
  init_sprints();
656
+ init_suggestions();
603
657
  init_tasks();
604
658
  init_workspaces();
605
659
  init_discussion_types();
@@ -610,8 +664,10 @@ var init_src = __esm(() => {
610
664
  init_docs();
611
665
  init_instances();
612
666
  init_invitations();
667
+ init_jobs();
613
668
  init_organizations();
614
669
  init_sprints();
670
+ init_suggestions();
615
671
  init_tasks();
616
672
  init_workspaces();
617
673
  });
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=job-runner.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-runner.test.d.ts","sourceRoot":"","sources":["../../../src/jobs/__tests__/job-runner.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lint-scan.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-scan.test.d.ts","sourceRoot":"","sources":["../../../src/jobs/__tests__/lint-scan.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=scheduler.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.test.d.ts","sourceRoot":"","sources":["../../../src/jobs/__tests__/scheduler.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { AutonomyRule, ChangeCategory, JobConfig, JobType, SuggestionType } from "@locusai/shared";
2
+ import type { LocusClient } from "../index.js";
3
+ export interface JobContext {
4
+ workspaceId: string;
5
+ projectPath: string;
6
+ config: JobConfig;
7
+ autonomyRules: AutonomyRule[];
8
+ client: LocusClient;
9
+ }
10
+ export interface JobSuggestion {
11
+ type: SuggestionType;
12
+ title: string;
13
+ description: string;
14
+ metadata?: Record<string, unknown>;
15
+ }
16
+ export interface JobResult {
17
+ summary: string;
18
+ suggestions: JobSuggestion[];
19
+ filesChanged: number;
20
+ prUrl?: string;
21
+ errors?: string[];
22
+ }
23
+ export declare abstract class BaseJob {
24
+ abstract readonly type: JobType;
25
+ abstract readonly name: string;
26
+ abstract run(context: JobContext): Promise<JobResult>;
27
+ protected shouldAutoExecute(category: ChangeCategory, rules: AutonomyRule[]): boolean;
28
+ }
29
+ //# sourceMappingURL=base-job.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-job.d.ts","sourceRoot":"","sources":["../../src/jobs/base-job.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,SAAS,EACT,OAAO,EACP,cAAc,EACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,SAAS,CAAC;IAClB,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAMD,8BAAsB,OAAO;IAC3B,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAE/B,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAErD,SAAS,CAAC,iBAAiB,CACzB,QAAQ,EAAE,cAAc,EACxB,KAAK,EAAE,YAAY,EAAE,GACpB,OAAO;CAIX"}
@@ -0,0 +1,3 @@
1
+ import { JobRegistry } from "./job-registry.js";
2
+ export declare function createDefaultRegistry(): JobRegistry;
3
+ //# sourceMappingURL=default-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-registry.d.ts","sourceRoot":"","sources":["../../src/jobs/default-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAQhD,wBAAgB,qBAAqB,IAAI,WAAW,CAOnD"}
@@ -0,0 +1,12 @@
1
+ export type { JobContext, JobResult, JobSuggestion } from "./base-job.js";
2
+ export { BaseJob } from "./base-job.js";
3
+ export { createDefaultRegistry } from "./default-registry.js";
4
+ export { JobRegistry } from "./job-registry.js";
5
+ export type { JobCompletedPayload, JobFailedPayload, JobStartedPayload, } from "./job-runner.js";
6
+ export { JobEvent, JobRunner } from "./job-runner.js";
7
+ export type { ArtifactFile, ProposalContext } from "./proposals/index.js";
8
+ export { ContextGatherer, ProposalEngine } from "./proposals/index.js";
9
+ export { DependencyScanJob, LintScanJob, TestScanJob, TodoScanJob, } from "./scans/index.js";
10
+ export type { ConfigLoader, ConfigReloadedPayload, JobScheduledPayload, JobSkippedPayload, JobTriggeredPayload, ProposalSchedulerConfig, ProposalsGeneratedPayload, SchedulerConfig, SchedulerStartedPayload, } from "./scheduler.js";
11
+ export { JobScheduler, SchedulerEvent } from "./scheduler.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/jobs/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EACV,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACtD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,WAAW,EACX,WAAW,GACZ,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,YAAY,EACZ,qBAAqB,EACrB,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,EACnB,uBAAuB,EACvB,yBAAyB,EACzB,eAAe,EACf,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { JobType } from "@locusai/shared";
2
+ import type { BaseJob } from "./base-job.js";
3
+ export declare class JobRegistry {
4
+ private jobs;
5
+ register(job: BaseJob): void;
6
+ get(type: JobType): BaseJob | undefined;
7
+ getAll(): BaseJob[];
8
+ has(type: JobType): boolean;
9
+ }
10
+ //# sourceMappingURL=job-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-registry.d.ts","sourceRoot":"","sources":["../../src/jobs/job-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAA+B;IAE3C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI;IAI5B,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS;IAIvC,MAAM,IAAI,OAAO,EAAE;IAInB,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;CAG5B"}
@@ -0,0 +1,33 @@
1
+ import { type AutonomyRule, type JobConfig, type JobType } from "@locusai/shared";
2
+ import type { LocusClient } from "../index.js";
3
+ import type { JobResult } from "./base-job.js";
4
+ import type { JobRegistry } from "./job-registry.js";
5
+ export declare enum JobEvent {
6
+ JOB_STARTED = "JOB_STARTED",
7
+ JOB_COMPLETED = "JOB_COMPLETED",
8
+ JOB_FAILED = "JOB_FAILED"
9
+ }
10
+ export interface JobStartedPayload {
11
+ jobType: JobType;
12
+ jobRunId: string;
13
+ }
14
+ export interface JobCompletedPayload {
15
+ jobType: JobType;
16
+ jobRunId: string;
17
+ result: JobResult;
18
+ }
19
+ export interface JobFailedPayload {
20
+ jobType: JobType;
21
+ jobRunId: string;
22
+ error: string;
23
+ }
24
+ export declare class JobRunner {
25
+ private readonly registry;
26
+ private readonly client;
27
+ private readonly projectPath;
28
+ private readonly workspaceId;
29
+ constructor(registry: JobRegistry, client: LocusClient, projectPath: string, workspaceId: string);
30
+ runJob(jobType: JobType, config: JobConfig, autonomyRules: AutonomyRule[]): Promise<JobResult>;
31
+ runAllEnabled(configs: JobConfig[], autonomyRules: AutonomyRule[]): Promise<Map<JobType, JobResult>>;
32
+ }
33
+ //# sourceMappingURL=job-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"job-runner.d.ts","sourceRoot":"","sources":["../../src/jobs/job-runner.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,SAAS,EAEd,KAAK,OAAO,EACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAc,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMrD,oBAAY,QAAQ;IAClB,WAAW,gBAAgB;IAC3B,aAAa,kBAAkB;IAC/B,UAAU,eAAe;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,qBAAa,SAAS;IAElB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAHX,QAAQ,EAAE,WAAW,EACrB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM;IAGhC,MAAM,CACV,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,SAAS,EACjB,aAAa,EAAE,YAAY,EAAE,GAC5B,OAAO,CAAC,SAAS,CAAC;IAmFf,aAAa,CACjB,OAAO,EAAE,SAAS,EAAE,EACpB,aAAa,EAAE,YAAY,EAAE,GAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;CAoBpC"}
@@ -0,0 +1,35 @@
1
+ import type { JobRun, Sprint, Suggestion, Task } from "@locusai/shared";
2
+ import type { LocusClient } from "../../index.js";
3
+ export interface ProposalContext {
4
+ /** Recent job run results (up to 10) */
5
+ jobRuns: JobRun[];
6
+ /** Active sprint, if any */
7
+ activeSprint: Sprint | null;
8
+ /** Tasks in the current sprint */
9
+ sprintTasks: Task[];
10
+ /** Backlog tasks not yet assigned to a sprint */
11
+ backlogTasks: Task[];
12
+ /** Recent git commit log (last 20 commits) */
13
+ gitLog: string;
14
+ /** Product context from .locus/artifacts/ */
15
+ artifactContents: ArtifactFile[];
16
+ /** Project-specific instructions from .locus/LOCUS.md */
17
+ locusInstructions: string | null;
18
+ /** Previously skipped suggestions (for deduplication) */
19
+ skippedSuggestions: Suggestion[];
20
+ }
21
+ export interface ArtifactFile {
22
+ name: string;
23
+ content: string;
24
+ }
25
+ export declare class ContextGatherer {
26
+ gather(projectPath: string, client: LocusClient, workspaceId: string): Promise<ProposalContext>;
27
+ private fetchJobRuns;
28
+ private fetchActiveSprint;
29
+ private fetchTasks;
30
+ private fetchSkippedSuggestions;
31
+ private readGitLog;
32
+ private readArtifacts;
33
+ private readLocusInstructions;
34
+ }
35
+ //# sourceMappingURL=context-gatherer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-gatherer.d.ts","sourceRoot":"","sources":["../../../src/jobs/proposals/context-gatherer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAMlD,MAAM,WAAW,eAAe;IAC9B,wCAAwC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,4BAA4B;IAC5B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,kCAAkC;IAClC,WAAW,EAAE,IAAI,EAAE,CAAC;IACpB,iDAAiD;IACjD,YAAY,EAAE,IAAI,EAAE,CAAC;IACrB,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,gBAAgB,EAAE,YAAY,EAAE,CAAC;IACjC,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,yDAAyD;IACzD,kBAAkB,EAAE,UAAU,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,eAAe;IACpB,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,eAAe,CAAC;YAqCb,YAAY;YAWZ,iBAAiB;YAWjB,UAAU;YAWV,uBAAuB;IAerC,OAAO,CAAC,UAAU;IAiBlB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,qBAAqB;CAU9B"}
@@ -0,0 +1,4 @@
1
+ export type { ArtifactFile, ProposalContext } from "./context-gatherer.js";
2
+ export { ContextGatherer } from "./context-gatherer.js";
3
+ export { ProposalEngine } from "./proposal-engine.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jobs/proposals/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type Suggestion } from "@locusai/shared";
2
+ import type { LocusClient } from "../../index.js";
3
+ import { ContextGatherer, type ProposalContext } from "./context-gatherer.js";
4
+ export declare class ProposalEngine {
5
+ private readonly contextGatherer;
6
+ constructor(contextGatherer?: ContextGatherer);
7
+ /**
8
+ * Full proposal cycle: gather context → generate proposals → create suggestions.
9
+ */
10
+ runProposalCycle(projectPath: string, client: LocusClient, workspaceId: string): Promise<Suggestion[]>;
11
+ /**
12
+ * Generate proposals from gathered context, deduplicate, and create suggestions.
13
+ */
14
+ generateProposals(context: ProposalContext, projectPath: string, client: LocusClient, workspaceId: string): Promise<Suggestion[]>;
15
+ private buildPrompt;
16
+ private parseResponse;
17
+ private extractField;
18
+ private isDuplicate;
19
+ private groupTasksByStatus;
20
+ }
21
+ //# sourceMappingURL=proposal-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposal-engine.d.ts","sourceRoot":"","sources":["../../../src/jobs/proposals/proposal-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAkB,MAAM,iBAAiB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAiB9E,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;gBAEtC,eAAe,CAAC,EAAE,eAAe;IAI7C;;OAEG;IACG,gBAAgB,CACpB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC;IASxB;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC;IAiDxB,OAAO,CAAC,WAAW;IA+FnB,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,WAAW;IAiBnB,OAAO,CAAC,kBAAkB;CAU3B"}
@@ -0,0 +1,28 @@
1
+ import { JobType } from "@locusai/shared";
2
+ import type { JobContext, JobResult } from "../base-job.js";
3
+ import { BaseJob } from "../base-job.js";
4
+ export declare class DependencyScanJob extends BaseJob {
5
+ readonly type = JobType.DEPENDENCY_CHECK;
6
+ readonly name = "Dependency Check";
7
+ run(context: JobContext): Promise<JobResult>;
8
+ private detectPackageManager;
9
+ private getOutdatedPackages;
10
+ private runOutdatedCommand;
11
+ private parseBunOutdated;
12
+ private parseJsonOutdated;
13
+ private parseYarnOutdated;
14
+ private runSecurityAudit;
15
+ private parseNpmAudit;
16
+ private parseGenericAudit;
17
+ private autoUpdate;
18
+ private runUpdateCommand;
19
+ private runInstallCommand;
20
+ private commitAndPush;
21
+ private buildSuggestions;
22
+ private classifyRisk;
23
+ private parseSemver;
24
+ private getUpdateHint;
25
+ private exec;
26
+ private gitExec;
27
+ }
28
+ //# sourceMappingURL=dependency-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency-scan.d.ts","sourceRoot":"","sources":["../../../src/jobs/scans/dependency-scan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAM1E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAmCzC,qBAAa,iBAAkB,SAAQ,OAAO;IAC5C,QAAQ,CAAC,IAAI,4BAA4B;IACzC,QAAQ,CAAC,IAAI,sBAAsB;IAE7B,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IA8FlD,OAAO,CAAC,oBAAoB;IAY5B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,gBAAgB;IA4BxB,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,iBAAiB;IAkCzB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,UAAU;IA8ClB,OAAO,CAAC,gBAAgB;IAuBxB,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,aAAa;IA6FrB,OAAO,CAAC,gBAAgB;IA+DxB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,aAAa;IAiBrB,OAAO,CAAC,IAAI;IAqBZ,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,5 @@
1
+ export { DependencyScanJob } from "./dependency-scan.js";
2
+ export { LintScanJob } from "./lint-scan.js";
3
+ export { TestScanJob } from "./test-scan.js";
4
+ export { TodoScanJob } from "./todo-scan.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/jobs/scans/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { JobType } from "@locusai/shared";
2
+ import type { JobContext, JobResult } from "../base-job.js";
3
+ import { BaseJob } from "../base-job.js";
4
+ export declare class LintScanJob extends BaseJob {
5
+ readonly type = JobType.LINT_SCAN;
6
+ readonly name = "Linting Scan";
7
+ run(context: JobContext): Promise<JobResult>;
8
+ private detectLinter;
9
+ private runLinter;
10
+ private parseLintOutput;
11
+ private parseBiomeOutput;
12
+ private parseEslintOutput;
13
+ private autoFix;
14
+ private commitAndPush;
15
+ private buildSuggestionResult;
16
+ private buildIssueSuggestions;
17
+ private issueCountSummary;
18
+ private gitExec;
19
+ }
20
+ //# sourceMappingURL=lint-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint-scan.d.ts","sourceRoot":"","sources":["../../../src/jobs/scans/lint-scan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAkB,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAM1E,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA8BzC,qBAAa,WAAY,SAAQ,OAAO;IACtC,QAAQ,CAAC,IAAI,qBAAqB;IAClC,QAAQ,CAAC,IAAI,kBAAkB;IAEzB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAyDlD,OAAO,CAAC,YAAY;IA0DpB,OAAO,CAAC,SAAS;IA2BjB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;IA2BzB,OAAO,CAAC,OAAO;IAwDf,OAAO,CAAC,aAAa;IA0FrB,OAAO,CAAC,qBAAqB;IAW7B,OAAO,CAAC,qBAAqB;IA+B7B,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,OAAO;CAOhB"}
@@ -0,0 +1,20 @@
1
+ import { JobType } from "@locusai/shared";
2
+ import type { JobContext, JobResult } from "../base-job.js";
3
+ import { BaseJob } from "../base-job.js";
4
+ export declare class TestScanJob extends BaseJob {
5
+ readonly type = JobType.FLAKY_TEST_DETECTION;
6
+ readonly name = "Flaky Test Detection";
7
+ run(context: JobContext): Promise<JobResult>;
8
+ private detectTestRunner;
9
+ private runTests;
10
+ private parseJestOutput;
11
+ private parseVitestOutput;
12
+ private parseMochaOutput;
13
+ private parseFallbackOutput;
14
+ private classifyTests;
15
+ private testKey;
16
+ private indexByKey;
17
+ private extractJson;
18
+ private exec;
19
+ }
20
+ //# sourceMappingURL=test-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-scan.d.ts","sourceRoot":"","sources":["../../../src/jobs/scans/test-scan.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA2CzC,qBAAa,WAAY,SAAQ,OAAO;IACtC,QAAQ,CAAC,IAAI,gCAAgC;IAC7C,QAAQ,CAAC,IAAI,0BAA0B;IAEjC,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAkIlD,OAAO,CAAC,gBAAgB;IA2FxB,OAAO,CAAC,QAAQ;IAsBhB,OAAO,CAAC,eAAe;IAqDvB,OAAO,CAAC,iBAAiB;IASzB,OAAO,CAAC,gBAAgB;IA2DxB,OAAO,CAAC,mBAAmB;IAkD3B,OAAO,CAAC,aAAa;IA6ErB,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,IAAI;CAsBb"}
@@ -0,0 +1,15 @@
1
+ import { JobType } from "@locusai/shared";
2
+ import type { JobContext, JobResult } from "../base-job.js";
3
+ import { BaseJob } from "../base-job.js";
4
+ export declare class TodoScanJob extends BaseJob {
5
+ readonly type = JobType.TODO_CLEANUP;
6
+ readonly name = "TODO Cleanup";
7
+ run(context: JobContext): Promise<JobResult>;
8
+ private scanForTodos;
9
+ private parseGrepOutput;
10
+ private groupByType;
11
+ private buildSuggestions;
12
+ private buildSummary;
13
+ private exec;
14
+ }
15
+ //# sourceMappingURL=todo-scan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"todo-scan.d.ts","sourceRoot":"","sources":["../../../src/jobs/scans/todo-scan.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAkB,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAiB,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAyBzC,qBAAa,WAAY,SAAQ,OAAO;IACtC,QAAQ,CAAC,IAAI,wBAAwB;IACrC,QAAQ,CAAC,IAAI,kBAAkB;IAEzB,GAAG,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC;IAiDlD,OAAO,CAAC,YAAY;IAwBpB,OAAO,CAAC,eAAe;IAsCvB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,YAAY;IAmCpB,OAAO,CAAC,IAAI;CAqBb"}
@@ -0,0 +1,80 @@
1
+ import type { AutonomyRule, JobConfig, JobType, Suggestion } from "@locusai/shared";
2
+ import { EventEmitter } from "events";
3
+ import type { LocusClient } from "../index.js";
4
+ import type { JobRunner } from "./job-runner.js";
5
+ import type { ProposalEngine } from "./proposals/proposal-engine.js";
6
+ export declare enum SchedulerEvent {
7
+ SCHEDULER_STARTED = "SCHEDULER_STARTED",
8
+ SCHEDULER_STOPPED = "SCHEDULER_STOPPED",
9
+ JOB_SCHEDULED = "JOB_SCHEDULED",
10
+ JOB_TRIGGERED = "JOB_TRIGGERED",
11
+ JOB_SKIPPED = "JOB_SKIPPED",
12
+ CONFIG_RELOADED = "CONFIG_RELOADED",
13
+ PROPOSALS_GENERATED = "PROPOSALS_GENERATED"
14
+ }
15
+ export interface SchedulerStartedPayload {
16
+ jobCount: number;
17
+ jobs: Array<{
18
+ type: JobType;
19
+ cronExpression: string;
20
+ }>;
21
+ }
22
+ export interface JobScheduledPayload {
23
+ jobType: JobType;
24
+ cronExpression: string;
25
+ }
26
+ export interface JobTriggeredPayload {
27
+ jobType: JobType;
28
+ }
29
+ export interface JobSkippedPayload {
30
+ jobType: JobType;
31
+ reason: string;
32
+ }
33
+ export interface ConfigReloadedPayload {
34
+ previousJobCount: number;
35
+ newJobCount: number;
36
+ }
37
+ export interface ProposalsGeneratedPayload {
38
+ suggestions: Suggestion[];
39
+ }
40
+ export interface ProposalSchedulerConfig {
41
+ engine: ProposalEngine;
42
+ projectPath: string;
43
+ client: LocusClient;
44
+ workspaceId: string;
45
+ }
46
+ export interface SchedulerConfig {
47
+ jobConfigs: JobConfig[];
48
+ autonomyRules: AutonomyRule[];
49
+ }
50
+ export type ConfigLoader = () => SchedulerConfig;
51
+ export declare class JobScheduler {
52
+ private readonly runner;
53
+ private readonly configLoader;
54
+ private readonly emitter;
55
+ private readonly proposalConfig?;
56
+ private tasks;
57
+ private runningJobs;
58
+ private currentConfigs;
59
+ private currentAutonomyRules;
60
+ private proposalRunning;
61
+ private proposalDebounceTimer;
62
+ constructor(runner: JobRunner, configLoader: ConfigLoader, emitter: EventEmitter, proposalConfig?: ProposalSchedulerConfig | undefined);
63
+ start(): void;
64
+ stop(): void;
65
+ reload(): void;
66
+ getScheduledJobs(): Array<{
67
+ type: JobType;
68
+ cronExpression: string;
69
+ }>;
70
+ isRunning(jobType: JobType): boolean;
71
+ private scheduleJob;
72
+ private triggerJob;
73
+ /**
74
+ * Debounced check: wait 30s after the last job completes. If no more
75
+ * jobs are running, trigger the proposal engine.
76
+ */
77
+ private scheduleProposalCycle;
78
+ private runProposalCycle;
79
+ }
80
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/jobs/scheduler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,OAAO,EACP,UAAU,EACX,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAMrE,oBAAY,cAAc;IACxB,iBAAiB,sBAAsB;IACvC,iBAAiB,sBAAsB;IACvC,aAAa,kBAAkB;IAC/B,aAAa,kBAAkB;IAC/B,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,mBAAmB,wBAAwB;CAC5C;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAMD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,cAAc,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAMD,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,aAAa,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC;AAMjD,qBAAa,YAAY;IASrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IAXlC,OAAO,CAAC,KAAK,CAAqC;IAClD,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,cAAc,CAAmB;IACzC,OAAO,CAAC,oBAAoB,CAAsB;IAClD,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,qBAAqB,CAA8C;gBAGxD,MAAM,EAAE,SAAS,EACjB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,YAAY,EACrB,cAAc,CAAC,EAAE,uBAAuB,YAAA;IAG3D,KAAK,IAAI,IAAI;IAsBb,IAAI,IAAI,IAAI;IAaZ,MAAM,IAAI,IAAI;IA4Bd,gBAAgB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAC;IAapE,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAIpC,OAAO,CAAC,WAAW;IAuBnB,OAAO,CAAC,UAAU;IAgClB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;YAef,gBAAgB;CAwB/B"}
@@ -0,0 +1,14 @@
1
+ import { CreateJobRun, JobRun, UpdateJobRun } from "@locusai/shared";
2
+ import { BaseModule } from "./base.js";
3
+ export interface JobRunListOptions {
4
+ type?: string;
5
+ status?: string;
6
+ limit?: number;
7
+ }
8
+ export declare class JobsModule extends BaseModule {
9
+ create(workspaceId: string, data: CreateJobRun): Promise<JobRun>;
10
+ list(workspaceId: string, params?: JobRunListOptions): Promise<JobRun[]>;
11
+ get(workspaceId: string, id: string): Promise<JobRun>;
12
+ update(workspaceId: string, id: string, data: UpdateJobRun): Promise<JobRun>;
13
+ }
14
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/modules/jobs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,UAAW,SAAQ,UAAU;IAClC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAQhE,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,iBAAiB,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC;IAQd,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOrD,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,MAAM,CAAC;CAOnB"}
@@ -0,0 +1,12 @@
1
+ import { CreateSuggestion, Suggestion, UpdateSuggestionStatus } from "@locusai/shared";
2
+ import { BaseModule } from "./base.js";
3
+ export interface SuggestionListOptions {
4
+ status?: string;
5
+ }
6
+ export declare class SuggestionsModule extends BaseModule {
7
+ create(workspaceId: string, data: CreateSuggestion): Promise<Suggestion>;
8
+ list(workspaceId: string, params?: SuggestionListOptions): Promise<Suggestion[]>;
9
+ get(workspaceId: string, id: string): Promise<Suggestion>;
10
+ updateStatus(workspaceId: string, id: string, status: UpdateSuggestionStatus): Promise<Suggestion>;
11
+ }
12
+ //# sourceMappingURL=suggestions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggestions.d.ts","sourceRoot":"","sources":["../../src/modules/suggestions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAUvC,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,iBAAkB,SAAQ,UAAU;IACzC,MAAM,CACV,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,UAAU,CAAC;IAQhB,IAAI,CACR,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC;IAQlB,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAOzD,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,UAAU,CAAC;CAOvB"}