@shipfox/api-integration-core 2.0.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/.turbo/turbo-build.log +2 -0
- package/.turbo/turbo-type$colon$emit.log +1 -0
- package/.turbo/turbo-type.log +1 -0
- package/CHANGELOG.md +264 -0
- package/LICENSE +21 -0
- package/dist/config.d.ts +9 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +29 -0
- package/dist/config.js.map +1 -0
- package/dist/core/agent-tool-selection.d.ts +15 -0
- package/dist/core/agent-tool-selection.d.ts.map +1 -0
- package/dist/core/agent-tool-selection.js +48 -0
- package/dist/core/agent-tool-selection.js.map +1 -0
- package/dist/core/entities/connection.d.ts +2 -0
- package/dist/core/entities/connection.d.ts.map +1 -0
- package/dist/core/entities/connection.js +3 -0
- package/dist/core/entities/connection.js.map +1 -0
- package/dist/core/entities/provider.d.ts +6 -0
- package/dist/core/entities/provider.d.ts.map +1 -0
- package/dist/core/entities/provider.js +3 -0
- package/dist/core/entities/provider.js.map +1 -0
- package/dist/core/errors.d.ts +29 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +40 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/providers/agent-tools.d.ts +2 -0
- package/dist/core/providers/agent-tools.d.ts.map +1 -0
- package/dist/core/providers/agent-tools.js +3 -0
- package/dist/core/providers/agent-tools.js.map +1 -0
- package/dist/core/providers/redact-checkout-spec.d.ts +9 -0
- package/dist/core/providers/redact-checkout-spec.d.ts.map +1 -0
- package/dist/core/providers/redact-checkout-spec.js +25 -0
- package/dist/core/providers/redact-checkout-spec.js.map +1 -0
- package/dist/core/providers/registry.d.ts +9 -0
- package/dist/core/providers/registry.d.ts.map +1 -0
- package/dist/core/providers/registry.js +52 -0
- package/dist/core/providers/registry.js.map +1 -0
- package/dist/core/providers/source-control.d.ts +2 -0
- package/dist/core/providers/source-control.d.ts.map +1 -0
- package/dist/core/providers/source-control.js +3 -0
- package/dist/core/providers/source-control.js.map +1 -0
- package/dist/core/source-control-service.d.ts +46 -0
- package/dist/core/source-control-service.d.ts.map +1 -0
- package/dist/core/source-control-service.js +84 -0
- package/dist/core/source-control-service.js.map +1 -0
- package/dist/db/connections.d.ts +67 -0
- package/dist/db/connections.d.ts.map +1 -0
- package/dist/db/connections.js +130 -0
- package/dist/db/connections.js.map +1 -0
- package/dist/db/db.d.ts +865 -0
- package/dist/db/db.d.ts.map +1 -0
- package/dist/db/db.js +22 -0
- package/dist/db/db.js.map +1 -0
- package/dist/db/migrations.d.ts +2 -0
- package/dist/db/migrations.d.ts.map +1 -0
- package/dist/db/migrations.js +5 -0
- package/dist/db/migrations.js.map +1 -0
- package/dist/db/schema/common.d.ts +2 -0
- package/dist/db/schema/common.d.ts.map +1 -0
- package/dist/db/schema/common.js +4 -0
- package/dist/db/schema/common.js.map +1 -0
- package/dist/db/schema/connections.d.ts +165 -0
- package/dist/db/schema/connections.d.ts.map +1 -0
- package/dist/db/schema/connections.js +37 -0
- package/dist/db/schema/connections.js.map +1 -0
- package/dist/db/schema/outbox.d.ts +195 -0
- package/dist/db/schema/outbox.d.ts.map +1 -0
- package/dist/db/schema/outbox.js +5 -0
- package/dist/db/schema/outbox.js.map +1 -0
- package/dist/db/schema/webhook-deliveries.d.ts +76 -0
- package/dist/db/schema/webhook-deliveries.d.ts.map +1 -0
- package/dist/db/schema/webhook-deliveries.js +22 -0
- package/dist/db/schema/webhook-deliveries.js.map +1 -0
- package/dist/db/webhook-deliveries.d.ts +55 -0
- package/dist/db/webhook-deliveries.d.ts.map +1 -0
- package/dist/db/webhook-deliveries.js +132 -0
- package/dist/db/webhook-deliveries.js.map +1 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +3 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/instance.d.ts +8 -0
- package/dist/metrics/instance.d.ts.map +1 -0
- package/dist/metrics/instance.js +17 -0
- package/dist/metrics/instance.js.map +1 -0
- package/dist/presentation/dto/integrations.d.ts +36 -0
- package/dist/presentation/dto/integrations.d.ts.map +1 -0
- package/dist/presentation/dto/integrations.js +26 -0
- package/dist/presentation/dto/integrations.js.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/audit.d.ts +24 -0
- package/dist/presentation/routes/agent-tools-gateway/audit.d.ts.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/audit.js +52 -0
- package/dist/presentation/routes/agent-tools-gateway/audit.js.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/dispatch.d.ts +7 -0
- package/dist/presentation/routes/agent-tools-gateway/dispatch.d.ts.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/dispatch.js +108 -0
- package/dist/presentation/routes/agent-tools-gateway/dispatch.js.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/index.d.ts +12 -0
- package/dist/presentation/routes/agent-tools-gateway/index.d.ts.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/index.js +46 -0
- package/dist/presentation/routes/agent-tools-gateway/index.js.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/mcp-server.d.ts +17 -0
- package/dist/presentation/routes/agent-tools-gateway/mcp-server.d.ts.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/mcp-server.js +126 -0
- package/dist/presentation/routes/agent-tools-gateway/mcp-server.js.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/resolve-authorized-tools.d.ts +37 -0
- package/dist/presentation/routes/agent-tools-gateway/resolve-authorized-tools.d.ts.map +1 -0
- package/dist/presentation/routes/agent-tools-gateway/resolve-authorized-tools.js +145 -0
- package/dist/presentation/routes/agent-tools-gateway/resolve-authorized-tools.js.map +1 -0
- package/dist/presentation/routes/errors.d.ts +2 -0
- package/dist/presentation/routes/errors.d.ts.map +1 -0
- package/dist/presentation/routes/errors.js +53 -0
- package/dist/presentation/routes/errors.js.map +1 -0
- package/dist/presentation/routes/index.d.ts +14 -0
- package/dist/presentation/routes/index.d.ts.map +1 -0
- package/dist/presentation/routes/index.js +26 -0
- package/dist/presentation/routes/index.js.map +1 -0
- package/dist/presentation/routes/list-connections.d.ts +3 -0
- package/dist/presentation/routes/list-connections.d.ts.map +1 -0
- package/dist/presentation/routes/list-connections.js +58 -0
- package/dist/presentation/routes/list-connections.js.map +1 -0
- package/dist/presentation/routes/list-providers.d.ts +3 -0
- package/dist/presentation/routes/list-providers.d.ts.map +1 -0
- package/dist/presentation/routes/list-providers.js +27 -0
- package/dist/presentation/routes/list-providers.js.map +1 -0
- package/dist/presentation/routes/list-repositories.d.ts +3 -0
- package/dist/presentation/routes/list-repositories.d.ts.map +1 -0
- package/dist/presentation/routes/list-repositories.js +41 -0
- package/dist/presentation/routes/list-repositories.js.map +1 -0
- package/dist/presentation/routes/manage-connections.d.ts +4 -0
- package/dist/presentation/routes/manage-connections.d.ts.map +1 -0
- package/dist/presentation/routes/manage-connections.js +81 -0
- package/dist/presentation/routes/manage-connections.js.map +1 -0
- package/dist/providers/connection-slug.d.ts +2 -0
- package/dist/providers/connection-slug.d.ts.map +1 -0
- package/dist/providers/connection-slug.js +19 -0
- package/dist/providers/connection-slug.js.map +1 -0
- package/dist/providers/cron.d.ts +3 -0
- package/dist/providers/cron.d.ts.map +1 -0
- package/dist/providers/cron.js +13 -0
- package/dist/providers/cron.js.map +1 -0
- package/dist/providers/gitea.d.ts +3 -0
- package/dist/providers/gitea.d.ts.map +1 -0
- package/dist/providers/gitea.js +75 -0
- package/dist/providers/gitea.js.map +1 -0
- package/dist/providers/github.d.ts +3 -0
- package/dist/providers/github.d.ts.map +1 -0
- package/dist/providers/github.js +109 -0
- package/dist/providers/github.js.map +1 -0
- package/dist/providers/linear.d.ts +3 -0
- package/dist/providers/linear.d.ts.map +1 -0
- package/dist/providers/linear.js +134 -0
- package/dist/providers/linear.js.map +1 -0
- package/dist/providers/modules.d.ts +3 -0
- package/dist/providers/modules.d.ts.map +1 -0
- package/dist/providers/modules.js +26 -0
- package/dist/providers/modules.js.map +1 -0
- package/dist/providers/sentry.d.ts +3 -0
- package/dist/providers/sentry.d.ts.map +1 -0
- package/dist/providers/sentry.js +83 -0
- package/dist/providers/sentry.js.map +1 -0
- package/dist/providers/types.d.ts +58 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +3 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/providers/webhook.d.ts +3 -0
- package/dist/providers/webhook.d.ts.map +1 -0
- package/dist/providers/webhook.js +24 -0
- package/dist/providers/webhook.js.map +1 -0
- package/dist/temporal/activities/index.d.ts +5 -0
- package/dist/temporal/activities/index.d.ts.map +1 -0
- package/dist/temporal/activities/index.js +8 -0
- package/dist/temporal/activities/index.js.map +1 -0
- package/dist/temporal/activities/prune-webhook-deliveries.d.ts +4 -0
- package/dist/temporal/activities/prune-webhook-deliveries.d.ts.map +1 -0
- package/dist/temporal/activities/prune-webhook-deliveries.js +11 -0
- package/dist/temporal/activities/prune-webhook-deliveries.js.map +1 -0
- package/dist/temporal/constants.d.ts +3 -0
- package/dist/temporal/constants.d.ts.map +1 -0
- package/dist/temporal/constants.js +4 -0
- package/dist/temporal/constants.js.map +1 -0
- package/dist/temporal/workflows/index.d.ts +2 -0
- package/dist/temporal/workflows/index.d.ts.map +1 -0
- package/dist/temporal/workflows/index.js +3 -0
- package/dist/temporal/workflows/index.js.map +1 -0
- package/dist/temporal/workflows/prune-webhook-deliveries-cron.d.ts +2 -0
- package/dist/temporal/workflows/prune-webhook-deliveries-cron.d.ts.map +1 -0
- package/dist/temporal/workflows/prune-webhook-deliveries-cron.js +14 -0
- package/dist/temporal/workflows/prune-webhook-deliveries-cron.js.map +1 -0
- package/dist/tsconfig.test.tsbuildinfo +1 -0
- package/drizzle/0000_initial.sql +41 -0
- package/drizzle/meta/0001_snapshot.json +341 -0
- package/drizzle/meta/_journal.json +13 -0
- package/drizzle.config.ts +7 -0
- package/package.json +85 -0
- package/src/config.test.ts +32 -0
- package/src/config.ts +28 -0
- package/src/core/agent-tool-selection.test.ts +137 -0
- package/src/core/agent-tool-selection.ts +80 -0
- package/src/core/entities/connection.ts +4 -0
- package/src/core/entities/provider.ts +21 -0
- package/src/core/errors.ts +55 -0
- package/src/core/providers/agent-tools.ts +10 -0
- package/src/core/providers/redact-checkout-spec.test.ts +78 -0
- package/src/core/providers/redact-checkout-spec.ts +20 -0
- package/src/core/providers/registry.test.ts +138 -0
- package/src/core/providers/registry.ts +90 -0
- package/src/core/providers/source-control.ts +17 -0
- package/src/core/source-control-service.test.ts +230 -0
- package/src/core/source-control-service.ts +161 -0
- package/src/db/connections.test.ts +296 -0
- package/src/db/connections.ts +262 -0
- package/src/db/db.ts +22 -0
- package/src/db/migrations.ts +4 -0
- package/src/db/schema/common.ts +3 -0
- package/src/db/schema/connections.ts +49 -0
- package/src/db/schema/outbox.ts +4 -0
- package/src/db/schema/webhook-deliveries.ts +19 -0
- package/src/db/webhook-deliveries.test.ts +267 -0
- package/src/db/webhook-deliveries.ts +207 -0
- package/src/index.ts +212 -0
- package/src/metrics/index.ts +1 -0
- package/src/metrics/instance.ts +35 -0
- package/src/presentation/dto/integrations.ts +39 -0
- package/src/presentation/routes/agent-tools-gateway/agent-tools-gateway.route.test.ts +371 -0
- package/src/presentation/routes/agent-tools-gateway/audit.test.ts +86 -0
- package/src/presentation/routes/agent-tools-gateway/audit.ts +90 -0
- package/src/presentation/routes/agent-tools-gateway/dispatch.ts +139 -0
- package/src/presentation/routes/agent-tools-gateway/index.ts +62 -0
- package/src/presentation/routes/agent-tools-gateway/mcp-server.test.ts +308 -0
- package/src/presentation/routes/agent-tools-gateway/mcp-server.ts +155 -0
- package/src/presentation/routes/agent-tools-gateway/resolve-authorized-tools.test.ts +181 -0
- package/src/presentation/routes/agent-tools-gateway/resolve-authorized-tools.ts +245 -0
- package/src/presentation/routes/errors.ts +63 -0
- package/src/presentation/routes/index.ts +53 -0
- package/src/presentation/routes/list-connections.test.ts +227 -0
- package/src/presentation/routes/list-connections.ts +56 -0
- package/src/presentation/routes/list-providers.test.ts +113 -0
- package/src/presentation/routes/list-providers.ts +28 -0
- package/src/presentation/routes/list-repositories.test.ts +150 -0
- package/src/presentation/routes/list-repositories.ts +47 -0
- package/src/presentation/routes/manage-connections.test.ts +125 -0
- package/src/presentation/routes/manage-connections.ts +77 -0
- package/src/providers/connection-slug.ts +19 -0
- package/src/providers/cron.ts +13 -0
- package/src/providers/gitea.ts +103 -0
- package/src/providers/github.ts +150 -0
- package/src/providers/linear.ts +179 -0
- package/src/providers/modules.test.ts +40 -0
- package/src/providers/modules.ts +32 -0
- package/src/providers/sentry.ts +113 -0
- package/src/providers/types.ts +52 -0
- package/src/providers/webhook.ts +30 -0
- package/src/temporal/activities/index.ts +7 -0
- package/src/temporal/activities/prune-webhook-deliveries.test.ts +39 -0
- package/src/temporal/activities/prune-webhook-deliveries.ts +9 -0
- package/src/temporal/constants.ts +3 -0
- package/src/temporal/workflows/index.ts +1 -0
- package/src/temporal/workflows/prune-webhook-deliveries-cron.ts +15 -0
- package/test/agent-tools-gateway-helpers.ts +210 -0
- package/test/env.ts +23 -0
- package/test/factories/connection.ts +21 -0
- package/test/globalSetup.ts +22 -0
- package/test/index.ts +1 -0
- package/test/route-utils.ts +104 -0
- package/test/setup.ts +19 -0
- package/tsconfig.build.json +9 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.json +3 -0
- package/tsconfig.test.json +8 -0
- package/vitest.config.ts +13 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-deliveries.d.ts","sourceRoot":"","sources":["../../src/db/webhook-deliveries.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,6BAA6B,EAElC,KAAK,iBAAiB,EACvB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAC,EAAE,EAAC,MAAM,SAAS,CAAC;AAI3B,KAAK,aAAa,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;AAC3C,KAAK,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAChF,KAAK,QAAQ,GAAG,aAAa,GAAG,aAAa,CAAC;AAe9C,MAAM,WAAW,qCAAqC;IACpD,EAAE,EAAE,QAAQ,CAAC;IACb,KAAK,EAAE,6BAA6B,CAAC;CACtC;AAED,MAAM,WAAW,qCAAqC;IACpD,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,qCAAqC,GAC5C,OAAO,CAAC,qCAAqC,CAAC,CAyBhD;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,aAAa,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAOD,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,uBAAuB,GAC9B,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAC,CAAC,CAgD/B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAMD,wBAAsB,yBAAyB,CAC7C,MAAM,EAAE,+BAA+B,GACtC,OAAO,CAAC,IAAI,CAAC,CAYf;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,QAAQ,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAexF;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAC,CAAC,CAK5B;AAED,MAAM,MAAM,iCAAiC,GAAG,OAAO,+BAA+B,CAAC;AACvF,MAAM,MAAM,mBAAmB,GAAG,OAAO,iBAAiB,CAAC;AAC3D,MAAM,MAAM,2BAA2B,GAAG,OAAO,yBAAyB,CAAC;AAC3E,MAAM,MAAM,oBAAoB,GAAG,OAAO,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { INTEGRATION_EVENT_RECEIVED, INTEGRATION_SOURCE_COMMIT_PUSHED } from '@shipfox/api-integration-core-dto';
|
|
2
|
+
import { writeOutboxEvent, writeOutboxEvents } from '@shipfox/node-outbox';
|
|
3
|
+
import { lt } from 'drizzle-orm';
|
|
4
|
+
import { db } from './db.js';
|
|
5
|
+
import { integrationsOutbox } from './schema/outbox.js';
|
|
6
|
+
import { integrationsWebhookDeliveries } from './schema/webhook-deliveries.js';
|
|
7
|
+
function connectionDedupScope(connectionId) {
|
|
8
|
+
return `connection:${connectionId}`;
|
|
9
|
+
}
|
|
10
|
+
function providerDedupScope(provider) {
|
|
11
|
+
return `provider:${provider}`;
|
|
12
|
+
}
|
|
13
|
+
function receivedEventDedupScope(event) {
|
|
14
|
+
if (event.provider === 'webhook') return connectionDedupScope(event.connectionId);
|
|
15
|
+
return providerDedupScope(event.provider);
|
|
16
|
+
}
|
|
17
|
+
export async function publishIntegrationEventReceived(params) {
|
|
18
|
+
const inserted = await params.tx.insert(integrationsWebhookDeliveries).values({
|
|
19
|
+
provider: params.event.provider,
|
|
20
|
+
dedupScope: receivedEventDedupScope(params.event),
|
|
21
|
+
deliveryId: params.event.deliveryId
|
|
22
|
+
}).onConflictDoNothing({
|
|
23
|
+
target: [
|
|
24
|
+
integrationsWebhookDeliveries.provider,
|
|
25
|
+
integrationsWebhookDeliveries.dedupScope,
|
|
26
|
+
integrationsWebhookDeliveries.deliveryId
|
|
27
|
+
]
|
|
28
|
+
}).returning({
|
|
29
|
+
deliveryId: integrationsWebhookDeliveries.deliveryId
|
|
30
|
+
});
|
|
31
|
+
if (inserted.length === 0) return {
|
|
32
|
+
published: false
|
|
33
|
+
};
|
|
34
|
+
await writeOutboxEvent(params.tx, integrationsOutbox, {
|
|
35
|
+
type: INTEGRATION_EVENT_RECEIVED,
|
|
36
|
+
payload: params.event
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
published: true
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
// Emits a single source-control push as two outbox rows: the generic
|
|
43
|
+
// `INTEGRATION_EVENT_RECEIVED` envelope with the raw provider payload for triggers, and the
|
|
44
|
+
// typed `INTEGRATION_SOURCE_COMMIT_PUSHED` event for domain modules. One delivery-dedup gates
|
|
45
|
+
// both, so a redelivered webhook writes nothing. Requires a transaction: the dedup insert and
|
|
46
|
+
// both outbox rows must commit or roll back together.
|
|
47
|
+
export async function publishSourcePush(params) {
|
|
48
|
+
const inserted = await params.tx.insert(integrationsWebhookDeliveries).values({
|
|
49
|
+
provider: params.provider,
|
|
50
|
+
dedupScope: providerDedupScope(params.provider),
|
|
51
|
+
deliveryId: params.deliveryId
|
|
52
|
+
}).onConflictDoNothing({
|
|
53
|
+
target: [
|
|
54
|
+
integrationsWebhookDeliveries.provider,
|
|
55
|
+
integrationsWebhookDeliveries.dedupScope,
|
|
56
|
+
integrationsWebhookDeliveries.deliveryId
|
|
57
|
+
]
|
|
58
|
+
}).returning({
|
|
59
|
+
deliveryId: integrationsWebhookDeliveries.deliveryId
|
|
60
|
+
});
|
|
61
|
+
if (inserted.length === 0) return {
|
|
62
|
+
published: false
|
|
63
|
+
};
|
|
64
|
+
await writeOutboxEvents(params.tx, integrationsOutbox, [
|
|
65
|
+
{
|
|
66
|
+
type: INTEGRATION_EVENT_RECEIVED,
|
|
67
|
+
payload: {
|
|
68
|
+
provider: params.provider,
|
|
69
|
+
source: params.source,
|
|
70
|
+
event: 'push',
|
|
71
|
+
workspaceId: params.workspaceId,
|
|
72
|
+
connectionId: params.connectionId,
|
|
73
|
+
connectionName: params.connectionName,
|
|
74
|
+
deliveryId: params.deliveryId,
|
|
75
|
+
receivedAt: params.receivedAt,
|
|
76
|
+
payload: params.rawPayload
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
type: INTEGRATION_SOURCE_COMMIT_PUSHED,
|
|
81
|
+
payload: {
|
|
82
|
+
provider: params.provider,
|
|
83
|
+
workspaceId: params.workspaceId,
|
|
84
|
+
connectionId: params.connectionId,
|
|
85
|
+
deliveryId: params.deliveryId,
|
|
86
|
+
receivedAt: params.receivedAt,
|
|
87
|
+
push: params.push
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
]);
|
|
91
|
+
return {
|
|
92
|
+
published: true
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
// Emits ONLY the typed `INTEGRATION_SOURCE_COMMIT_PUSHED` event, intentionally skipping the
|
|
96
|
+
// `INTEGRATION_EVENT_RECEIVED` envelope so triggers do not run workflows, and skipping the
|
|
97
|
+
// delivery-dedup row so it is never suppressed. Used to force a definitions re-sync without
|
|
98
|
+
// simulating an inbound webhook.
|
|
99
|
+
export async function publishSourceCommitPushed(params) {
|
|
100
|
+
await writeOutboxEvent(db(), integrationsOutbox, {
|
|
101
|
+
type: INTEGRATION_SOURCE_COMMIT_PUSHED,
|
|
102
|
+
payload: {
|
|
103
|
+
provider: params.provider,
|
|
104
|
+
workspaceId: params.workspaceId,
|
|
105
|
+
connectionId: params.connectionId,
|
|
106
|
+
deliveryId: params.deliveryId,
|
|
107
|
+
receivedAt: params.receivedAt,
|
|
108
|
+
push: params.push
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export async function recordDeliveryOnly(params) {
|
|
113
|
+
await params.tx.insert(integrationsWebhookDeliveries).values({
|
|
114
|
+
provider: params.provider,
|
|
115
|
+
dedupScope: providerDedupScope(params.provider),
|
|
116
|
+
deliveryId: params.deliveryId
|
|
117
|
+
}).onConflictDoNothing({
|
|
118
|
+
target: [
|
|
119
|
+
integrationsWebhookDeliveries.provider,
|
|
120
|
+
integrationsWebhookDeliveries.dedupScope,
|
|
121
|
+
integrationsWebhookDeliveries.deliveryId
|
|
122
|
+
]
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export async function pruneWebhookDeliveries(params) {
|
|
126
|
+
const result = await db().delete(integrationsWebhookDeliveries).where(lt(integrationsWebhookDeliveries.receivedAt, params.olderThan));
|
|
127
|
+
return {
|
|
128
|
+
deleted: result.rowCount ?? 0
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=webhook-deliveries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/db/webhook-deliveries.ts"],"sourcesContent":["import {\n INTEGRATION_EVENT_RECEIVED,\n INTEGRATION_SOURCE_COMMIT_PUSHED,\n type IntegrationEventReceivedEvent,\n type IntegrationsEventMap,\n type SourcePushPayload,\n} from '@shipfox/api-integration-core-dto';\nimport {writeOutboxEvent, writeOutboxEvents} from '@shipfox/node-outbox';\nimport {lt} from 'drizzle-orm';\nimport {db} from './db.js';\nimport {integrationsOutbox} from './schema/outbox.js';\nimport {integrationsWebhookDeliveries} from './schema/webhook-deliveries.js';\n\ntype IntegrationDb = ReturnType<typeof db>;\ntype IntegrationTx = Parameters<Parameters<IntegrationDb['transaction']>[0]>[0];\ntype Executor = IntegrationDb | IntegrationTx;\n\nfunction connectionDedupScope(connectionId: string): string {\n return `connection:${connectionId}`;\n}\n\nfunction providerDedupScope(provider: string): string {\n return `provider:${provider}`;\n}\n\nfunction receivedEventDedupScope(event: IntegrationEventReceivedEvent): string {\n if (event.provider === 'webhook') return connectionDedupScope(event.connectionId);\n return providerDedupScope(event.provider);\n}\n\nexport interface PublishIntegrationEventReceivedParams {\n tx: Executor;\n event: IntegrationEventReceivedEvent;\n}\n\nexport interface PublishIntegrationEventReceivedResult {\n published: boolean;\n}\n\nexport async function publishIntegrationEventReceived(\n params: PublishIntegrationEventReceivedParams,\n): Promise<PublishIntegrationEventReceivedResult> {\n const inserted = await params.tx\n .insert(integrationsWebhookDeliveries)\n .values({\n provider: params.event.provider,\n dedupScope: receivedEventDedupScope(params.event),\n deliveryId: params.event.deliveryId,\n })\n .onConflictDoNothing({\n target: [\n integrationsWebhookDeliveries.provider,\n integrationsWebhookDeliveries.dedupScope,\n integrationsWebhookDeliveries.deliveryId,\n ],\n })\n .returning({deliveryId: integrationsWebhookDeliveries.deliveryId});\n\n if (inserted.length === 0) return {published: false};\n\n await writeOutboxEvent(params.tx, integrationsOutbox, {\n type: INTEGRATION_EVENT_RECEIVED,\n payload: params.event,\n });\n\n return {published: true};\n}\n\nexport interface PublishSourcePushParams {\n tx: IntegrationTx;\n provider: string;\n source: string;\n workspaceId: string;\n connectionId: string;\n connectionName: string;\n deliveryId: string;\n receivedAt: string;\n rawPayload: unknown;\n push: SourcePushPayload;\n}\n\n// Emits a single source-control push as two outbox rows: the generic\n// `INTEGRATION_EVENT_RECEIVED` envelope with the raw provider payload for triggers, and the\n// typed `INTEGRATION_SOURCE_COMMIT_PUSHED` event for domain modules. One delivery-dedup gates\n// both, so a redelivered webhook writes nothing. Requires a transaction: the dedup insert and\n// both outbox rows must commit or roll back together.\nexport async function publishSourcePush(\n params: PublishSourcePushParams,\n): Promise<{published: boolean}> {\n const inserted = await params.tx\n .insert(integrationsWebhookDeliveries)\n .values({\n provider: params.provider,\n dedupScope: providerDedupScope(params.provider),\n deliveryId: params.deliveryId,\n })\n .onConflictDoNothing({\n target: [\n integrationsWebhookDeliveries.provider,\n integrationsWebhookDeliveries.dedupScope,\n integrationsWebhookDeliveries.deliveryId,\n ],\n })\n .returning({deliveryId: integrationsWebhookDeliveries.deliveryId});\n\n if (inserted.length === 0) return {published: false};\n\n await writeOutboxEvents<IntegrationsEventMap>(params.tx, integrationsOutbox, [\n {\n type: INTEGRATION_EVENT_RECEIVED,\n payload: {\n provider: params.provider,\n source: params.source,\n event: 'push',\n workspaceId: params.workspaceId,\n connectionId: params.connectionId,\n connectionName: params.connectionName,\n deliveryId: params.deliveryId,\n receivedAt: params.receivedAt,\n payload: params.rawPayload,\n },\n },\n {\n type: INTEGRATION_SOURCE_COMMIT_PUSHED,\n payload: {\n provider: params.provider,\n workspaceId: params.workspaceId,\n connectionId: params.connectionId,\n deliveryId: params.deliveryId,\n receivedAt: params.receivedAt,\n push: params.push,\n },\n },\n ]);\n\n return {published: true};\n}\n\nexport interface PublishSourceCommitPushedParams {\n provider: string;\n workspaceId: string;\n connectionId: string;\n deliveryId: string;\n receivedAt: string;\n push: SourcePushPayload;\n}\n\n// Emits ONLY the typed `INTEGRATION_SOURCE_COMMIT_PUSHED` event, intentionally skipping the\n// `INTEGRATION_EVENT_RECEIVED` envelope so triggers do not run workflows, and skipping the\n// delivery-dedup row so it is never suppressed. Used to force a definitions re-sync without\n// simulating an inbound webhook.\nexport async function publishSourceCommitPushed(\n params: PublishSourceCommitPushedParams,\n): Promise<void> {\n await writeOutboxEvent<IntegrationsEventMap>(db(), integrationsOutbox, {\n type: INTEGRATION_SOURCE_COMMIT_PUSHED,\n payload: {\n provider: params.provider,\n workspaceId: params.workspaceId,\n connectionId: params.connectionId,\n deliveryId: params.deliveryId,\n receivedAt: params.receivedAt,\n push: params.push,\n },\n });\n}\n\nexport interface RecordDeliveryOnlyParams {\n tx: Executor;\n provider: string;\n deliveryId: string;\n}\n\nexport async function recordDeliveryOnly(params: RecordDeliveryOnlyParams): Promise<void> {\n await params.tx\n .insert(integrationsWebhookDeliveries)\n .values({\n provider: params.provider,\n dedupScope: providerDedupScope(params.provider),\n deliveryId: params.deliveryId,\n })\n .onConflictDoNothing({\n target: [\n integrationsWebhookDeliveries.provider,\n integrationsWebhookDeliveries.dedupScope,\n integrationsWebhookDeliveries.deliveryId,\n ],\n });\n}\n\nexport interface PruneWebhookDeliveriesParams {\n olderThan: Date;\n}\n\nexport async function pruneWebhookDeliveries(\n params: PruneWebhookDeliveriesParams,\n): Promise<{deleted: number}> {\n const result = await db()\n .delete(integrationsWebhookDeliveries)\n .where(lt(integrationsWebhookDeliveries.receivedAt, params.olderThan));\n return {deleted: result.rowCount ?? 0};\n}\n\nexport type PublishIntegrationEventReceivedFn = typeof publishIntegrationEventReceived;\nexport type PublishSourcePushFn = typeof publishSourcePush;\nexport type PublishSourceCommitPushedFn = typeof publishSourceCommitPushed;\nexport type RecordDeliveryOnlyFn = typeof recordDeliveryOnly;\n"],"names":["INTEGRATION_EVENT_RECEIVED","INTEGRATION_SOURCE_COMMIT_PUSHED","writeOutboxEvent","writeOutboxEvents","lt","db","integrationsOutbox","integrationsWebhookDeliveries","connectionDedupScope","connectionId","providerDedupScope","provider","receivedEventDedupScope","event","publishIntegrationEventReceived","params","inserted","tx","insert","values","dedupScope","deliveryId","onConflictDoNothing","target","returning","length","published","type","payload","publishSourcePush","source","workspaceId","connectionName","receivedAt","rawPayload","push","publishSourceCommitPushed","recordDeliveryOnly","pruneWebhookDeliveries","result","delete","where","olderThan","deleted","rowCount"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ShipfoxModule } from '@shipfox/node-module';
|
|
2
|
+
import type { IntegrationProvider } from '#core/entities/provider.js';
|
|
3
|
+
import { type IntegrationProviderRegistry } from '#core/providers/registry.js';
|
|
4
|
+
import { type IntegrationSourceControlService } from '#core/source-control-service.js';
|
|
5
|
+
import { type LeasedAgentStepLoader } from '#presentation/routes/index.js';
|
|
6
|
+
import type { IntegrationModuleParts, IntegrationProviderSecrets } from '#providers/types.js';
|
|
7
|
+
export { buildProviderRepositoryId, MAX_REPOSITORY_FILE_BYTES, parseProviderRepositoryId, } from '@shipfox/api-integration-core-dto';
|
|
8
|
+
export type { AgentToolCatalogs, AgentToolSelectionCatalogs, LoadWorkspaceConnectionSnapshot, WorkspaceConnectionSnapshot, WorkspaceConnectionSnapshotEntry, } from '#core/agent-tool-selection.js';
|
|
9
|
+
export { buildAgentToolCatalogs, buildAgentToolSelectionCatalogs, createWorkspaceConnectionSnapshotLoader, } from '#core/agent-tool-selection.js';
|
|
10
|
+
export type { IntegrationConnection, IntegrationConnectionLifecycleStatus, } from '#core/entities/connection.js';
|
|
11
|
+
export type { IntegrationCapability, IntegrationProvider, IntegrationProviderAdapters, IntegrationProviderKind, RegisteredIntegrationProvider, } from '#core/entities/provider.js';
|
|
12
|
+
export type { IntegrationProviderErrorReason } from '#core/errors.js';
|
|
13
|
+
export { ConnectionSlugConflictError, IntegrationCapabilityUnavailableError, IntegrationCheckoutUnsupportedError, IntegrationConnectionInactiveError, IntegrationConnectionNotFoundError, IntegrationConnectionWorkspaceMismatchError, IntegrationProviderError, IntegrationProviderUnavailableError, } from '#core/errors.js';
|
|
14
|
+
export type { AgentToolCallInput, AgentToolCatalogEntry, AgentToolCatalogMethod, AgentToolJsonSchema, AgentToolSensitivity, AgentToolSession, AgentToolsProvider, OpenAgentToolsSessionInput, } from '#core/providers/agent-tools.js';
|
|
15
|
+
export { redactCheckoutSpec } from '#core/providers/redact-checkout-spec.js';
|
|
16
|
+
export type { IntegrationProviderRegistry } from '#core/providers/registry.js';
|
|
17
|
+
export type { CheckoutCredentials, CheckoutPermissions, CheckoutSpec, CreateCheckoutSpecInput, FetchFileInput, FileEntry, FilePage, FileSnapshot, ListFilesInput, ListRepositoriesInput, RepositoryPage, RepositorySnapshot, RepositoryVisibility, ResolveRepositoryInput, SourceControlProvider, } from '#core/providers/source-control.js';
|
|
18
|
+
export type { IntegrationSourceControlService } from '#core/source-control-service.js';
|
|
19
|
+
export { createSourceControlIntegrationService } from '#core/source-control-service.js';
|
|
20
|
+
export type { GetIntegrationConnectionByIdFn } from '#db/connections.js';
|
|
21
|
+
export { getIntegrationConnectionById } from '#db/connections.js';
|
|
22
|
+
export type { PublishIntegrationEventReceivedFn, PublishIntegrationEventReceivedParams, PublishIntegrationEventReceivedResult, PublishSourcePushFn, PublishSourcePushParams, RecordDeliveryOnlyFn, RecordDeliveryOnlyParams, } from '#db/webhook-deliveries.js';
|
|
23
|
+
export { pruneWebhookDeliveries } from '#db/webhook-deliveries.js';
|
|
24
|
+
export { integrationRouteErrorHandler } from '#presentation/routes/errors.js';
|
|
25
|
+
export interface CreateIntegrationsModuleOptions {
|
|
26
|
+
providers?: IntegrationProvider[] | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* Pre-built module parts, bypassing config-gated provider loading. Test-only seam
|
|
29
|
+
* for exercising a provider's database, workers, or startup tasks directly. Takes
|
|
30
|
+
* precedence over `providers`.
|
|
31
|
+
*/
|
|
32
|
+
parts?: IntegrationModuleParts[] | undefined;
|
|
33
|
+
secrets?: IntegrationProviderSecrets | undefined;
|
|
34
|
+
agentTools?: {
|
|
35
|
+
loadLeasedAgentStep: LeasedAgentStepLoader;
|
|
36
|
+
} | undefined;
|
|
37
|
+
}
|
|
38
|
+
export interface IntegrationsContext {
|
|
39
|
+
module: ShipfoxModule;
|
|
40
|
+
registry: IntegrationProviderRegistry;
|
|
41
|
+
capabilities: {
|
|
42
|
+
sourceControl: IntegrationSourceControlService;
|
|
43
|
+
};
|
|
44
|
+
sourceControl: IntegrationSourceControlService;
|
|
45
|
+
/**
|
|
46
|
+
* Runs every enabled provider's one-shot boot-time tasks, after modules are initialized
|
|
47
|
+
* (migrations done). Failures are isolated and logged, never rethrown, so a provider task
|
|
48
|
+
* can never gate API boot. No-op when no enabled provider contributes a task.
|
|
49
|
+
*/
|
|
50
|
+
runStartupTasks: () => Promise<void>;
|
|
51
|
+
}
|
|
52
|
+
export declare function createIntegrationsModule(options?: CreateIntegrationsModuleOptions): Promise<ShipfoxModule>;
|
|
53
|
+
export declare function createIntegrationsContext(options?: CreateIntegrationsModuleOptions): Promise<IntegrationsContext>;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAExD,OAAO,KAAK,EAAC,mBAAmB,EAAC,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAEL,KAAK,+BAA+B,EACrC,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAA0B,KAAK,qBAAqB,EAAC,MAAM,+BAA+B,CAAC;AAElG,OAAO,KAAK,EAAC,sBAAsB,EAAE,0BAA0B,EAAC,MAAM,qBAAqB,CAAC;AAO5F,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,+BAA+B,EAC/B,2BAA2B,EAC3B,gCAAgC,GACjC,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,+BAA+B,EAC/B,uCAAuC,GACxC,MAAM,+BAA+B,CAAC;AACvC,YAAY,EACV,qBAAqB,EACrB,oCAAoC,GACrC,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,qBAAqB,EACrB,mBAAmB,EACnB,2BAA2B,EAC3B,uBAAuB,EACvB,6BAA6B,GAC9B,MAAM,4BAA4B,CAAC;AACpC,YAAY,EAAC,8BAA8B,EAAC,MAAM,iBAAiB,CAAC;AACpE,OAAO,EACL,2BAA2B,EAC3B,qCAAqC,EACrC,mCAAmC,EACnC,kCAAkC,EAClC,kCAAkC,EAClC,2CAA2C,EAC3C,wBAAwB,EACxB,mCAAmC,GACpC,MAAM,iBAAiB,CAAC;AACzB,YAAY,EACV,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,kBAAkB,EAAC,MAAM,yCAAyC,CAAC;AAC3E,YAAY,EAAC,2BAA2B,EAAC,MAAM,6BAA6B,CAAC;AAC7E,YAAY,EACV,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAC,+BAA+B,EAAC,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAC,qCAAqC,EAAC,MAAM,iCAAiC,CAAC;AACtF,YAAY,EAAC,8BAA8B,EAAC,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAC,4BAA4B,EAAC,MAAM,oBAAoB,CAAC;AAChE,YAAY,EACV,iCAAiC,EACjC,qCAAqC,EACrC,qCAAqC,EACrC,mBAAmB,EACnB,uBAAuB,EACvB,oBAAoB,EACpB,wBAAwB,GACzB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAC,sBAAsB,EAAC,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAC,4BAA4B,EAAC,MAAM,gCAAgC,CAAC;AAE5E,MAAM,WAAW,+BAA+B;IAC9C,SAAS,CAAC,EAAE,mBAAmB,EAAE,GAAG,SAAS,CAAC;IAC9C;;;;OAIG;IACH,KAAK,CAAC,EAAE,sBAAsB,EAAE,GAAG,SAAS,CAAC;IAC7C,OAAO,CAAC,EAAE,0BAA0B,GAAG,SAAS,CAAC;IACjD,UAAU,CAAC,EACP;QACE,mBAAmB,EAAE,qBAAqB,CAAC;KAC5C,GACD,SAAS,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,2BAA2B,CAAC;IACtC,YAAY,EAAE;QACZ,aAAa,EAAE,+BAA+B,CAAC;KAChD,CAAC;IACF,aAAa,EAAE,+BAA+B,CAAC;IAC/C;;;;OAIG;IACH,eAAe,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACtC;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,GAAE,+BAAoC,GAC5C,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
|
+
import { fileURLToPath } from 'node:url';
|
|
3
|
+
import { integrationsEventSchemas } from '@shipfox/api-integration-core-dto';
|
|
4
|
+
import { logger } from '@shipfox/node-opentelemetry';
|
|
5
|
+
import { createIntegrationProviderRegistry } from '#core/providers/registry.js';
|
|
6
|
+
import { createSourceControlIntegrationService } from '#core/source-control-service.js';
|
|
7
|
+
import { getIntegrationConnectionById } from '#db/connections.js';
|
|
8
|
+
import { db } from '#db/db.js';
|
|
9
|
+
import { migrationsPath } from '#db/migrations.js';
|
|
10
|
+
import { integrationsOutbox } from '#db/schema/outbox.js';
|
|
11
|
+
import { createIntegrationRoutes } from '#presentation/routes/index.js';
|
|
12
|
+
import { loadEnabledProviderModules } from '#providers/modules.js';
|
|
13
|
+
import { createIntegrationsMaintenanceActivities } from '#temporal/activities/index.js';
|
|
14
|
+
import { INTEGRATIONS_MAINTENANCE_TASK_QUEUE } from '#temporal/constants.js';
|
|
15
|
+
const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
|
|
16
|
+
const maintenanceWorkflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');
|
|
17
|
+
export { buildProviderRepositoryId, MAX_REPOSITORY_FILE_BYTES, parseProviderRepositoryId } from '@shipfox/api-integration-core-dto';
|
|
18
|
+
export { buildAgentToolCatalogs, buildAgentToolSelectionCatalogs, createWorkspaceConnectionSnapshotLoader } from '#core/agent-tool-selection.js';
|
|
19
|
+
export { ConnectionSlugConflictError, IntegrationCapabilityUnavailableError, IntegrationCheckoutUnsupportedError, IntegrationConnectionInactiveError, IntegrationConnectionNotFoundError, IntegrationConnectionWorkspaceMismatchError, IntegrationProviderError, IntegrationProviderUnavailableError } from '#core/errors.js';
|
|
20
|
+
export { redactCheckoutSpec } from '#core/providers/redact-checkout-spec.js';
|
|
21
|
+
export { createSourceControlIntegrationService } from '#core/source-control-service.js';
|
|
22
|
+
export { getIntegrationConnectionById } from '#db/connections.js';
|
|
23
|
+
export { pruneWebhookDeliveries } from '#db/webhook-deliveries.js';
|
|
24
|
+
export { integrationRouteErrorHandler } from '#presentation/routes/errors.js';
|
|
25
|
+
export async function createIntegrationsModule(options = {}) {
|
|
26
|
+
return (await createIntegrationsContext(options)).module;
|
|
27
|
+
}
|
|
28
|
+
export async function createIntegrationsContext(options = {}) {
|
|
29
|
+
const parts = options.parts ?? (options.providers ? options.providers.map((provider)=>({
|
|
30
|
+
provider
|
|
31
|
+
})) : await loadEnabledProviderModules({
|
|
32
|
+
secrets: options.secrets
|
|
33
|
+
}));
|
|
34
|
+
const registry = createIntegrationProviderRegistry(parts.map((part)=>part.provider));
|
|
35
|
+
const sourceControl = createSourceControlIntegrationService({
|
|
36
|
+
registry,
|
|
37
|
+
getIntegrationConnectionById
|
|
38
|
+
});
|
|
39
|
+
async function runStartupTasks() {
|
|
40
|
+
for (const task of parts.flatMap((part)=>part.startupTasks ?? [])){
|
|
41
|
+
// A provider convenience must never gate API boot.
|
|
42
|
+
try {
|
|
43
|
+
await task();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
logger().error({
|
|
46
|
+
err: error
|
|
47
|
+
}, 'Integration startup task failed, continuing boot');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const module = {
|
|
52
|
+
name: 'integrations',
|
|
53
|
+
startupTasks: runStartupTasks,
|
|
54
|
+
database: [
|
|
55
|
+
{
|
|
56
|
+
db,
|
|
57
|
+
migrationsPath
|
|
58
|
+
},
|
|
59
|
+
...parts.flatMap((part)=>part.database ? [
|
|
60
|
+
part.database
|
|
61
|
+
] : [])
|
|
62
|
+
],
|
|
63
|
+
routes: createIntegrationRoutes(registry, sourceControl, {
|
|
64
|
+
agentTools: options.agentTools ? {
|
|
65
|
+
loadLeasedAgentStep: options.agentTools.loadLeasedAgentStep,
|
|
66
|
+
getIntegrationConnectionById
|
|
67
|
+
} : undefined
|
|
68
|
+
}),
|
|
69
|
+
e2eRoutes: parts.flatMap((part)=>part.e2eRoutes ?? []),
|
|
70
|
+
publishers: [
|
|
71
|
+
{
|
|
72
|
+
name: 'integrations',
|
|
73
|
+
table: integrationsOutbox,
|
|
74
|
+
db,
|
|
75
|
+
eventSchemas: integrationsEventSchemas
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
workers: [
|
|
79
|
+
{
|
|
80
|
+
taskQueue: INTEGRATIONS_MAINTENANCE_TASK_QUEUE,
|
|
81
|
+
workflowsPath: maintenanceWorkflowsPath,
|
|
82
|
+
activities: createIntegrationsMaintenanceActivities,
|
|
83
|
+
workflows: [
|
|
84
|
+
{
|
|
85
|
+
name: 'pruneWebhookDeliveriesCron',
|
|
86
|
+
id: 'integrations-prune-webhook-deliveries',
|
|
87
|
+
cronSchedule: '0 3 * * *'
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
...parts.flatMap((part)=>part.workers ?? [])
|
|
92
|
+
]
|
|
93
|
+
};
|
|
94
|
+
return {
|
|
95
|
+
module,
|
|
96
|
+
registry,
|
|
97
|
+
capabilities: {
|
|
98
|
+
sourceControl
|
|
99
|
+
},
|
|
100
|
+
sourceControl,
|
|
101
|
+
runStartupTasks
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {dirname, resolve} from 'node:path';\nimport {fileURLToPath} from 'node:url';\nimport {integrationsEventSchemas} from '@shipfox/api-integration-core-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport type {IntegrationProvider} from '#core/entities/provider.js';\nimport {\n createIntegrationProviderRegistry,\n type IntegrationProviderRegistry,\n} from '#core/providers/registry.js';\nimport {\n createSourceControlIntegrationService,\n type IntegrationSourceControlService,\n} from '#core/source-control-service.js';\nimport {getIntegrationConnectionById} from '#db/connections.js';\nimport {db} from '#db/db.js';\nimport {migrationsPath} from '#db/migrations.js';\nimport {integrationsOutbox} from '#db/schema/outbox.js';\nimport {createIntegrationRoutes, type LeasedAgentStepLoader} from '#presentation/routes/index.js';\nimport {loadEnabledProviderModules} from '#providers/modules.js';\nimport type {IntegrationModuleParts, IntegrationProviderSecrets} from '#providers/types.js';\nimport {createIntegrationsMaintenanceActivities} from '#temporal/activities/index.js';\nimport {INTEGRATIONS_MAINTENANCE_TASK_QUEUE} from '#temporal/constants.js';\n\nconst packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');\nconst maintenanceWorkflowsPath = resolve(packageRoot, 'dist/temporal/workflows/index.js');\n\nexport {\n buildProviderRepositoryId,\n MAX_REPOSITORY_FILE_BYTES,\n parseProviderRepositoryId,\n} from '@shipfox/api-integration-core-dto';\nexport type {\n AgentToolCatalogs,\n AgentToolSelectionCatalogs,\n LoadWorkspaceConnectionSnapshot,\n WorkspaceConnectionSnapshot,\n WorkspaceConnectionSnapshotEntry,\n} from '#core/agent-tool-selection.js';\nexport {\n buildAgentToolCatalogs,\n buildAgentToolSelectionCatalogs,\n createWorkspaceConnectionSnapshotLoader,\n} from '#core/agent-tool-selection.js';\nexport type {\n IntegrationConnection,\n IntegrationConnectionLifecycleStatus,\n} from '#core/entities/connection.js';\nexport type {\n IntegrationCapability,\n IntegrationProvider,\n IntegrationProviderAdapters,\n IntegrationProviderKind,\n RegisteredIntegrationProvider,\n} from '#core/entities/provider.js';\nexport type {IntegrationProviderErrorReason} from '#core/errors.js';\nexport {\n ConnectionSlugConflictError,\n IntegrationCapabilityUnavailableError,\n IntegrationCheckoutUnsupportedError,\n IntegrationConnectionInactiveError,\n IntegrationConnectionNotFoundError,\n IntegrationConnectionWorkspaceMismatchError,\n IntegrationProviderError,\n IntegrationProviderUnavailableError,\n} from '#core/errors.js';\nexport type {\n AgentToolCallInput,\n AgentToolCatalogEntry,\n AgentToolCatalogMethod,\n AgentToolJsonSchema,\n AgentToolSensitivity,\n AgentToolSession,\n AgentToolsProvider,\n OpenAgentToolsSessionInput,\n} from '#core/providers/agent-tools.js';\nexport {redactCheckoutSpec} from '#core/providers/redact-checkout-spec.js';\nexport type {IntegrationProviderRegistry} from '#core/providers/registry.js';\nexport type {\n CheckoutCredentials,\n CheckoutPermissions,\n CheckoutSpec,\n CreateCheckoutSpecInput,\n FetchFileInput,\n FileEntry,\n FilePage,\n FileSnapshot,\n ListFilesInput,\n ListRepositoriesInput,\n RepositoryPage,\n RepositorySnapshot,\n RepositoryVisibility,\n ResolveRepositoryInput,\n SourceControlProvider,\n} from '#core/providers/source-control.js';\nexport type {IntegrationSourceControlService} from '#core/source-control-service.js';\nexport {createSourceControlIntegrationService} from '#core/source-control-service.js';\nexport type {GetIntegrationConnectionByIdFn} from '#db/connections.js';\nexport {getIntegrationConnectionById} from '#db/connections.js';\nexport type {\n PublishIntegrationEventReceivedFn,\n PublishIntegrationEventReceivedParams,\n PublishIntegrationEventReceivedResult,\n PublishSourcePushFn,\n PublishSourcePushParams,\n RecordDeliveryOnlyFn,\n RecordDeliveryOnlyParams,\n} from '#db/webhook-deliveries.js';\nexport {pruneWebhookDeliveries} from '#db/webhook-deliveries.js';\nexport {integrationRouteErrorHandler} from '#presentation/routes/errors.js';\n\nexport interface CreateIntegrationsModuleOptions {\n providers?: IntegrationProvider[] | undefined;\n /**\n * Pre-built module parts, bypassing config-gated provider loading. Test-only seam\n * for exercising a provider's database, workers, or startup tasks directly. Takes\n * precedence over `providers`.\n */\n parts?: IntegrationModuleParts[] | undefined;\n secrets?: IntegrationProviderSecrets | undefined;\n agentTools?:\n | {\n loadLeasedAgentStep: LeasedAgentStepLoader;\n }\n | undefined;\n}\n\nexport interface IntegrationsContext {\n module: ShipfoxModule;\n registry: IntegrationProviderRegistry;\n capabilities: {\n sourceControl: IntegrationSourceControlService;\n };\n sourceControl: IntegrationSourceControlService;\n /**\n * Runs every enabled provider's one-shot boot-time tasks, after modules are initialized\n * (migrations done). Failures are isolated and logged, never rethrown, so a provider task\n * can never gate API boot. No-op when no enabled provider contributes a task.\n */\n runStartupTasks: () => Promise<void>;\n}\n\nexport async function createIntegrationsModule(\n options: CreateIntegrationsModuleOptions = {},\n): Promise<ShipfoxModule> {\n return (await createIntegrationsContext(options)).module;\n}\n\nexport async function createIntegrationsContext(\n options: CreateIntegrationsModuleOptions = {},\n): Promise<IntegrationsContext> {\n const parts: IntegrationModuleParts[] =\n options.parts ??\n (options.providers\n ? options.providers.map((provider) => ({provider}))\n : await loadEnabledProviderModules({secrets: options.secrets}));\n\n const registry = createIntegrationProviderRegistry(parts.map((part) => part.provider));\n const sourceControl = createSourceControlIntegrationService({\n registry,\n getIntegrationConnectionById,\n });\n\n async function runStartupTasks(): Promise<void> {\n for (const task of parts.flatMap((part) => part.startupTasks ?? [])) {\n // A provider convenience must never gate API boot.\n try {\n await task();\n } catch (error) {\n logger().error({err: error}, 'Integration startup task failed, continuing boot');\n }\n }\n }\n\n const module: ShipfoxModule = {\n name: 'integrations',\n startupTasks: runStartupTasks,\n database: [\n {db, migrationsPath},\n ...parts.flatMap((part) => (part.database ? [part.database] : [])),\n ],\n routes: createIntegrationRoutes(registry, sourceControl, {\n agentTools: options.agentTools\n ? {\n loadLeasedAgentStep: options.agentTools.loadLeasedAgentStep,\n getIntegrationConnectionById,\n }\n : undefined,\n }),\n e2eRoutes: parts.flatMap((part) => part.e2eRoutes ?? []),\n publishers: [\n {name: 'integrations', table: integrationsOutbox, db, eventSchemas: integrationsEventSchemas},\n ],\n workers: [\n {\n taskQueue: INTEGRATIONS_MAINTENANCE_TASK_QUEUE,\n workflowsPath: maintenanceWorkflowsPath,\n activities: createIntegrationsMaintenanceActivities,\n workflows: [\n {\n name: 'pruneWebhookDeliveriesCron',\n id: 'integrations-prune-webhook-deliveries',\n cronSchedule: '0 3 * * *',\n },\n ],\n },\n ...parts.flatMap((part) => part.workers ?? []),\n ],\n };\n\n return {module, registry, capabilities: {sourceControl}, sourceControl, runStartupTasks};\n}\n"],"names":["dirname","resolve","fileURLToPath","integrationsEventSchemas","logger","createIntegrationProviderRegistry","createSourceControlIntegrationService","getIntegrationConnectionById","db","migrationsPath","integrationsOutbox","createIntegrationRoutes","loadEnabledProviderModules","createIntegrationsMaintenanceActivities","INTEGRATIONS_MAINTENANCE_TASK_QUEUE","packageRoot","url","maintenanceWorkflowsPath","buildProviderRepositoryId","MAX_REPOSITORY_FILE_BYTES","parseProviderRepositoryId","buildAgentToolCatalogs","buildAgentToolSelectionCatalogs","createWorkspaceConnectionSnapshotLoader","ConnectionSlugConflictError","IntegrationCapabilityUnavailableError","IntegrationCheckoutUnsupportedError","IntegrationConnectionInactiveError","IntegrationConnectionNotFoundError","IntegrationConnectionWorkspaceMismatchError","IntegrationProviderError","IntegrationProviderUnavailableError","redactCheckoutSpec","pruneWebhookDeliveries","integrationRouteErrorHandler","createIntegrationsModule","options","createIntegrationsContext","module","parts","providers","map","provider","secrets","registry","part","sourceControl","runStartupTasks","task","flatMap","startupTasks","error","err","name","database","routes","agentTools","loadLeasedAgentStep","undefined","e2eRoutes","publishers","table","eventSchemas","workers","taskQueue","workflowsPath","activities","workflows","id","cronSchedule","capabilities"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/metrics/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/index.ts"],"sourcesContent":["export * from './instance.js';\n"],"names":[],"mappings":"AAAA,cAAc,gBAAgB"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type IntegrationAgentToolCallOutcome = 'success' | 'tool-error' | 'invalid-request' | 'exception';
|
|
2
|
+
export declare function recordIntegrationAgentToolCall(params: {
|
|
3
|
+
provider: string;
|
|
4
|
+
tool: string;
|
|
5
|
+
method: string;
|
|
6
|
+
outcome: IntegrationAgentToolCallOutcome;
|
|
7
|
+
}): void;
|
|
8
|
+
//# sourceMappingURL=instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance.d.ts","sourceRoot":"","sources":["../../src/metrics/instance.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,+BAA+B,GACvC,SAAS,GACT,YAAY,GACZ,iBAAiB,GACjB,WAAW,CAAC;AAmBhB,wBAAgB,8BAA8B,CAAC,MAAM,EAAE;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,+BAA+B,CAAC;CAC1C,GAAG,IAAI,CAEP"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { instanceMetrics } from '@shipfox/node-opentelemetry';
|
|
2
|
+
const meter = instanceMetrics.getMeter('integrations');
|
|
3
|
+
const agentToolCallCount = meter.createCounter('integrations_agent_tool_call', {
|
|
4
|
+
description: 'Integration agent tool calls by provider, tool, method, and outcome'
|
|
5
|
+
});
|
|
6
|
+
function recordMetric(record) {
|
|
7
|
+
try {
|
|
8
|
+
record();
|
|
9
|
+
} catch {
|
|
10
|
+
// Metrics must not affect integration tool call outcomes.
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export function recordIntegrationAgentToolCall(params) {
|
|
14
|
+
recordMetric(()=>agentToolCallCount.add(1, params));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/metrics/instance.ts"],"sourcesContent":["import {instanceMetrics} from '@shipfox/node-opentelemetry';\n\nconst meter = instanceMetrics.getMeter('integrations');\n\nexport type IntegrationAgentToolCallOutcome =\n | 'success'\n | 'tool-error'\n | 'invalid-request'\n | 'exception';\n\nconst agentToolCallCount = meter.createCounter<{\n provider: string;\n tool: string;\n method: string;\n outcome: IntegrationAgentToolCallOutcome;\n}>('integrations_agent_tool_call', {\n description: 'Integration agent tool calls by provider, tool, method, and outcome',\n});\n\nfunction recordMetric(record: () => void): void {\n try {\n record();\n } catch {\n // Metrics must not affect integration tool call outcomes.\n }\n}\n\nexport function recordIntegrationAgentToolCall(params: {\n provider: string;\n tool: string;\n method: string;\n outcome: IntegrationAgentToolCallOutcome;\n}): void {\n recordMetric(() => agentToolCallCount.add(1, params));\n}\n"],"names":["instanceMetrics","meter","getMeter","agentToolCallCount","createCounter","description","recordMetric","record","recordIntegrationAgentToolCall","params","add"],"mappings":"AAAA,SAAQA,eAAe,QAAO,8BAA8B;AAE5D,MAAMC,QAAQD,gBAAgBE,QAAQ,CAAC;AAQvC,MAAMC,qBAAqBF,MAAMG,aAAa,CAK3C,gCAAgC;IACjCC,aAAa;AACf;AAEA,SAASC,aAAaC,MAAkB;IACtC,IAAI;QACFA;IACF,EAAE,OAAM;IACN,0DAA0D;IAC5D;AACF;AAEA,OAAO,SAASC,+BAA+BC,MAK9C;IACCH,aAAa,IAAMH,mBAAmBO,GAAG,CAAC,GAAGD;AAC/C"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { IntegrationConnection } from '#core/entities/connection.js';
|
|
2
|
+
import type { IntegrationCapability, RegisteredIntegrationProvider } from '#core/entities/provider.js';
|
|
3
|
+
import type { RepositorySnapshot } from '#core/providers/source-control.js';
|
|
4
|
+
export declare function toIntegrationProviderDto(provider: RegisteredIntegrationProvider): {
|
|
5
|
+
provider: string;
|
|
6
|
+
display_name: string;
|
|
7
|
+
capabilities: IntegrationCapability[];
|
|
8
|
+
};
|
|
9
|
+
export declare function toIntegrationConnectionDto(connection: IntegrationConnection, options: {
|
|
10
|
+
capabilities: IntegrationCapability[];
|
|
11
|
+
externalUrl?: string | undefined;
|
|
12
|
+
}): {
|
|
13
|
+
created_at: string;
|
|
14
|
+
updated_at: string;
|
|
15
|
+
external_url?: string;
|
|
16
|
+
id: string;
|
|
17
|
+
workspace_id: string;
|
|
18
|
+
provider: string;
|
|
19
|
+
external_account_id: string;
|
|
20
|
+
slug: string;
|
|
21
|
+
display_name: string;
|
|
22
|
+
lifecycle_status: import("@shipfox/api-integration-core-dto").IntegrationConnectionLifecycleStatus;
|
|
23
|
+
capabilities: IntegrationCapability[];
|
|
24
|
+
};
|
|
25
|
+
export declare function toRepositoryDto(connectionId: string, repository: RepositorySnapshot): {
|
|
26
|
+
connection_id: string;
|
|
27
|
+
external_repository_id: string;
|
|
28
|
+
owner: string;
|
|
29
|
+
name: string;
|
|
30
|
+
full_name: string;
|
|
31
|
+
default_branch: string;
|
|
32
|
+
visibility: import("@shipfox/api-integration-core-dto").RepositoryVisibility;
|
|
33
|
+
clone_url: string;
|
|
34
|
+
html_url: string;
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=integrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"integrations.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/integrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAC,qBAAqB,EAAC,MAAM,8BAA8B,CAAC;AACxE,OAAO,KAAK,EACV,qBAAqB,EACrB,6BAA6B,EAC9B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,mCAAmC,CAAC;AAE1E,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,6BAA6B;;;;EAM/E;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,qBAAqB,EACjC,OAAO,EAAE;IACP,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;;;;;;;;;;;;EAGF;AAED,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,kBAAkB;;;;;;;;;;EAYnF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { toIntegrationConnectionDto as toCoreIntegrationConnectionDto } from '@shipfox/api-integration-core-dto';
|
|
2
|
+
export function toIntegrationProviderDto(provider) {
|
|
3
|
+
return {
|
|
4
|
+
provider: provider.provider,
|
|
5
|
+
display_name: provider.displayName,
|
|
6
|
+
capabilities: provider.capabilities
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function toIntegrationConnectionDto(connection, options) {
|
|
10
|
+
return toCoreIntegrationConnectionDto(connection, options);
|
|
11
|
+
}
|
|
12
|
+
export function toRepositoryDto(connectionId, repository) {
|
|
13
|
+
return {
|
|
14
|
+
connection_id: connectionId,
|
|
15
|
+
external_repository_id: repository.externalRepositoryId,
|
|
16
|
+
owner: repository.owner,
|
|
17
|
+
name: repository.name,
|
|
18
|
+
full_name: repository.fullName,
|
|
19
|
+
default_branch: repository.defaultBranch,
|
|
20
|
+
visibility: repository.visibility,
|
|
21
|
+
clone_url: repository.cloneUrl,
|
|
22
|
+
html_url: repository.htmlUrl
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/presentation/dto/integrations.ts"],"sourcesContent":["import {toIntegrationConnectionDto as toCoreIntegrationConnectionDto} from '@shipfox/api-integration-core-dto';\nimport type {IntegrationConnection} from '#core/entities/connection.js';\nimport type {\n IntegrationCapability,\n RegisteredIntegrationProvider,\n} from '#core/entities/provider.js';\nimport type {RepositorySnapshot} from '#core/providers/source-control.js';\n\nexport function toIntegrationProviderDto(provider: RegisteredIntegrationProvider) {\n return {\n provider: provider.provider,\n display_name: provider.displayName,\n capabilities: provider.capabilities,\n };\n}\n\nexport function toIntegrationConnectionDto(\n connection: IntegrationConnection,\n options: {\n capabilities: IntegrationCapability[];\n externalUrl?: string | undefined;\n },\n) {\n return toCoreIntegrationConnectionDto(connection, options);\n}\n\nexport function toRepositoryDto(connectionId: string, repository: RepositorySnapshot) {\n return {\n connection_id: connectionId,\n external_repository_id: repository.externalRepositoryId,\n owner: repository.owner,\n name: repository.name,\n full_name: repository.fullName,\n default_branch: repository.defaultBranch,\n visibility: repository.visibility,\n clone_url: repository.cloneUrl,\n html_url: repository.htmlUrl,\n };\n}\n"],"names":["toIntegrationConnectionDto","toCoreIntegrationConnectionDto","toIntegrationProviderDto","provider","display_name","displayName","capabilities","connection","options","toRepositoryDto","connectionId","repository","connection_id","external_repository_id","externalRepositoryId","owner","name","full_name","fullName","default_branch","defaultBranch","visibility","clone_url","cloneUrl","html_url","htmlUrl"],"mappings":"AAAA,SAAQA,8BAA8BC,8BAA8B,QAAO,oCAAoC;AAQ/G,OAAO,SAASC,yBAAyBC,QAAuC;IAC9E,OAAO;QACLA,UAAUA,SAASA,QAAQ;QAC3BC,cAAcD,SAASE,WAAW;QAClCC,cAAcH,SAASG,YAAY;IACrC;AACF;AAEA,OAAO,SAASN,2BACdO,UAAiC,EACjCC,OAGC;IAED,OAAOP,+BAA+BM,YAAYC;AACpD;AAEA,OAAO,SAASC,gBAAgBC,YAAoB,EAAEC,UAA8B;IAClF,OAAO;QACLC,eAAeF;QACfG,wBAAwBF,WAAWG,oBAAoB;QACvDC,OAAOJ,WAAWI,KAAK;QACvBC,MAAML,WAAWK,IAAI;QACrBC,WAAWN,WAAWO,QAAQ;QAC9BC,gBAAgBR,WAAWS,aAAa;QACxCC,YAAYV,WAAWU,UAAU;QACjCC,WAAWX,WAAWY,QAAQ;QAC9BC,UAAUb,WAAWc,OAAO;IAC9B;AACF"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { LeasedJobContext } from '@shipfox/api-auth-context';
|
|
2
|
+
import { type IntegrationAgentToolCallOutcome, recordIntegrationAgentToolCall } from '#metrics/index.js';
|
|
3
|
+
import type { AuthorizedIntegrationTool } from './resolve-authorized-tools.js';
|
|
4
|
+
export declare const UNKNOWN_TOOL_LABEL = "unknown";
|
|
5
|
+
export declare const NO_METHOD_LABEL = "none";
|
|
6
|
+
export declare const INVALID_METHOD_LABEL = "invalid";
|
|
7
|
+
export interface IntegrationToolArgumentSummary {
|
|
8
|
+
keys: string[];
|
|
9
|
+
serializedSizeBytes: number;
|
|
10
|
+
}
|
|
11
|
+
export interface IntegrationToolCallAuditRecord {
|
|
12
|
+
authorizedTool?: AuthorizedIntegrationTool | undefined;
|
|
13
|
+
arguments: unknown;
|
|
14
|
+
method: string;
|
|
15
|
+
outcome: IntegrationAgentToolCallOutcome;
|
|
16
|
+
}
|
|
17
|
+
export type IntegrationToolCallRecorder = (record: IntegrationToolCallAuditRecord) => void;
|
|
18
|
+
export interface CreateIntegrationToolCallRecorderOptions {
|
|
19
|
+
recordMetric?: typeof recordIntegrationAgentToolCall | undefined;
|
|
20
|
+
logInfo?: ((context: Record<string, unknown>, message: 'integration tool call audited') => void) | undefined;
|
|
21
|
+
}
|
|
22
|
+
export declare function createIntegrationToolCallRecorder(lease: LeasedJobContext, options?: CreateIntegrationToolCallRecorderOptions): IntegrationToolCallRecorder;
|
|
23
|
+
export declare function summarizeIntegrationToolArguments(value: unknown): IntegrationToolArgumentSummary;
|
|
24
|
+
//# sourceMappingURL=audit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/agent-tools-gateway/audit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,2BAA2B,CAAC;AAEhE,OAAO,EACL,KAAK,+BAA+B,EACpC,8BAA8B,EAC/B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAC,yBAAyB,EAAC,MAAM,+BAA+B,CAAC;AAE7E,eAAO,MAAM,kBAAkB,YAAY,CAAC;AAC5C,eAAO,MAAM,eAAe,SAAS,CAAC;AACtC,eAAO,MAAM,oBAAoB,YAAY,CAAC;AAE9C,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,8BAA8B;IAC7C,cAAc,CAAC,EAAE,yBAAyB,GAAG,SAAS,CAAC;IACvD,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,+BAA+B,CAAC;CAC1C;AAED,MAAM,MAAM,2BAA2B,GAAG,CAAC,MAAM,EAAE,8BAA8B,KAAK,IAAI,CAAC;AAE3F,MAAM,WAAW,wCAAwC;IACvD,YAAY,CAAC,EAAE,OAAO,8BAA8B,GAAG,SAAS,CAAC;IACjE,OAAO,CAAC,EACJ,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,+BAA+B,KAAK,IAAI,CAAC,GACtF,SAAS,CAAC;CACf;AAED,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,gBAAgB,EACvB,OAAO,GAAE,wCAA6C,GACrD,2BAA2B,CAkC7B;AAED,wBAAgB,iCAAiC,CAAC,KAAK,EAAE,OAAO,GAAG,8BAA8B,CAKhG"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { logger } from '@shipfox/node-opentelemetry';
|
|
2
|
+
import { recordIntegrationAgentToolCall } from '#metrics/index.js';
|
|
3
|
+
export const UNKNOWN_TOOL_LABEL = 'unknown';
|
|
4
|
+
export const NO_METHOD_LABEL = 'none';
|
|
5
|
+
export const INVALID_METHOD_LABEL = 'invalid';
|
|
6
|
+
export function createIntegrationToolCallRecorder(lease, options = {}) {
|
|
7
|
+
const recordMetric = options.recordMetric ?? recordIntegrationAgentToolCall;
|
|
8
|
+
const logInfo = options.logInfo ?? ((context, message)=>logger().info(context, message));
|
|
9
|
+
return (record)=>{
|
|
10
|
+
const provider = record.authorizedTool?.integration.provider ?? UNKNOWN_TOOL_LABEL;
|
|
11
|
+
const toolId = record.authorizedTool?.tool.id ?? UNKNOWN_TOOL_LABEL;
|
|
12
|
+
recordMetric({
|
|
13
|
+
provider,
|
|
14
|
+
tool: toolId,
|
|
15
|
+
method: record.method,
|
|
16
|
+
outcome: record.outcome
|
|
17
|
+
});
|
|
18
|
+
logInfo({
|
|
19
|
+
jobId: lease.jobId,
|
|
20
|
+
jobExecutionId: lease.jobExecutionId,
|
|
21
|
+
workflowRunId: lease.workflowRunId,
|
|
22
|
+
workflowRunAttemptId: lease.workflowRunAttemptId,
|
|
23
|
+
workspaceId: lease.workspaceId,
|
|
24
|
+
currentStepId: lease.currentStepId,
|
|
25
|
+
currentStepAttempt: lease.currentStepAttempt,
|
|
26
|
+
connectionId: record.authorizedTool?.connection.id,
|
|
27
|
+
provider,
|
|
28
|
+
toolId,
|
|
29
|
+
method: record.method,
|
|
30
|
+
outcome: record.outcome,
|
|
31
|
+
argumentSummary: summarizeIntegrationToolArguments(record.arguments)
|
|
32
|
+
}, 'integration tool call audited');
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
export function summarizeIntegrationToolArguments(value) {
|
|
36
|
+
return {
|
|
37
|
+
keys: isRecord(value) ? Object.keys(value).sort() : [],
|
|
38
|
+
serializedSizeBytes: serializedSize(value)
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function serializedSize(value) {
|
|
42
|
+
try {
|
|
43
|
+
return Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');
|
|
44
|
+
} catch {
|
|
45
|
+
return 0;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function isRecord(value) {
|
|
49
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/presentation/routes/agent-tools-gateway/audit.ts"],"sourcesContent":["import type {LeasedJobContext} from '@shipfox/api-auth-context';\nimport {logger} from '@shipfox/node-opentelemetry';\nimport {\n type IntegrationAgentToolCallOutcome,\n recordIntegrationAgentToolCall,\n} from '#metrics/index.js';\nimport type {AuthorizedIntegrationTool} from './resolve-authorized-tools.js';\n\nexport const UNKNOWN_TOOL_LABEL = 'unknown';\nexport const NO_METHOD_LABEL = 'none';\nexport const INVALID_METHOD_LABEL = 'invalid';\n\nexport interface IntegrationToolArgumentSummary {\n keys: string[];\n serializedSizeBytes: number;\n}\n\nexport interface IntegrationToolCallAuditRecord {\n authorizedTool?: AuthorizedIntegrationTool | undefined;\n arguments: unknown;\n method: string;\n outcome: IntegrationAgentToolCallOutcome;\n}\n\nexport type IntegrationToolCallRecorder = (record: IntegrationToolCallAuditRecord) => void;\n\nexport interface CreateIntegrationToolCallRecorderOptions {\n recordMetric?: typeof recordIntegrationAgentToolCall | undefined;\n logInfo?:\n | ((context: Record<string, unknown>, message: 'integration tool call audited') => void)\n | undefined;\n}\n\nexport function createIntegrationToolCallRecorder(\n lease: LeasedJobContext,\n options: CreateIntegrationToolCallRecorderOptions = {},\n): IntegrationToolCallRecorder {\n const recordMetric = options.recordMetric ?? recordIntegrationAgentToolCall;\n const logInfo = options.logInfo ?? ((context, message) => logger().info(context, message));\n\n return (record) => {\n const provider = record.authorizedTool?.integration.provider ?? UNKNOWN_TOOL_LABEL;\n const toolId = record.authorizedTool?.tool.id ?? UNKNOWN_TOOL_LABEL;\n\n recordMetric({\n provider,\n tool: toolId,\n method: record.method,\n outcome: record.outcome,\n });\n\n logInfo(\n {\n jobId: lease.jobId,\n jobExecutionId: lease.jobExecutionId,\n workflowRunId: lease.workflowRunId,\n workflowRunAttemptId: lease.workflowRunAttemptId,\n workspaceId: lease.workspaceId,\n currentStepId: lease.currentStepId,\n currentStepAttempt: lease.currentStepAttempt,\n connectionId: record.authorizedTool?.connection.id,\n provider,\n toolId,\n method: record.method,\n outcome: record.outcome,\n argumentSummary: summarizeIntegrationToolArguments(record.arguments),\n },\n 'integration tool call audited',\n );\n };\n}\n\nexport function summarizeIntegrationToolArguments(value: unknown): IntegrationToolArgumentSummary {\n return {\n keys: isRecord(value) ? Object.keys(value).sort() : [],\n serializedSizeBytes: serializedSize(value),\n };\n}\n\nfunction serializedSize(value: unknown): number {\n try {\n return Buffer.byteLength(JSON.stringify(value) ?? '', 'utf8');\n } catch {\n return 0;\n }\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"names":["logger","recordIntegrationAgentToolCall","UNKNOWN_TOOL_LABEL","NO_METHOD_LABEL","INVALID_METHOD_LABEL","createIntegrationToolCallRecorder","lease","options","recordMetric","logInfo","context","message","info","record","provider","authorizedTool","integration","toolId","tool","id","method","outcome","jobId","jobExecutionId","workflowRunId","workflowRunAttemptId","workspaceId","currentStepId","currentStepAttempt","connectionId","connection","argumentSummary","summarizeIntegrationToolArguments","arguments","value","keys","isRecord","Object","sort","serializedSizeBytes","serializedSize","Buffer","byteLength","JSON","stringify","Array","isArray"],"mappings":"AACA,SAAQA,MAAM,QAAO,8BAA8B;AACnD,SAEEC,8BAA8B,QACzB,oBAAoB;AAG3B,OAAO,MAAMC,qBAAqB,UAAU;AAC5C,OAAO,MAAMC,kBAAkB,OAAO;AACtC,OAAO,MAAMC,uBAAuB,UAAU;AAuB9C,OAAO,SAASC,kCACdC,KAAuB,EACvBC,UAAoD,CAAC,CAAC;IAEtD,MAAMC,eAAeD,QAAQC,YAAY,IAAIP;IAC7C,MAAMQ,UAAUF,QAAQE,OAAO,IAAK,CAAA,CAACC,SAASC,UAAYX,SAASY,IAAI,CAACF,SAASC,QAAO;IAExF,OAAO,CAACE;QACN,MAAMC,WAAWD,OAAOE,cAAc,EAAEC,YAAYF,YAAYZ;QAChE,MAAMe,SAASJ,OAAOE,cAAc,EAAEG,KAAKC,MAAMjB;QAEjDM,aAAa;YACXM;YACAI,MAAMD;YACNG,QAAQP,OAAOO,MAAM;YACrBC,SAASR,OAAOQ,OAAO;QACzB;QAEAZ,QACE;YACEa,OAAOhB,MAAMgB,KAAK;YAClBC,gBAAgBjB,MAAMiB,cAAc;YACpCC,eAAelB,MAAMkB,aAAa;YAClCC,sBAAsBnB,MAAMmB,oBAAoB;YAChDC,aAAapB,MAAMoB,WAAW;YAC9BC,eAAerB,MAAMqB,aAAa;YAClCC,oBAAoBtB,MAAMsB,kBAAkB;YAC5CC,cAAchB,OAAOE,cAAc,EAAEe,WAAWX;YAChDL;YACAG;YACAG,QAAQP,OAAOO,MAAM;YACrBC,SAASR,OAAOQ,OAAO;YACvBU,iBAAiBC,kCAAkCnB,OAAOoB,SAAS;QACrE,GACA;IAEJ;AACF;AAEA,OAAO,SAASD,kCAAkCE,KAAc;IAC9D,OAAO;QACLC,MAAMC,SAASF,SAASG,OAAOF,IAAI,CAACD,OAAOI,IAAI,KAAK,EAAE;QACtDC,qBAAqBC,eAAeN;IACtC;AACF;AAEA,SAASM,eAAeN,KAAc;IACpC,IAAI;QACF,OAAOO,OAAOC,UAAU,CAACC,KAAKC,SAAS,CAACV,UAAU,IAAI;IACxD,EAAE,OAAM;QACN,OAAO;IACT;AACF;AAEA,SAASE,SAASF,KAAc;IAC9B,OAAO,OAAOA,UAAU,YAAYA,UAAU,QAAQ,CAACW,MAAMC,OAAO,CAACZ;AACvE"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { IntegrationProviderRegistry } from '#core/providers/registry.js';
|
|
2
|
+
import type { IntegrationToolDispatcher } from './mcp-server.js';
|
|
3
|
+
export interface CreateIntegrationToolDispatcherParams {
|
|
4
|
+
registry: IntegrationProviderRegistry;
|
|
5
|
+
}
|
|
6
|
+
export declare function createIntegrationToolDispatcher(params: CreateIntegrationToolDispatcherParams): IntegrationToolDispatcher;
|
|
7
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../../../src/presentation/routes/agent-tools-gateway/dispatch.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAC,2BAA2B,EAAC,MAAM,6BAA6B,CAAC;AAC7E,OAAO,KAAK,EAAC,yBAAyB,EAA+B,MAAM,iBAAiB,CAAC;AAE7F,MAAM,WAAW,qCAAqC;IACpD,QAAQ,EAAE,2BAA2B,CAAC;CACvC;AAKD,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,qCAAqC,GAC5C,yBAAyB,CAE3B"}
|