@skedulo/integration-sdk 0.9.1 → 0.10.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 (111) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/actions/action-registry.d.ts.map +1 -1
  3. package/dist/actions/action-registry.js +1 -0
  4. package/dist/actions/action-registry.js.map +1 -1
  5. package/dist/actions/data-flow.action.d.ts +62 -0
  6. package/dist/actions/data-flow.action.d.ts.map +1 -0
  7. package/dist/actions/data-flow.action.js +217 -0
  8. package/dist/actions/data-flow.action.js.map +1 -0
  9. package/dist/actions/event.action.d.ts +32 -0
  10. package/dist/actions/event.action.d.ts.map +1 -0
  11. package/dist/actions/event.action.js +113 -0
  12. package/dist/actions/event.action.js.map +1 -0
  13. package/dist/actions/metadata.action.d.ts +44 -0
  14. package/dist/actions/metadata.action.d.ts.map +1 -0
  15. package/dist/actions/metadata.action.js +96 -0
  16. package/dist/actions/metadata.action.js.map +1 -0
  17. package/dist/actions/scheduled-job.action.d.ts +73 -0
  18. package/dist/actions/scheduled-job.action.d.ts.map +1 -0
  19. package/dist/actions/scheduled-job.action.js +355 -0
  20. package/dist/actions/scheduled-job.action.js.map +1 -0
  21. package/dist/actions/sync/index.d.ts +1 -0
  22. package/dist/actions/sync/index.d.ts.map +1 -1
  23. package/dist/actions/sync/index.js +3 -1
  24. package/dist/actions/sync/index.js.map +1 -1
  25. package/dist/actions/sync/retry-failed.action.d.ts +10 -0
  26. package/dist/actions/sync/retry-failed.action.d.ts.map +1 -0
  27. package/dist/actions/sync/retry-failed.action.js +61 -0
  28. package/dist/actions/sync/retry-failed.action.js.map +1 -0
  29. package/dist/actions/sync/types.d.ts +11 -0
  30. package/dist/actions/sync/types.d.ts.map +1 -1
  31. package/dist/actions/sync.action.d.ts +26 -0
  32. package/dist/actions/sync.action.d.ts.map +1 -0
  33. package/dist/actions/sync.action.js +81 -0
  34. package/dist/actions/sync.action.js.map +1 -0
  35. package/dist/actions/utils/action-names.d.ts +1 -0
  36. package/dist/actions/utils/action-names.d.ts.map +1 -1
  37. package/dist/actions/utils/action-names.js +1 -0
  38. package/dist/actions/utils/action-names.js.map +1 -1
  39. package/dist/adapters/capabilities-defaults.d.ts.map +1 -1
  40. package/dist/adapters/capabilities-defaults.js +7 -1
  41. package/dist/adapters/capabilities-defaults.js.map +1 -1
  42. package/dist/adapters/skedulo-mutation-result.d.ts +18 -0
  43. package/dist/adapters/skedulo-mutation-result.d.ts.map +1 -0
  44. package/dist/adapters/skedulo-mutation-result.js +124 -0
  45. package/dist/adapters/skedulo-mutation-result.js.map +1 -0
  46. package/dist/adapters/skedulo.adapter.d.ts +4 -0
  47. package/dist/adapters/skedulo.adapter.d.ts.map +1 -1
  48. package/dist/adapters/skedulo.adapter.js +114 -17
  49. package/dist/adapters/skedulo.adapter.js.map +1 -1
  50. package/dist/clients/failed-record.client.d.ts +37 -0
  51. package/dist/clients/failed-record.client.d.ts.map +1 -0
  52. package/dist/clients/failed-record.client.js +48 -0
  53. package/dist/clients/failed-record.client.js.map +1 -0
  54. package/dist/context.d.ts +3 -0
  55. package/dist/context.d.ts.map +1 -1
  56. package/dist/context.js +5 -0
  57. package/dist/context.js.map +1 -1
  58. package/dist/interfaces/adapter.interface.d.ts +13 -0
  59. package/dist/interfaces/adapter.interface.d.ts.map +1 -1
  60. package/dist/interfaces/integration-capabilities.interface.d.ts +22 -0
  61. package/dist/interfaces/integration-capabilities.interface.d.ts.map +1 -1
  62. package/dist/interfaces/sync-pipeline.interface.d.ts +11 -0
  63. package/dist/interfaces/sync-pipeline.interface.d.ts.map +1 -1
  64. package/dist/services/artifact-builder.d.ts +95 -0
  65. package/dist/services/artifact-builder.d.ts.map +1 -0
  66. package/dist/services/artifact-builder.js +142 -0
  67. package/dist/services/artifact-builder.js.map +1 -0
  68. package/dist/services/external-id-sync.strategy.d.ts.map +1 -1
  69. package/dist/services/external-id-sync.strategy.js +23 -24
  70. package/dist/services/external-id-sync.strategy.js.map +1 -1
  71. package/dist/services/id-mapping-sync.strategy.d.ts.map +1 -1
  72. package/dist/services/id-mapping-sync.strategy.js +35 -21
  73. package/dist/services/id-mapping-sync.strategy.js.map +1 -1
  74. package/dist/services/id-mapping.service.d.ts +2 -0
  75. package/dist/services/id-mapping.service.d.ts.map +1 -1
  76. package/dist/services/id-mapping.service.js +57 -2
  77. package/dist/services/id-mapping.service.js.map +1 -1
  78. package/dist/services/run-log-builder.d.ts +4 -5
  79. package/dist/services/run-log-builder.d.ts.map +1 -1
  80. package/dist/services/run-log-builder.js +4 -5
  81. package/dist/services/run-log-builder.js.map +1 -1
  82. package/dist/services/sync-pipeline-errors.d.ts +24 -0
  83. package/dist/services/sync-pipeline-errors.d.ts.map +1 -0
  84. package/dist/services/sync-pipeline-errors.js +52 -0
  85. package/dist/services/sync-pipeline-errors.js.map +1 -0
  86. package/dist/services/sync-runner.d.ts +15 -0
  87. package/dist/services/sync-runner.d.ts.map +1 -1
  88. package/dist/services/sync-runner.js +246 -9
  89. package/dist/services/sync-runner.js.map +1 -1
  90. package/dist/services/sync.service.d.ts +2 -0
  91. package/dist/services/sync.service.d.ts.map +1 -1
  92. package/dist/services/sync.service.js +1 -0
  93. package/dist/services/sync.service.js.map +1 -1
  94. package/package.json +1 -1
  95. package/.claude/worktrees/agent-a16acadaf5412dffd/jest.config.js +0 -12
  96. package/.claude/worktrees/agent-a33c3e4636d488e49/jest.config.js +0 -12
  97. package/.claude/worktrees/agent-a5b1d2ffa4ceef4a6/jest.config.js +0 -12
  98. package/.claude/worktrees/agent-aa1db4c22eabbde8e/jest.config.js +0 -12
  99. package/.claude/worktrees/agent-ac197ae8c69d7061c/jest.config.js +0 -12
  100. package/dist/handlers/metadata.handler.d.ts +0 -17
  101. package/dist/handlers/metadata.handler.d.ts.map +0 -1
  102. package/dist/handlers/metadata.handler.js +0 -50
  103. package/dist/handlers/metadata.handler.js.map +0 -1
  104. package/dist/utils/normalizeDataFlow.d.ts +0 -3
  105. package/dist/utils/normalizeDataFlow.d.ts.map +0 -1
  106. package/dist/utils/normalizeDataFlow.js +0 -37
  107. package/dist/utils/normalizeDataFlow.js.map +0 -1
  108. package/dist/utils.d.ts +0 -2
  109. package/dist/utils.d.ts.map +0 -1
  110. package/dist/utils.js +0 -10
  111. package/dist/utils.js.map +0 -1
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeGetObjectsAction = makeGetObjectsAction;
4
+ exports.makeGetFieldsAction = makeGetFieldsAction;
5
+ exports.makeGetTemplatesAction = makeGetTemplatesAction;
6
+ exports.makeGetSampleApisAction = makeGetSampleApisAction;
7
+ exports.makeGetSampleRecordsAction = makeGetSampleRecordsAction;
8
+ const action_names_1 = require("./utils/action-names");
9
+ const helpers_1 = require("./utils/helpers");
10
+ const errors_1 = require("./utils/errors");
11
+ /** Default page size for `metadata.get-sample-records` when callers omit `limit`. */
12
+ const DEFAULT_SAMPLE_RECORD_LIMIT = 5;
13
+ function parseSystem(raw) {
14
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
15
+ return { system: typeof obj.system === 'string' ? obj.system : undefined };
16
+ }
17
+ function makeGetObjectsAction(adapter) {
18
+ return {
19
+ name: action_names_1.ACTIONS.metadata.getObjects,
20
+ parseInput: parseSystem,
21
+ async handler(input, ctx) {
22
+ const { system, adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
23
+ const objects = await resolved.getObjects(ctx);
24
+ return { system, objects };
25
+ },
26
+ };
27
+ }
28
+ function makeGetFieldsAction(adapter) {
29
+ return {
30
+ name: action_names_1.ACTIONS.metadata.getFields,
31
+ parseInput(raw) {
32
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
33
+ const system = typeof obj.system === 'string' ? obj.system : undefined;
34
+ const object = obj.object;
35
+ if (typeof object !== 'string' || !object) {
36
+ throw new errors_1.InvalidInputError('object is required');
37
+ }
38
+ return { system, object };
39
+ },
40
+ async handler(input, ctx) {
41
+ const { system, adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
42
+ const fields = await resolved.getFields(ctx, input.object);
43
+ return { system, object: input.object, fields };
44
+ },
45
+ };
46
+ }
47
+ function makeGetTemplatesAction(adapter) {
48
+ return {
49
+ name: action_names_1.ACTIONS.metadata.getTemplates,
50
+ parseInput: parseSystem,
51
+ async handler(input) {
52
+ var _a, _b;
53
+ const { adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
54
+ const templates = (_b = (await ((_a = resolved.getTemplates) === null || _a === void 0 ? void 0 : _a.call(resolved)))) !== null && _b !== void 0 ? _b : [];
55
+ return { templates };
56
+ },
57
+ };
58
+ }
59
+ function makeGetSampleApisAction(adapter) {
60
+ return {
61
+ name: action_names_1.ACTIONS.metadata.getSampleApis,
62
+ parseInput: parseSystem,
63
+ async handler(input) {
64
+ var _a, _b;
65
+ const { adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
66
+ const apis = (_b = (_a = resolved.getSampleAPIs) === null || _a === void 0 ? void 0 : _a.call(resolved)) !== null && _b !== void 0 ? _b : [];
67
+ return { apis };
68
+ },
69
+ };
70
+ }
71
+ function makeGetSampleRecordsAction(adapter) {
72
+ return {
73
+ name: action_names_1.ACTIONS.metadata.getSampleRecords,
74
+ parseInput(raw) {
75
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
76
+ const system = typeof obj.system === 'string' ? obj.system : undefined;
77
+ const objectType = obj.objectType;
78
+ if (typeof objectType !== 'string' || !objectType) {
79
+ throw new errors_1.InvalidInputError('objectType is required');
80
+ }
81
+ const limit = obj.limit === undefined ? DEFAULT_SAMPLE_RECORD_LIMIT : Number(obj.limit);
82
+ if (!Number.isInteger(limit) || limit <= 0) {
83
+ throw new errors_1.InvalidInputError('limit must be a positive integer');
84
+ }
85
+ return { system, objectType, limit };
86
+ },
87
+ async handler(input, ctx) {
88
+ const { adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
89
+ const fields = await resolved.getFields(ctx, input.objectType);
90
+ const properties = fields.map((f) => f.name);
91
+ const records = await resolved.fetchSampleRecords(ctx, input.objectType, properties, input.limit);
92
+ return { records };
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=metadata.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.action.js","sourceRoot":"","sources":["../../src/actions/metadata.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { Adapter } from '../interfaces/adapter.interface';
2
+ import type { AdapterRegistry } from '../adapters/adapter-registry';
3
+ import type { BatchResult } from '../interfaces/sync-result.interface';
4
+ import { JobIntervalUnit, type ScheduledJob } from '../interfaces/scheduled-job.interface';
5
+ import type { Action } from './utils/types';
6
+ type JobDeps = {
7
+ adapter: Adapter;
8
+ registry: AdapterRegistry;
9
+ };
10
+ interface RunJobInput {
11
+ webhookName: string;
12
+ }
13
+ type PerFlowResultBase = {
14
+ flowId: number;
15
+ sourceObject?: string;
16
+ targetObject?: string;
17
+ };
18
+ export type PerFlowResult = PerFlowResultBase & ({
19
+ skipped: true;
20
+ reason: string;
21
+ } | {
22
+ error: string;
23
+ } | (BatchResult & {
24
+ durationMs: number;
25
+ }));
26
+ export interface RunJobOutput {
27
+ webhookName: string;
28
+ skipped?: boolean;
29
+ results: PerFlowResult[];
30
+ }
31
+ /**
32
+ * Run a scheduled job: load it from config by `webhook_name`, then run its
33
+ * `flow_ids` sequentially in order. Continue-on-error — one flow failing does
34
+ * not stop the rest; the failed flow's cursor holds (SyncRunner only advances on
35
+ * zero failures) so it retries next cycle. Per-flow direction is decided by the
36
+ * flow's own `sourceSystem`.
37
+ */
38
+ export declare function makeRunJobAction(deps: JobDeps): Action<RunJobInput, RunJobOutput>;
39
+ export declare function makeScheduledJobListAction(deps: JobDeps): Action<void, ScheduledJob[]>;
40
+ export declare function makeScheduledJobGetAction(deps: JobDeps): Action<{
41
+ webhookName: string;
42
+ }, ScheduledJob>;
43
+ interface CreateJobInput {
44
+ name: string;
45
+ interval_value: number;
46
+ interval_unit: JobIntervalUnit;
47
+ flow_ids: number[];
48
+ enabled: boolean;
49
+ }
50
+ export declare function makeScheduledJobCreateAction(deps: JobDeps): Action<CreateJobInput, ScheduledJob>;
51
+ interface UpdateJobInput {
52
+ webhook_name: string;
53
+ name?: string;
54
+ interval_value?: number;
55
+ interval_unit?: JobIntervalUnit;
56
+ flow_ids?: number[];
57
+ enabled?: boolean;
58
+ }
59
+ export declare function makeScheduledJobUpdateAction(deps: JobDeps): Action<UpdateJobInput, ScheduledJob>;
60
+ /**
61
+ * Delete a scheduled job. Config is the source of truth, so the job is dropped
62
+ * from config first, then the webhook is torn down (404-tolerant, best-effort).
63
+ * If ES returns a 5xx the config write still stands and an orphan webhook may
64
+ * remain — safe to retry the delete, which is idempotent.
65
+ */
66
+ export declare function makeScheduledJobDeleteAction(deps: JobDeps): Action<{
67
+ webhookName: string;
68
+ }, {
69
+ webhookName: string;
70
+ deleted: boolean;
71
+ }>;
72
+ export {};
73
+ //# sourceMappingURL=scheduled-job.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-job.action.d.ts","sourceRoot":"","sources":["../../src/actions/scheduled-job.action.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACpE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qCAAqC,CAAC;AAEvE,OAAO,EAEL,eAAe,EAEf,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAe/C,OAAO,KAAK,EAAE,MAAM,EAAa,MAAM,eAAe,CAAC;AAGvD,KAAK,OAAO,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAgH/D,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,iBAAiB,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAC1F,MAAM,MAAM,aAAa,GAAG,iBAAiB,GAC3C,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC,WAAW,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC;AAEnG,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,CA0EjF;AAID,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,CAAC,CAWtF;AAED,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,CAAC,CAe/C;AAID,UAAU,cAAc;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,eAAe,CAAC;IAC/B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CA+ChG;AAID,UAAU,cAAc;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAyDhG;AAID;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,OAAO,GACZ,MAAM,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,EAAE;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CA8B5E"}
@@ -0,0 +1,355 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeRunJobAction = makeRunJobAction;
4
+ exports.makeScheduledJobListAction = makeScheduledJobListAction;
5
+ exports.makeScheduledJobGetAction = makeScheduledJobGetAction;
6
+ exports.makeScheduledJobCreateAction = makeScheduledJobCreateAction;
7
+ exports.makeScheduledJobUpdateAction = makeScheduledJobUpdateAction;
8
+ exports.makeScheduledJobDeleteAction = makeScheduledJobDeleteAction;
9
+ const pulse_solution_services_1 = require("@skedulo/pulse-solution-services");
10
+ const constants_1 = require("../constants");
11
+ const scheduled_job_interface_1 = require("../interfaces/scheduled-job.interface");
12
+ const sync_runner_1 = require("../services/sync-runner");
13
+ const helpers_1 = require("../utils/helpers");
14
+ const artifact_builder_1 = require("../utils/artifact-builder");
15
+ const action_names_1 = require("./utils/action-names");
16
+ const helpers_2 = require("./utils/helpers");
17
+ const errors_1 = require("./utils/errors");
18
+ // ── shared helpers ─────────────────────────────────────────────────────────
19
+ function readConfig(ctx, integrationType) {
20
+ return ctx.integrationConfigClient.get(integrationType).then((raw) => (0, scheduled_job_interface_1.asIntegrationConfig)(raw));
21
+ }
22
+ function jobCron(job) {
23
+ return (0, artifact_builder_1.intervalMinutesToCron)((0, artifact_builder_1.jobIntervalToMinutes)(job));
24
+ }
25
+ /** A job fires only when enabled with at least one flow. */
26
+ function jobShouldRun(job) {
27
+ return job.enabled && job.flow_ids.length > 0;
28
+ }
29
+ /**
30
+ * Reconcile the ES webhook for a job: provision when it should run, otherwise
31
+ * tear it down (404-tolerant). `webhook_name` is both the artifact name and the
32
+ * job-id header.
33
+ */
34
+ async function reconcileJobArtifact(ctx, job) {
35
+ const client = ctx.newArtifactClient(pulse_solution_services_1.ArtifactType.WEBHOOK);
36
+ if (jobShouldRun(job)) {
37
+ await (0, artifact_builder_1.upsertArtifact)(client, job.webhook_name, (0, artifact_builder_1.buildJobWebhookArtifact)({
38
+ webhookName: job.webhook_name,
39
+ url: (0, artifact_builder_1.functionCallbackUrl)(ctx.integrationType),
40
+ cron: jobCron(job),
41
+ }));
42
+ }
43
+ else {
44
+ await (0, artifact_builder_1.deleteArtifactIfExists)(client, job.webhook_name);
45
+ }
46
+ }
47
+ /**
48
+ * Validate that every `flow_id` belongs to this integration and that no id is
49
+ * already claimed by another job (J5 — the per-flow cursor can't be shared).
50
+ */
51
+ async function validateFlowIds(ctx, integrationType, flowIds, otherJobs) {
52
+ const claimed = new Map();
53
+ for (const j of otherJobs) {
54
+ for (const id of j.flow_ids)
55
+ claimed.set(id, j.webhook_name);
56
+ }
57
+ for (const id of flowIds) {
58
+ const owner = claimed.get(id);
59
+ if (owner) {
60
+ throw new errors_1.InvalidInputError(`Flow ${id} is already in scheduled job '${owner}'`);
61
+ }
62
+ }
63
+ if (flowIds.length === 0)
64
+ return;
65
+ const existing = await ctx.dataFlowService.list({ integrationType });
66
+ const validIds = new Set(existing.map((f) => f.id));
67
+ for (const id of flowIds) {
68
+ if (!validIds.has(id)) {
69
+ throw new errors_1.InvalidInputError(`Flow ${id} does not exist for integration '${integrationType}'`);
70
+ }
71
+ }
72
+ }
73
+ // ── input parsing ────────────────────────────────────────────────────────────
74
+ function asRecord(raw) {
75
+ return (raw !== null && raw !== void 0 ? raw : {});
76
+ }
77
+ function parseName(value) {
78
+ if (typeof value !== 'string' || value.trim().length === 0) {
79
+ throw new errors_1.InvalidInputError('name must be a non-empty string');
80
+ }
81
+ return value;
82
+ }
83
+ function parseIntervalUnit(value) {
84
+ if (value === scheduled_job_interface_1.JobIntervalUnit.MINUTES || value === scheduled_job_interface_1.JobIntervalUnit.HOURS)
85
+ return value;
86
+ throw new errors_1.InvalidInputError('interval_unit must be "minutes" or "hours"');
87
+ }
88
+ function parseFlowIds(value) {
89
+ if (!Array.isArray(value) || value.some((id) => !Number.isInteger(id) || id <= 0)) {
90
+ throw new errors_1.InvalidInputError('flow_ids must be an array of positive integers');
91
+ }
92
+ // Reject duplicates within the same job — ordering must be unambiguous.
93
+ if (new Set(value).size !== value.length) {
94
+ throw new errors_1.InvalidInputError('flow_ids must not contain duplicates');
95
+ }
96
+ return value;
97
+ }
98
+ function parseWebhookName(raw) {
99
+ var _a;
100
+ const obj = asRecord(raw);
101
+ // Accept both casings at the wire boundary: the persisted shape uses
102
+ // `webhook_name`, while UI/TS callers send `webhookName`.
103
+ const name = (_a = obj.webhook_name) !== null && _a !== void 0 ? _a : obj.webhookName;
104
+ if (typeof name !== 'string' || name.length === 0) {
105
+ throw new errors_1.InvalidInputError('webhook_name must be a non-empty string');
106
+ }
107
+ return name;
108
+ }
109
+ /**
110
+ * Run a scheduled job: load it from config by `webhook_name`, then run its
111
+ * `flow_ids` sequentially in order. Continue-on-error — one flow failing does
112
+ * not stop the rest; the failed flow's cursor holds (SyncRunner only advances on
113
+ * zero failures) so it retries next cycle. Per-flow direction is decided by the
114
+ * flow's own `sourceSystem`.
115
+ */
116
+ function makeRunJobAction(deps) {
117
+ return {
118
+ name: action_names_1.ACTIONS.sync.runJob,
119
+ parseInput(raw, meta) {
120
+ const fromMeta = meta === null || meta === void 0 ? void 0 : meta.scheduledJobName;
121
+ if (typeof fromMeta === 'string' && fromMeta.length > 0) {
122
+ return { webhookName: fromMeta };
123
+ }
124
+ return { webhookName: parseWebhookName(raw) };
125
+ },
126
+ async handler(input, ctx) {
127
+ var _a, _b;
128
+ const integrationType = deps.adapter.integrationType;
129
+ const lookupStrategy = (0, helpers_2.resolveLookupStrategy)(deps.adapter);
130
+ const config = await readConfig(ctx, integrationType);
131
+ const job = config.scheduled_jobs.find((j) => j.webhook_name === input.webhookName);
132
+ if (!job) {
133
+ throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhookName}' not found`);
134
+ }
135
+ if (!jobShouldRun(job)) {
136
+ ctx.logger.info(`[run-job] ${job.webhook_name} skipped (disabled or no flows)`);
137
+ return { webhookName: job.webhook_name, skipped: true, results: [] };
138
+ }
139
+ ctx.logger.info(`[run-job] ${job.webhook_name} running ${job.flow_ids.length} flow(s) in order: ` +
140
+ job.flow_ids.join(', '));
141
+ const runner = new sync_runner_1.SyncRunner(deps.registry);
142
+ const results = [];
143
+ for (const flowId of job.flow_ids) {
144
+ const startedAt = Date.now();
145
+ try {
146
+ const flow = await ctx.dataFlowService.getFlowById(flowId);
147
+ if (!flow) {
148
+ ctx.logger.warn(`[run-job] ${job.webhook_name} flow=${flowId} not found — skipping`);
149
+ results.push({ flowId, skipped: true, reason: 'flow not found' });
150
+ continue;
151
+ }
152
+ const stats = await runner.run({
153
+ flowId,
154
+ since: null,
155
+ sourceSystem: (_a = flow.sourceSystem) !== null && _a !== void 0 ? _a : integrationType,
156
+ targetSystem: (_b = flow.targetSystem) !== null && _b !== void 0 ? _b : constants_1.SKEDULO_SYSTEM,
157
+ options: { lookupStrategy },
158
+ }, ctx);
159
+ const durationMs = Date.now() - startedAt;
160
+ ctx.logger.info(`[run-job] ${job.webhook_name} flow=${flowId} ${flow.sourceObject}→${flow.targetObject} ` +
161
+ `${JSON.stringify(stats)} took=${durationMs}ms`);
162
+ results.push(Object.assign({ flowId, sourceObject: flow.sourceObject, targetObject: flow.targetObject, durationMs }, stats));
163
+ }
164
+ catch (err) {
165
+ const msg = err instanceof Error ? err.message : String(err);
166
+ ctx.logger.error(`[run-job] ${job.webhook_name} flow=${flowId} failed: ${msg}`);
167
+ results.push({ flowId, error: msg });
168
+ }
169
+ }
170
+ return { webhookName: job.webhook_name, results };
171
+ },
172
+ };
173
+ }
174
+ // ── scheduled-job.list / .get ────────────────────────────────────────────────
175
+ function makeScheduledJobListAction(deps) {
176
+ return {
177
+ name: action_names_1.ACTIONS.scheduledJob.list,
178
+ parseInput() {
179
+ return undefined;
180
+ },
181
+ async handler(_input, ctx) {
182
+ const config = await readConfig(ctx, deps.adapter.integrationType);
183
+ return config.scheduled_jobs;
184
+ },
185
+ };
186
+ }
187
+ function makeScheduledJobGetAction(deps) {
188
+ return {
189
+ name: action_names_1.ACTIONS.scheduledJob.get,
190
+ parseInput(raw) {
191
+ return { webhookName: parseWebhookName(raw) };
192
+ },
193
+ async handler(input, ctx) {
194
+ const config = await readConfig(ctx, deps.adapter.integrationType);
195
+ const job = config.scheduled_jobs.find((j) => j.webhook_name === input.webhookName);
196
+ if (!job) {
197
+ throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhookName}' not found`);
198
+ }
199
+ return job;
200
+ },
201
+ };
202
+ }
203
+ function makeScheduledJobCreateAction(deps) {
204
+ return {
205
+ name: action_names_1.ACTIONS.scheduledJob.create,
206
+ parseInput(raw) {
207
+ var _a;
208
+ const obj = asRecord(raw);
209
+ // Validate interval bounds eagerly so bad input is rejected at parse time.
210
+ const interval_value = typeof obj.interval_value === 'number' ? obj.interval_value : Number.NaN;
211
+ const input = {
212
+ name: parseName(obj.name),
213
+ interval_value,
214
+ interval_unit: parseIntervalUnit(obj.interval_unit),
215
+ flow_ids: parseFlowIds((_a = obj.flow_ids) !== null && _a !== void 0 ? _a : []),
216
+ enabled: obj.enabled === undefined ? true : Boolean(obj.enabled),
217
+ };
218
+ (0, artifact_builder_1.jobIntervalToMinutes)(input); // throws InvalidInputError on out-of-range
219
+ return input;
220
+ },
221
+ async handler(input, ctx) {
222
+ if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
223
+ throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.create requires admin privileges');
224
+ }
225
+ const integrationType = deps.adapter.integrationType;
226
+ const webhook_name = (0, artifact_builder_1.buildJobArtifactName)(integrationType, input.name);
227
+ const prev = await readConfig(ctx, integrationType);
228
+ if (prev.scheduled_jobs.some((j) => j.webhook_name === webhook_name)) {
229
+ throw new errors_1.InvalidInputError(`A scheduled job named '${input.name}' already exists (webhook_name '${webhook_name}')`);
230
+ }
231
+ await validateFlowIds(ctx, integrationType, input.flow_ids, prev.scheduled_jobs);
232
+ const job = {
233
+ webhook_name,
234
+ name: input.name,
235
+ interval_value: input.interval_value,
236
+ interval_unit: input.interval_unit,
237
+ flow_ids: input.flow_ids,
238
+ enabled: input.enabled,
239
+ };
240
+ const next = { scheduled_jobs: [...prev.scheduled_jobs, job] };
241
+ await writeConfigThenArtifact(ctx, integrationType, prev, next, job);
242
+ return job;
243
+ },
244
+ };
245
+ }
246
+ function makeScheduledJobUpdateAction(deps) {
247
+ return {
248
+ name: action_names_1.ACTIONS.scheduledJob.update,
249
+ parseInput(raw) {
250
+ const obj = asRecord(raw);
251
+ const input = { webhook_name: parseWebhookName(raw) };
252
+ if (obj.name !== undefined)
253
+ input.name = parseName(obj.name);
254
+ if (obj.interval_value !== undefined) {
255
+ if (typeof obj.interval_value !== 'number') {
256
+ throw new errors_1.InvalidInputError('interval_value must be a number');
257
+ }
258
+ input.interval_value = obj.interval_value;
259
+ }
260
+ if (obj.interval_unit !== undefined)
261
+ input.interval_unit = parseIntervalUnit(obj.interval_unit);
262
+ if (obj.flow_ids !== undefined)
263
+ input.flow_ids = parseFlowIds(obj.flow_ids);
264
+ if (obj.enabled !== undefined)
265
+ input.enabled = Boolean(obj.enabled);
266
+ return input;
267
+ },
268
+ async handler(input, ctx) {
269
+ var _a, _b, _c, _d, _e;
270
+ if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
271
+ throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.update requires admin privileges');
272
+ }
273
+ const integrationType = deps.adapter.integrationType;
274
+ const prev = await readConfig(ctx, integrationType);
275
+ const existing = prev.scheduled_jobs.find((j) => j.webhook_name === input.webhook_name);
276
+ if (!existing) {
277
+ throw new errors_1.ActionError('JOB_NOT_FOUND', `Scheduled job '${input.webhook_name}' not found`);
278
+ }
279
+ // webhook_name is immutable — only the mutable fields change.
280
+ const merged = {
281
+ webhook_name: existing.webhook_name,
282
+ name: (_a = input.name) !== null && _a !== void 0 ? _a : existing.name,
283
+ interval_value: (_b = input.interval_value) !== null && _b !== void 0 ? _b : existing.interval_value,
284
+ interval_unit: (_c = input.interval_unit) !== null && _c !== void 0 ? _c : existing.interval_unit,
285
+ flow_ids: (_d = input.flow_ids) !== null && _d !== void 0 ? _d : existing.flow_ids,
286
+ enabled: (_e = input.enabled) !== null && _e !== void 0 ? _e : existing.enabled,
287
+ };
288
+ (0, artifact_builder_1.jobIntervalToMinutes)(merged); // re-validate bounds after merge
289
+ const others = prev.scheduled_jobs.filter((j) => j.webhook_name !== input.webhook_name);
290
+ if (input.flow_ids !== undefined) {
291
+ await validateFlowIds(ctx, integrationType, merged.flow_ids, others);
292
+ }
293
+ const next = {
294
+ scheduled_jobs: prev.scheduled_jobs.map((j) => j.webhook_name === merged.webhook_name ? merged : j),
295
+ };
296
+ await writeConfigThenArtifact(ctx, integrationType, prev, next, merged);
297
+ return merged;
298
+ },
299
+ };
300
+ }
301
+ // ── scheduled-job.delete ─────────────────────────────────────────────────────
302
+ /**
303
+ * Delete a scheduled job. Config is the source of truth, so the job is dropped
304
+ * from config first, then the webhook is torn down (404-tolerant, best-effort).
305
+ * If ES returns a 5xx the config write still stands and an orphan webhook may
306
+ * remain — safe to retry the delete, which is idempotent.
307
+ */
308
+ function makeScheduledJobDeleteAction(deps) {
309
+ return {
310
+ name: action_names_1.ACTIONS.scheduledJob.delete,
311
+ parseInput(raw) {
312
+ return { webhookName: parseWebhookName(raw) };
313
+ },
314
+ async handler(input, ctx) {
315
+ if (!(0, helpers_1.isAdminRequest)(ctx.skedContext)) {
316
+ throw new errors_1.ActionError('FORBIDDEN', 'scheduled-job.delete requires admin privileges');
317
+ }
318
+ const integrationType = deps.adapter.integrationType;
319
+ const prev = await readConfig(ctx, integrationType);
320
+ const existed = prev.scheduled_jobs.some((j) => j.webhook_name === input.webhookName);
321
+ // Config is source of truth: drop the job first, then tear down the webhook
322
+ // (404-tolerant, so no rollback needed). Idempotent if already gone.
323
+ if (existed) {
324
+ const next = {
325
+ scheduled_jobs: prev.scheduled_jobs.filter((j) => j.webhook_name !== input.webhookName),
326
+ };
327
+ await ctx.integrationConfigClient.replace(integrationType, next);
328
+ }
329
+ await (0, artifact_builder_1.deleteArtifactIfExists)(ctx.newArtifactClient(pulse_solution_services_1.ArtifactType.WEBHOOK), input.webhookName);
330
+ return { webhookName: input.webhookName, deleted: existed };
331
+ },
332
+ };
333
+ }
334
+ /**
335
+ * Two-phase fail-closed write for create/update: persist config first, then
336
+ * reconcile the ES artifact. If the artifact step throws, roll the config back
337
+ * to `prev` (IS uses replace semantics) before re-raising — no orphaned webhook,
338
+ * no lost config.
339
+ */
340
+ async function writeConfigThenArtifact(ctx, integrationType, prev, next, job) {
341
+ await ctx.integrationConfigClient.replace(integrationType, next);
342
+ try {
343
+ await reconcileJobArtifact(ctx, job);
344
+ }
345
+ catch (err) {
346
+ try {
347
+ await ctx.integrationConfigClient.replace(integrationType, prev);
348
+ }
349
+ catch (_a) {
350
+ // best-effort rollback; surface the original artifact error
351
+ }
352
+ throw err;
353
+ }
354
+ }
355
+ //# sourceMappingURL=scheduled-job.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduled-job.action.js","sourceRoot":"","sources":["../../src/actions/scheduled-job.action.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  export * from './types';
2
2
  export { makeRunFlowAction } from './run-flow.action';
3
3
  export { makeRunJobAction } from './run-job.action';
4
+ export { makeRetryFailedAction } from './retry-failed.action';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/sync/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -14,10 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.makeRunJobAction = exports.makeRunFlowAction = void 0;
17
+ exports.makeRetryFailedAction = exports.makeRunJobAction = exports.makeRunFlowAction = void 0;
18
18
  __exportStar(require("./types"), exports);
19
19
  var run_flow_action_1 = require("./run-flow.action");
20
20
  Object.defineProperty(exports, "makeRunFlowAction", { enumerable: true, get: function () { return run_flow_action_1.makeRunFlowAction; } });
21
21
  var run_job_action_1 = require("./run-job.action");
22
22
  Object.defineProperty(exports, "makeRunJobAction", { enumerable: true, get: function () { return run_job_action_1.makeRunJobAction; } });
23
+ var retry_failed_action_1 = require("./retry-failed.action");
24
+ Object.defineProperty(exports, "makeRetryFailedAction", { enumerable: true, get: function () { return retry_failed_action_1.makeRetryFailedAction; } });
23
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/sync/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,qDAAsD;AAA7C,oHAAA,iBAAiB,OAAA;AAC1B,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/sync/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,qDAAsD;AAA7C,oHAAA,iBAAiB,OAAA;AAC1B,mDAAoD;AAA3C,kHAAA,gBAAgB,OAAA;AACzB,6DAA8D;AAArD,4HAAA,qBAAqB,OAAA"}
@@ -0,0 +1,10 @@
1
+ import type { Action } from '../utils/types';
2
+ import type { RetryFailedInput, RetryFailedOutput, SyncDeps } from './types';
3
+ /**
4
+ * Retry specific failed records for a flow. Admin-only. Takes the source-system ids the
5
+ * caller already holds (from the failed-records list), re-fetches those records via the
6
+ * adapter's `fetchByIds` — current state, so a source-side fix takes effect — re-runs the
7
+ * pipeline, then reconciles: resolve the ones that now pass, re-record the ones that still fail.
8
+ */
9
+ export declare function makeRetryFailedAction(deps: SyncDeps): Action<RetryFailedInput, RetryFailedOutput>;
10
+ //# sourceMappingURL=retry-failed.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-failed.action.d.ts","sourceRoot":"","sources":["../../../src/actions/sync/retry-failed.action.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE7E;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAiDjG"}