@arbium/enterprise-agent-connect 0.1.1 → 0.1.2-dev.9022f22
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/README.md +164 -12
- package/dist/connectors/dell-techdirect/index.d.ts +8 -0
- package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
- package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
- package/dist/connectors/dynamics-365/connector.json +228 -0
- package/dist/connectors/dynamics-365/index.d.ts +8 -0
- package/dist/connectors/dynamics-365/index.js +10 -0
- package/dist/connectors/dynamics-365/index.js.map +1 -0
- package/dist/connectors/dynamics-365/tools.d.ts +35 -0
- package/dist/connectors/dynamics-365/tools.js +806 -0
- package/dist/connectors/dynamics-365/tools.js.map +1 -0
- package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
- package/dist/connectors/dynamics-365/vendor.js +110 -0
- package/dist/connectors/dynamics-365/vendor.js.map +1 -0
- package/dist/connectors/entra/index.d.ts +2 -0
- package/dist/connectors/entra/tools.d.ts +14 -0
- package/dist/connectors/fedex/index.d.ts +8 -0
- package/dist/connectors/fedex/tools.d.ts +3 -0
- package/dist/connectors/fedex/vendor.d.ts +7 -0
- package/dist/connectors/gong/connector.json +127 -0
- package/dist/connectors/gong/index.d.ts +8 -0
- package/dist/connectors/gong/index.js +7 -0
- package/dist/connectors/gong/index.js.map +1 -0
- package/dist/connectors/gong/tools.d.ts +8 -0
- package/dist/connectors/gong/tools.js +424 -0
- package/dist/connectors/gong/tools.js.map +1 -0
- package/dist/connectors/gong/vendor.d.ts +4 -0
- package/dist/connectors/gong/vendor.js +89 -0
- package/dist/connectors/gong/vendor.js.map +1 -0
- package/dist/connectors/http/index.d.ts +34 -0
- package/dist/connectors/http/index.js +154 -64
- package/dist/connectors/http/index.js.map +1 -1
- package/dist/connectors/intune/index.d.ts +2 -0
- package/dist/connectors/intune/tools.d.ts +12 -0
- package/dist/connectors/jamf/connector.json +182 -0
- package/dist/connectors/jamf/index.d.ts +8 -0
- package/dist/connectors/jamf/index.js +7 -0
- package/dist/connectors/jamf/index.js.map +1 -0
- package/dist/connectors/jamf/tools.d.ts +7 -0
- package/dist/connectors/jamf/tools.js +659 -0
- package/dist/connectors/jamf/tools.js.map +1 -0
- package/dist/connectors/jamf/vendor.d.ts +5 -0
- package/dist/connectors/jamf/vendor.js +70 -0
- package/dist/connectors/jamf/vendor.js.map +1 -0
- package/dist/connectors/jira/connector.json +144 -1
- package/dist/connectors/jira/index.d.ts +8 -0
- package/dist/connectors/jira/jql.d.ts +4 -0
- package/dist/connectors/jira/tools.d.ts +3 -0
- package/dist/connectors/jira/vendor.d.ts +3 -0
- package/dist/connectors/jira/vendor.js +8 -2
- package/dist/connectors/jira/vendor.js.map +1 -1
- package/dist/connectors/microsoft/client.d.ts +66 -0
- package/dist/connectors/microsoft/client.js +26 -8
- package/dist/connectors/microsoft/client.js.map +1 -1
- package/dist/connectors/netsuite/connector.json +317 -0
- package/dist/connectors/netsuite/index.d.ts +8 -0
- package/dist/connectors/netsuite/index.js +7 -0
- package/dist/connectors/netsuite/index.js.map +1 -0
- package/dist/connectors/netsuite/tools.d.ts +24 -0
- package/dist/connectors/netsuite/tools.js +447 -0
- package/dist/connectors/netsuite/tools.js.map +1 -0
- package/dist/connectors/netsuite/vendor.d.ts +26 -0
- package/dist/connectors/netsuite/vendor.js +247 -0
- package/dist/connectors/netsuite/vendor.js.map +1 -0
- package/dist/connectors/odata/index.d.ts +33 -0
- package/dist/connectors/odata/index.js +460 -0
- package/dist/connectors/odata/index.js.map +1 -0
- package/dist/connectors/okta/connector.json +194 -0
- package/dist/connectors/okta/index.d.ts +8 -0
- package/dist/connectors/okta/index.js +7 -0
- package/dist/connectors/okta/index.js.map +1 -0
- package/dist/connectors/okta/tools.d.ts +6 -0
- package/dist/connectors/okta/tools.js +429 -0
- package/dist/connectors/okta/tools.js.map +1 -0
- package/dist/connectors/okta/vendor.d.ts +14 -0
- package/dist/connectors/okta/vendor.js +204 -0
- package/dist/connectors/okta/vendor.js.map +1 -0
- package/dist/connectors/outlook-calendar/index.d.ts +2 -0
- package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
- package/dist/connectors/outlook-mail/index.d.ts +2 -0
- package/dist/connectors/outlook-mail/tools.d.ts +8 -0
- package/dist/connectors/salesforce/index.d.ts +8 -0
- package/dist/connectors/salesforce/soql.d.ts +3 -0
- package/dist/connectors/salesforce/tools.d.ts +9 -0
- package/dist/connectors/salesforce/vendor.d.ts +3 -0
- package/dist/connectors/salesforce/vendor.js +9 -3
- package/dist/connectors/salesforce/vendor.js.map +1 -1
- package/dist/connectors/sap-s4hana/connector.json +264 -0
- package/dist/connectors/sap-s4hana/index.d.ts +8 -0
- package/dist/connectors/sap-s4hana/index.js +7 -0
- package/dist/connectors/sap-s4hana/index.js.map +1 -0
- package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
- package/dist/connectors/sap-s4hana/tools.js +761 -0
- package/dist/connectors/sap-s4hana/tools.js.map +1 -0
- package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
- package/dist/connectors/sap-s4hana/vendor.js +176 -0
- package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
- package/dist/connectors/servicenow/connector.json +228 -0
- package/dist/connectors/servicenow/index.d.ts +8 -0
- package/dist/connectors/servicenow/index.js +7 -0
- package/dist/connectors/servicenow/index.js.map +1 -0
- package/dist/connectors/servicenow/tools.d.ts +4 -0
- package/dist/connectors/servicenow/tools.js +884 -0
- package/dist/connectors/servicenow/tools.js.map +1 -0
- package/dist/connectors/servicenow/vendor.d.ts +3 -0
- package/dist/connectors/servicenow/vendor.js +106 -0
- package/dist/connectors/servicenow/vendor.js.map +1 -0
- package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
- package/dist/connectors/sharepoint-files/index.d.ts +8 -0
- package/dist/connectors/sharepoint-files/index.js.map +1 -1
- package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
- package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
- package/dist/connectors/slack/connector.json +148 -0
- package/dist/connectors/slack/index.d.ts +8 -0
- package/dist/connectors/slack/index.js +7 -0
- package/dist/connectors/slack/index.js.map +1 -0
- package/dist/connectors/slack/tools.d.ts +3 -0
- package/dist/connectors/slack/tools.js +355 -0
- package/dist/connectors/slack/tools.js.map +1 -0
- package/dist/connectors/slack/vendor.d.ts +17 -0
- package/dist/connectors/slack/vendor.js +189 -0
- package/dist/connectors/slack/vendor.js.map +1 -0
- package/dist/connectors/soap/index.d.ts +16 -0
- package/dist/connectors/soap/index.js +248 -0
- package/dist/connectors/soap/index.js.map +1 -0
- package/dist/connectors/soap/xml.d.ts +12 -0
- package/dist/connectors/soap/xml.js +126 -0
- package/dist/connectors/soap/xml.js.map +1 -0
- package/dist/connectors/sql/engines.d.ts +58 -0
- package/dist/connectors/sql/engines.js +292 -0
- package/dist/connectors/sql/engines.js.map +1 -0
- package/dist/connectors/sql/index.d.ts +16 -0
- package/dist/connectors/sql/index.js +214 -0
- package/dist/connectors/sql/index.js.map +1 -0
- package/dist/connectors/teams/index.d.ts +2 -0
- package/dist/connectors/teams/tools.d.ts +7 -0
- package/dist/connectors/teams/tools.js +3 -2
- package/dist/connectors/teams/tools.js.map +1 -1
- package/dist/connectors/workday/connector.json +188 -0
- package/dist/connectors/workday/index.d.ts +8 -0
- package/dist/connectors/workday/index.js +7 -0
- package/dist/connectors/workday/index.js.map +1 -0
- package/dist/connectors/workday/tools.d.ts +33 -0
- package/dist/connectors/workday/tools.js +410 -0
- package/dist/connectors/workday/tools.js.map +1 -0
- package/dist/connectors/workday/vendor.d.ts +18 -0
- package/dist/connectors/workday/vendor.js +199 -0
- package/dist/connectors/workday/vendor.js.map +1 -0
- package/dist/packages/connector-kit/src/branding.d.ts +57 -0
- package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
- package/dist/packages/connector-kit/src/common.d.ts +36 -0
- package/dist/packages/connector-kit/src/common.js +4 -1
- package/dist/packages/connector-kit/src/common.js.map +1 -1
- package/dist/packages/connector-kit/src/connector.d.ts +1356 -0
- package/dist/packages/connector-kit/src/connector.js +634 -53
- package/dist/packages/connector-kit/src/connector.js.map +1 -1
- package/dist/packages/connector-kit/src/fetch.d.ts +6 -0
- package/dist/packages/connector-kit/src/fetch.js +44 -0
- package/dist/packages/connector-kit/src/fetch.js.map +1 -0
- package/dist/packages/connector-kit/src/index.d.ts +5 -0
- package/dist/packages/connector-kit/src/index.js +6 -0
- package/dist/packages/connector-kit/src/index.js.map +1 -0
- package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
- package/dist/packages/connector-kit/src/oauth.js +25 -6
- package/dist/packages/connector-kit/src/oauth.js.map +1 -1
- package/dist/packages/connector-kit/src/types.d.ts +87 -0
- package/dist/packages/connector-kit/src/types.js.map +1 -1
- package/dist/packages/server/migrations/0007_app_events.sql +110 -0
- package/dist/packages/server/migrations/rollback/to-legacy.sql +3 -0
- package/dist/packages/server/src/api.d.ts +3730 -0
- package/dist/packages/server/src/api.js +137 -1
- package/dist/packages/server/src/api.js.map +1 -1
- package/dist/packages/server/src/app.d.ts +23 -0
- package/dist/packages/server/src/app.js +24 -1
- package/dist/packages/server/src/app.js.map +1 -1
- package/dist/packages/server/src/builtin.d.ts +5 -0
- package/dist/packages/server/src/builtin.js +18 -0
- package/dist/packages/server/src/builtin.js.map +1 -1
- package/dist/packages/server/src/consent.d.ts +27 -0
- package/dist/packages/server/src/events/admin.d.ts +156 -0
- package/dist/packages/server/src/events/admin.js +255 -0
- package/dist/packages/server/src/events/admin.js.map +1 -0
- package/dist/packages/server/src/events/deliver.d.ts +43 -0
- package/dist/packages/server/src/events/deliver.js +129 -0
- package/dist/packages/server/src/events/deliver.js.map +1 -0
- package/dist/packages/server/src/events/runtime.d.ts +28 -0
- package/dist/packages/server/src/events/runtime.js +400 -0
- package/dist/packages/server/src/events/runtime.js.map +1 -0
- package/dist/packages/server/src/events/store.d.ts +172 -0
- package/dist/packages/server/src/events/store.js +275 -0
- package/dist/packages/server/src/events/store.js.map +1 -0
- package/dist/packages/server/src/index.d.ts +40 -0
- package/dist/packages/server/src/index.js +68 -11
- package/dist/packages/server/src/index.js.map +1 -1
- package/dist/packages/server/src/migrate.d.ts +11 -0
- package/dist/packages/server/src/openapi.d.ts +4 -0
- package/dist/packages/server/src/openapi.js +2 -2
- package/dist/packages/server/src/openapi.js.map +1 -1
- package/dist/packages/server/src/queue.d.ts +10 -0
- package/dist/packages/server/src/queue.js +45 -0
- package/dist/packages/server/src/queue.js.map +1 -0
- package/dist/packages/server/src/secrets.d.ts +19 -0
- package/dist/packages/server/src/server.d.ts +1 -0
- package/dist/packages/server/src/server.js +14 -1
- package/dist/packages/server/src/server.js.map +1 -1
- package/dist/packages/server/src/service.d.ts +767 -0
- package/dist/packages/server/src/service.js +19 -3
- package/dist/packages/server/src/service.js.map +1 -1
- package/dist/packages/server/src/store.d.ts +157 -0
- package/dist/packages/server/src/store.js +4 -0
- package/dist/packages/server/src/store.js.map +1 -1
- package/dist/packages/server/src/teams/activity.d.ts +123 -0
- package/dist/packages/server/src/teams/activity.js +6 -5
- package/dist/packages/server/src/teams/activity.js.map +1 -1
- package/dist/packages/server/src/teams/admin.d.ts +335 -0
- package/dist/packages/server/src/teams/admin.js +1 -1
- package/dist/packages/server/src/teams/admin.js.map +1 -1
- package/dist/packages/server/src/teams/approval.d.ts +57 -0
- package/dist/packages/server/src/teams/bot.d.ts +25 -0
- package/dist/packages/server/src/teams/claude.d.ts +46 -0
- package/dist/packages/server/src/teams/jwt.d.ts +17 -0
- package/dist/packages/server/src/teams/package.d.ts +79 -0
- package/dist/packages/server/src/teams/provision.d.ts +84 -0
- package/dist/packages/server/src/teams/runner.d.ts +80 -0
- package/dist/packages/server/src/teams/runner.js +50 -6
- package/dist/packages/server/src/teams/runner.js.map +1 -1
- package/dist/packages/server/src/teams/runtime.d.ts +91 -0
- package/dist/packages/server/src/teams/runtime.js +25 -47
- package/dist/packages/server/src/teams/runtime.js.map +1 -1
- package/dist/packages/server/src/teams/store.d.ts +233 -0
- package/package.json +28 -2
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { tables } from "../store.js";
|
|
2
|
+
// Postgres for app events: each organization's subscriptions, the inbound queue, each agent's
|
|
3
|
+
// event triggers and the runs they started (migrations/0007_app_events.sql).
|
|
4
|
+
const iso = (column) => `to_char(${column} at time zone 'UTC', 'YYYY-MM-DD"T"HH24:MI:SS.MS"Z"')`;
|
|
5
|
+
const SUBSCRIPTION = `id::text, organization_id::text as "organizationId",
|
|
6
|
+
connector_id as "connectorId", source, secret, secret_key_id as "secretKeyId", filter,
|
|
7
|
+
interval_seconds as "intervalSeconds", cursor, ${iso("polled_at")} as "polledAt",
|
|
8
|
+
last_error as "lastError", registered, created_by as "createdBy",
|
|
9
|
+
${iso("created_at")} as "createdAt"`;
|
|
10
|
+
const TRIGGER = `t.id::text, t.agent_id::text as "agentId", t.connector_id as "connectorId",
|
|
11
|
+
t.enabled, t.event_types as "eventTypes", t.conditions, t.prompt, t.runner, t.settings,
|
|
12
|
+
t.secret, t.secret_key_id as "secretKeyId", t.managed_agent_id as "managedAgentId",
|
|
13
|
+
t.environment_id as "environmentId", t.vault_ids as "vaultIds",
|
|
14
|
+
t.budget_cents as "budgetCents", t.max_runs_per_hour as "maxRunsPerHour",
|
|
15
|
+
t.max_cents_per_day as "maxCentsPerDay", t.max_concurrent as "maxConcurrent",
|
|
16
|
+
t.updated_by as "updatedBy", ${iso("t.updated_at")} as "updatedAt"`;
|
|
17
|
+
const RUN = `r.id::text, r.agent_id::text as "agentId", r.trigger_id::text as "triggerId",
|
|
18
|
+
t.connector_id as "connectorId", r.event_type as "eventType", r.delivery_id as "deliveryId",
|
|
19
|
+
r.runner, r.session_id as "sessionId", r.state, r.error, r.cost_cents as "costCents",
|
|
20
|
+
${iso("r.started_at")} as "startedAt", ${iso("r.finished_at")} as "finishedAt"`;
|
|
21
|
+
export function createEventsStore(sql, schema) {
|
|
22
|
+
const t = tables(sql, schema);
|
|
23
|
+
return {
|
|
24
|
+
// ---- subscriptions ----
|
|
25
|
+
// Null when the organization already subscribed to the app.
|
|
26
|
+
async createSubscription(input) {
|
|
27
|
+
const [row] = await sql.unsafe(`insert into ${t.event_subscriptions}
|
|
28
|
+
(id, organization_id, connector_id, source, secret, secret_key_id, filter,
|
|
29
|
+
interval_seconds, cursor, created_by)
|
|
30
|
+
values ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
|
|
31
|
+
on conflict (organization_id, connector_id) do nothing returning ${SUBSCRIPTION}`, [
|
|
32
|
+
input.id,
|
|
33
|
+
input.organizationId,
|
|
34
|
+
input.connectorId,
|
|
35
|
+
input.source,
|
|
36
|
+
input.secret,
|
|
37
|
+
input.secretKeyId,
|
|
38
|
+
input.filter,
|
|
39
|
+
input.intervalSeconds,
|
|
40
|
+
input.cursor,
|
|
41
|
+
input.createdBy,
|
|
42
|
+
]);
|
|
43
|
+
return row ?? null;
|
|
44
|
+
},
|
|
45
|
+
async subscription(id) {
|
|
46
|
+
const [row] = await sql.unsafe(`select ${SUBSCRIPTION} from ${t.event_subscriptions} where id = $1`, [id]);
|
|
47
|
+
return row ?? null;
|
|
48
|
+
},
|
|
49
|
+
async subscriptions(org) {
|
|
50
|
+
return sql.unsafe(`select ${SUBSCRIPTION} from ${t.event_subscriptions}
|
|
51
|
+
where organization_id = $1 order by connector_id`, [org]);
|
|
52
|
+
},
|
|
53
|
+
async deleteSubscription(org, id) {
|
|
54
|
+
const [row] = await sql.unsafe(`delete from ${t.event_subscriptions} where organization_id = $1 and id = $2
|
|
55
|
+
returning ${SUBSCRIPTION}`, [org, id]);
|
|
56
|
+
return row ?? null;
|
|
57
|
+
},
|
|
58
|
+
async setSecret(org, id, secret, keyId) {
|
|
59
|
+
const rows = await sql `
|
|
60
|
+
update ${t.event_subscriptions} set secret = ${secret}, secret_key_id = ${keyId}
|
|
61
|
+
where organization_id = ${org} and id = ${id} and source = 'webhook' returning id`;
|
|
62
|
+
return rows.length > 0;
|
|
63
|
+
},
|
|
64
|
+
async setRegistered(id, registered) {
|
|
65
|
+
await sql `update ${t.event_subscriptions} set registered = ${registered} where id = ${id}`;
|
|
66
|
+
},
|
|
67
|
+
// Polls whose interval has passed since they last ran.
|
|
68
|
+
async duePolls() {
|
|
69
|
+
return sql.unsafe(`select ${SUBSCRIPTION} from ${t.event_subscriptions}
|
|
70
|
+
where source = 'poll'
|
|
71
|
+
and (polled_at is null
|
|
72
|
+
or polled_at < now() - make_interval(secs => interval_seconds))
|
|
73
|
+
order by polled_at nulls first`);
|
|
74
|
+
},
|
|
75
|
+
async polled(id, cursor, error) {
|
|
76
|
+
await sql `
|
|
77
|
+
update ${t.event_subscriptions}
|
|
78
|
+
set polled_at = now(), cursor = coalesce(${cursor}, cursor), last_error = ${error}
|
|
79
|
+
where id = ${id}`;
|
|
80
|
+
},
|
|
81
|
+
// During a key rotation: the secrets still sealed with another key than `keyId`.
|
|
82
|
+
async staleSecrets(keyId) {
|
|
83
|
+
const [subscriptions, triggers] = await Promise.all([
|
|
84
|
+
sql `
|
|
85
|
+
select s.id::text, s.organization_id::text as "organizationId", s.secret,
|
|
86
|
+
s.secret_key_id as "secretKeyId"
|
|
87
|
+
from ${t.event_subscriptions} s
|
|
88
|
+
where s.secret is not null and s.secret_key_id <> ${keyId}`,
|
|
89
|
+
sql `
|
|
90
|
+
select t.id::text, a.organization_id::text as "organizationId",
|
|
91
|
+
t.agent_id::text as "agentId", t.connector_id as "connectorId", t.secret,
|
|
92
|
+
t.secret_key_id as "secretKeyId"
|
|
93
|
+
from ${t.event_triggers} t join ${t.agents} a on a.id = t.agent_id
|
|
94
|
+
where t.secret is not null and t.secret_key_id <> ${keyId}`,
|
|
95
|
+
]);
|
|
96
|
+
return { subscriptions, triggers };
|
|
97
|
+
},
|
|
98
|
+
// Only over the secret read: one replaced meanwhile stays.
|
|
99
|
+
async reseal(table, id, was, secret, keyId) {
|
|
100
|
+
const rows = await sql `
|
|
101
|
+
update ${t[table]} set secret = ${secret}, secret_key_id = ${keyId}
|
|
102
|
+
where id = ${id} and secret = ${was} returning id`;
|
|
103
|
+
return rows.length > 0;
|
|
104
|
+
},
|
|
105
|
+
// ---- the queue ----
|
|
106
|
+
// Null when this delivery was already received (a retry or a replay).
|
|
107
|
+
async insertEvent(input) {
|
|
108
|
+
const [row] = await sql `
|
|
109
|
+
insert into ${t.app_events}
|
|
110
|
+
(subscription_id, delivery_id, event_type, payload, payload_key_id)
|
|
111
|
+
values (${input.subscriptionId}, ${input.deliveryId}, ${input.eventType},
|
|
112
|
+
${input.payload}, ${input.payloadKeyId})
|
|
113
|
+
on conflict (subscription_id, delivery_id) do nothing returning id::text`;
|
|
114
|
+
return row?.id ?? null;
|
|
115
|
+
},
|
|
116
|
+
// The oldest pending event, or one whose worker died. Never the same one to two workers.
|
|
117
|
+
async claimEvent() {
|
|
118
|
+
const [row] = await sql.unsafe(`with claimed as (
|
|
119
|
+
update ${t.app_events} set state = 'processing', claimed_at = now()
|
|
120
|
+
where id = (
|
|
121
|
+
select id from ${t.app_events}
|
|
122
|
+
where state = 'pending'
|
|
123
|
+
or (state = 'processing' and claimed_at < now() - interval '10 minutes')
|
|
124
|
+
order by id for update skip locked limit 1)
|
|
125
|
+
returning *)
|
|
126
|
+
select c.id::text, c.subscription_id::text as "subscriptionId",
|
|
127
|
+
s.organization_id::text as "organizationId", s.connector_id as "connectorId",
|
|
128
|
+
c.delivery_id as "deliveryId", c.event_type as "eventType", c.payload,
|
|
129
|
+
c.payload_key_id as "payloadKeyId"
|
|
130
|
+
from claimed c join ${t.event_subscriptions} s on s.id = c.subscription_id`);
|
|
131
|
+
return row ?? null;
|
|
132
|
+
},
|
|
133
|
+
// The payload is kept only until the event is handled.
|
|
134
|
+
async finishEvent(id, state, reason) {
|
|
135
|
+
await sql `
|
|
136
|
+
update ${t.app_events}
|
|
137
|
+
set state = ${state}, reason = ${reason}, payload = null, payload_key_id = null
|
|
138
|
+
where id = ${id}`;
|
|
139
|
+
},
|
|
140
|
+
async pruneEvents() {
|
|
141
|
+
await sql `delete from ${t.app_events} where received_at < now() - interval '30 days'`;
|
|
142
|
+
},
|
|
143
|
+
// ---- triggers ----
|
|
144
|
+
async agentState(agentId, connectorId) {
|
|
145
|
+
const [row] = await sql `
|
|
146
|
+
select a.name as "agentName", a.status as "agentStatus",
|
|
147
|
+
case when g.agent_id is null then null else
|
|
148
|
+
jsonb_build_object('capabilities', to_jsonb(g.capabilities), 'limits', g.limits)
|
|
149
|
+
end as grant,
|
|
150
|
+
case when c.id is null then null else
|
|
151
|
+
jsonb_build_object('capabilities', to_jsonb(c.capabilities),
|
|
152
|
+
'connected', c.status = 'connected'
|
|
153
|
+
and (c.provider_id is null or p.status = 'connected'))
|
|
154
|
+
end as connection
|
|
155
|
+
from ${t.agents} a
|
|
156
|
+
left join ${t.grants} g on g.agent_id = a.id and g.connector_id = ${connectorId}
|
|
157
|
+
left join ${t.connections} c
|
|
158
|
+
on c.organization_id = a.organization_id and c.connector_id = ${connectorId}
|
|
159
|
+
left join ${t.providers} p on p.id = c.provider_id
|
|
160
|
+
where a.id = ${agentId}`;
|
|
161
|
+
return row ?? null;
|
|
162
|
+
},
|
|
163
|
+
// Every enabled trigger on the app, of the organization's agents.
|
|
164
|
+
async triggersFor(org, connectorId) {
|
|
165
|
+
return sql.unsafe(`select ${TRIGGER} from ${t.event_triggers} t join ${t.agents} a on a.id = t.agent_id
|
|
166
|
+
where a.organization_id = $1 and t.connector_id = $2 and t.enabled
|
|
167
|
+
order by t.agent_id`, [org, connectorId]);
|
|
168
|
+
},
|
|
169
|
+
async trigger(org, agentId, connectorId) {
|
|
170
|
+
const [row] = await sql.unsafe(`select ${TRIGGER} from ${t.event_triggers} t join ${t.agents} a on a.id = t.agent_id
|
|
171
|
+
where a.organization_id = $1 and t.agent_id = $2 and t.connector_id = $3`, [org, agentId, connectorId]);
|
|
172
|
+
return row ?? null;
|
|
173
|
+
},
|
|
174
|
+
async triggerById(id) {
|
|
175
|
+
const [row] = await sql.unsafe(`select ${TRIGGER} from ${t.event_triggers} t where t.id = $1`, [id]);
|
|
176
|
+
return row ?? null;
|
|
177
|
+
},
|
|
178
|
+
async agentTriggers(org, agentId) {
|
|
179
|
+
return sql.unsafe(`select ${TRIGGER} from ${t.event_triggers} t join ${t.agents} a on a.id = t.agent_id
|
|
180
|
+
where a.organization_id = $1 and t.agent_id = $2 order by t.connector_id`, [org, agentId]);
|
|
181
|
+
},
|
|
182
|
+
// Only for an agent of this organization; false otherwise.
|
|
183
|
+
async setTrigger(org, row) {
|
|
184
|
+
const rows = await sql `
|
|
185
|
+
insert into ${t.event_triggers}
|
|
186
|
+
(agent_id, connector_id, enabled, event_types, conditions, prompt, runner, settings,
|
|
187
|
+
secret, secret_key_id, managed_agent_id, environment_id, vault_ids, budget_cents,
|
|
188
|
+
max_runs_per_hour, max_cents_per_day, max_concurrent, updated_by)
|
|
189
|
+
select a.id, ${row.connectorId}, ${row.enabled}, ${sql.array(row.eventTypes)},
|
|
190
|
+
${sql.json(row.conditions)}, ${row.prompt}, ${row.runner},
|
|
191
|
+
${sql.json(row.settings)}, ${row.secret},
|
|
192
|
+
${row.secretKeyId}, ${row.managedAgentId}, ${row.environmentId},
|
|
193
|
+
${sql.array(row.vaultIds)}, ${row.budgetCents}, ${row.maxRunsPerHour},
|
|
194
|
+
${row.maxCentsPerDay}, ${row.maxConcurrent}, ${row.updatedBy}
|
|
195
|
+
from ${t.agents} a
|
|
196
|
+
where a.id = ${row.agentId} and a.organization_id = ${org}
|
|
197
|
+
on conflict (agent_id, connector_id) do update set
|
|
198
|
+
enabled = excluded.enabled, event_types = excluded.event_types,
|
|
199
|
+
conditions = excluded.conditions, prompt = excluded.prompt, runner = excluded.runner,
|
|
200
|
+
settings = excluded.settings, secret = excluded.secret,
|
|
201
|
+
secret_key_id = excluded.secret_key_id, managed_agent_id = excluded.managed_agent_id,
|
|
202
|
+
environment_id = excluded.environment_id, vault_ids = excluded.vault_ids,
|
|
203
|
+
budget_cents = excluded.budget_cents, max_runs_per_hour = excluded.max_runs_per_hour,
|
|
204
|
+
max_cents_per_day = excluded.max_cents_per_day,
|
|
205
|
+
max_concurrent = excluded.max_concurrent, updated_by = excluded.updated_by,
|
|
206
|
+
updated_at = now()
|
|
207
|
+
returning agent_id`;
|
|
208
|
+
return rows.length > 0;
|
|
209
|
+
},
|
|
210
|
+
async removeTrigger(org, agentId, connectorId) {
|
|
211
|
+
const rows = await sql `
|
|
212
|
+
delete from ${t.event_triggers} t using ${t.agents} a
|
|
213
|
+
where a.id = t.agent_id and a.organization_id = ${org} and t.agent_id = ${agentId}
|
|
214
|
+
and t.connector_id = ${connectorId}
|
|
215
|
+
returning t.id`;
|
|
216
|
+
return rows.length > 0;
|
|
217
|
+
},
|
|
218
|
+
// ---- runs ----
|
|
219
|
+
// Runs live now, started in the last hour (failed starts too), and what finished runs
|
|
220
|
+
// cost in the last 24 hours, for one trigger.
|
|
221
|
+
async runCounts(triggerId) {
|
|
222
|
+
const [row] = await sql `
|
|
223
|
+
select count(*) filter (where state in ('starting', 'running'))::int as active,
|
|
224
|
+
count(*) filter (where started_at > now() - interval '1 hour')::int as "lastHour",
|
|
225
|
+
coalesce(sum(cost_cents) filter (where started_at > now() - interval '24 hours'),
|
|
226
|
+
0)::int as "spentToday"
|
|
227
|
+
from ${t.event_runs}
|
|
228
|
+
where trigger_id = ${triggerId} and started_at > now() - interval '24 hours'
|
|
229
|
+
or (trigger_id = ${triggerId} and state in ('starting', 'running'))`;
|
|
230
|
+
return row;
|
|
231
|
+
},
|
|
232
|
+
async startRun(input) {
|
|
233
|
+
const [row] = await sql `
|
|
234
|
+
insert into ${t.event_runs}
|
|
235
|
+
(agent_id, trigger_id, event_id, event_type, delivery_id, runner, state)
|
|
236
|
+
values (${input.agentId}, ${input.triggerId}, ${input.eventId}, ${input.eventType},
|
|
237
|
+
${input.deliveryId}, ${input.runner}, 'starting')
|
|
238
|
+
returning id::text`;
|
|
239
|
+
return row.id;
|
|
240
|
+
},
|
|
241
|
+
async updateRun(id, patch) {
|
|
242
|
+
const finished = patch.state === "ended" || patch.state === "failed";
|
|
243
|
+
await sql `
|
|
244
|
+
update ${t.event_runs}
|
|
245
|
+
set state = coalesce(${patch.state ?? null}, state),
|
|
246
|
+
session_id = coalesce(${patch.sessionId ?? null}, session_id),
|
|
247
|
+
error = coalesce(${patch.error ?? null}, error),
|
|
248
|
+
cost_cents = coalesce(${patch.costCents ?? null}, cost_cents),
|
|
249
|
+
finished_at = case when ${finished} then now() else finished_at end
|
|
250
|
+
where id = ${id}`;
|
|
251
|
+
},
|
|
252
|
+
// Runs left starting (the process stopped mid-start) hold a concurrency slot forever.
|
|
253
|
+
async failStaleStarts() {
|
|
254
|
+
const rows = await sql `
|
|
255
|
+
update ${t.event_runs}
|
|
256
|
+
set state = 'failed', error = 'Did not start', finished_at = now()
|
|
257
|
+
where state = 'starting' and started_at < now() - interval '10 minutes'
|
|
258
|
+
returning id`;
|
|
259
|
+
return rows.length;
|
|
260
|
+
},
|
|
261
|
+
async runningRuns() {
|
|
262
|
+
return sql.unsafe(`select ${RUN}, a.organization_id::text as "organizationId"
|
|
263
|
+
from ${t.event_runs} r join ${t.event_triggers} t on t.id = r.trigger_id
|
|
264
|
+
join ${t.agents} a on a.id = r.agent_id
|
|
265
|
+
where r.state = 'running' and r.session_id is not null order by r.started_at`);
|
|
266
|
+
},
|
|
267
|
+
async recentRuns(org, agentId, limit) {
|
|
268
|
+
return sql.unsafe(`select ${RUN} from ${t.event_runs} r join ${t.event_triggers} t on t.id = r.trigger_id
|
|
269
|
+
where r.agent_id = $2 and exists (select 1 from ${t.agents} a
|
|
270
|
+
where a.id = $2 and a.organization_id = $1)
|
|
271
|
+
order by r.started_at desc limit $3`, [org, agentId, limit]);
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../../packages/server/src/events/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type BrandingInput } from "../../connector-kit/src/branding.js";
|
|
2
|
+
import { type BuiltinModule, type ConnectorModule } from "./builtin.js";
|
|
3
|
+
import { type ConnectorJson } from "../../connector-kit/src/connector.js";
|
|
4
|
+
import { type Sql } from "./store.js";
|
|
5
|
+
import { type RunnerFactory } from "./teams/runner.js";
|
|
6
|
+
export type { BrandingInput } from "../../connector-kit/src/branding.js";
|
|
7
|
+
export type { ConnectorContext, ConnectorModule } from "./builtin.js";
|
|
8
|
+
export type { ConnectorJson } from "../../connector-kit/src/connector.js";
|
|
9
|
+
export { builtinConnectors } from "./builtin.js";
|
|
10
|
+
export type { EventRunInput, RunInput, RunnerFactory, TriggerRunner } from "./teams/runner.js";
|
|
11
|
+
export { claudeManagedAgents, signature, signedWebhook } from "./teams/runner.js";
|
|
12
|
+
export type AgentConnectOptions = {
|
|
13
|
+
database: Sql | {
|
|
14
|
+
url: string;
|
|
15
|
+
};
|
|
16
|
+
schema?: string;
|
|
17
|
+
migrate?: boolean;
|
|
18
|
+
encryptionKey: string;
|
|
19
|
+
previousEncryptionKey?: string;
|
|
20
|
+
adminToken: string;
|
|
21
|
+
publicBaseUrl?: string | null;
|
|
22
|
+
branding?: BrandingInput;
|
|
23
|
+
connectors?: (ConnectorModule | BuiltinModule | ConnectorJson)[];
|
|
24
|
+
extraConnectorDirs?: string[];
|
|
25
|
+
microsoftSharedApp?: {
|
|
26
|
+
clientId: string;
|
|
27
|
+
clientSecret: string;
|
|
28
|
+
} | null;
|
|
29
|
+
runners?: RunnerFactory[];
|
|
30
|
+
log?: Pick<Console, "log" | "error">;
|
|
31
|
+
};
|
|
32
|
+
/** The whole service, checked and wired: fetch serves /agent-connect/*, start runs the Teams
|
|
33
|
+
* and app events queue workers, watchers and polls. Throws on anything misconfigured. */
|
|
34
|
+
export declare function createAgentConnect(options: AgentConnectOptions): Promise<{
|
|
35
|
+
fetch: (req: Request) => Promise<Response>;
|
|
36
|
+
connectors: string[];
|
|
37
|
+
start(): void;
|
|
38
|
+
stop(): Promise<void>;
|
|
39
|
+
}>;
|
|
40
|
+
export type AgentConnect = Awaited<ReturnType<typeof createAgentConnect>>;
|
|
@@ -1,13 +1,20 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from "node:fs";
|
|
1
2
|
import { pathToFileURL } from "node:url";
|
|
2
3
|
import { createApp } from "./app.js";
|
|
3
4
|
import { parseBranding, setBranding, } from "../../connector-kit/src/branding.js";
|
|
4
5
|
import { builtinConnectors } from "./builtin.js";
|
|
5
6
|
import httpConnector from "../../../connectors/http/index.js";
|
|
6
|
-
import
|
|
7
|
+
import odataConnector from "../../../connectors/odata/index.js";
|
|
8
|
+
import soapConnector from "../../../connectors/soap/index.js";
|
|
9
|
+
import sqlConnector from "../../../connectors/sql/index.js";
|
|
10
|
+
import { CONNECTORS_DIR, loadConnectors, loadProviders, parseConnector, } from "../../connector-kit/src/connector.js";
|
|
7
11
|
import { migrate as runMigrations } from "./migrate.js";
|
|
8
12
|
import { CredentialKey } from "./secrets.js";
|
|
9
13
|
import { assertToolsImplemented, createService } from "./service.js";
|
|
10
14
|
import { assertSchemaName, connectDatabase, createStore } from "./store.js";
|
|
15
|
+
import { createEventsAdmin, resealEventSecrets } from "./events/admin.js";
|
|
16
|
+
import { createEventsRuntime } from "./events/runtime.js";
|
|
17
|
+
import { createEventsStore } from "./events/store.js";
|
|
11
18
|
import { createTeamsAdmin, resealTeamsCredentials } from "./teams/admin.js";
|
|
12
19
|
import { botClient } from "./teams/bot.js";
|
|
13
20
|
import { claudeClient } from "./teams/claude.js";
|
|
@@ -20,16 +27,34 @@ import { microsoftClient } from "../../../connectors/microsoft/client.js";
|
|
|
20
27
|
export { builtinConnectors } from "./builtin.js";
|
|
21
28
|
export { claudeManagedAgents, signature, signedWebhook } from "./teams/runner.js";
|
|
22
29
|
/** The whole service, checked and wired: fetch serves /agent-connect/*, start runs the Teams
|
|
23
|
-
* queue
|
|
30
|
+
* and app events queue workers, watchers and polls. Throws on anything misconfigured. */
|
|
24
31
|
export async function createAgentConnect(options) {
|
|
25
32
|
const log = options.log ?? console;
|
|
26
33
|
setBranding(parseBranding(options.branding));
|
|
27
34
|
const schema = options.schema ?? "agent_connect";
|
|
28
35
|
assertSchemaName(schema);
|
|
29
36
|
const microsoft = microsoftClient({ sharedApp: options.microsoftSharedApp ?? null });
|
|
30
|
-
const modules = new Map(
|
|
37
|
+
const modules = new Map();
|
|
38
|
+
const inline = [];
|
|
39
|
+
for (const entry of options.connectors ?? builtinConnectors) {
|
|
40
|
+
if (!("create" in entry)) {
|
|
41
|
+
inline.push(parseConnector(entry, `Connector ${entry.id}`));
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
if (modules.has(entry.id))
|
|
45
|
+
throw new Error(`Two connector modules have the id ${entry.id}`);
|
|
46
|
+
modules.set(entry.id, entry);
|
|
47
|
+
if (!entry.connector)
|
|
48
|
+
continue;
|
|
49
|
+
const connector = parseConnector(entry.connector, `Connector ${entry.id}`);
|
|
50
|
+
if (connector.id !== entry.id)
|
|
51
|
+
throw new Error(`Connector module ${entry.id} carries the definition of ${connector.id}`);
|
|
52
|
+
inline.push(connector);
|
|
53
|
+
}
|
|
54
|
+
const builtin = loadConnectors(CONNECTORS_DIR, (id) => modules.has(id));
|
|
31
55
|
const connectors = [
|
|
32
|
-
...
|
|
56
|
+
...builtin,
|
|
57
|
+
...inline,
|
|
33
58
|
...(options.extraConnectorDirs ?? []).flatMap((dir) => {
|
|
34
59
|
const found = loadConnectors(pathToFileURL(`${dir.replace(/\/+$/, "")}/`));
|
|
35
60
|
if (!found.length)
|
|
@@ -37,15 +62,29 @@ export async function createAgentConnect(options) {
|
|
|
37
62
|
return found;
|
|
38
63
|
}),
|
|
39
64
|
];
|
|
65
|
+
for (const id of modules.keys())
|
|
66
|
+
if (!connectors.some((c) => c.id === id))
|
|
67
|
+
throw new Error(`Connector module ${id} has no definition: give it as its connector, or its folder in extraConnectorDirs`);
|
|
40
68
|
const apps = connectors.map((connector) => {
|
|
41
69
|
if (connectors.filter((c) => c.id === connector.id).length > 1)
|
|
42
70
|
throw new Error(`Two connectors have the id ${connector.id}`);
|
|
43
|
-
// An app described entirely in its connector.json runs on
|
|
44
|
-
const module = modules.get(connector.id) ??
|
|
71
|
+
// An app described entirely in its connector.json runs on a generic module.
|
|
72
|
+
const module = modules.get(connector.id) ??
|
|
73
|
+
(connector.http
|
|
74
|
+
? httpConnector
|
|
75
|
+
: connector.soap
|
|
76
|
+
? soapConnector
|
|
77
|
+
: connector.odata
|
|
78
|
+
? odataConnector
|
|
79
|
+
: connector.sql
|
|
80
|
+
? sqlConnector
|
|
81
|
+
: undefined);
|
|
45
82
|
if (!module)
|
|
46
83
|
throw new Error(`Connector ${connector.id} has no code (ConnectorModule)`);
|
|
47
84
|
return { connector, ...module.create({ microsoft, connector }) };
|
|
48
85
|
});
|
|
86
|
+
if (!apps.length)
|
|
87
|
+
throw new Error("No connectors: pass at least one app in connectors");
|
|
49
88
|
assertToolsImplemented(apps);
|
|
50
89
|
// Every `live` step check a connector names is one the Teams admin runs.
|
|
51
90
|
for (const { connector } of apps)
|
|
@@ -53,15 +92,18 @@ export async function createAgentConnect(options) {
|
|
|
53
92
|
if (step.live && !LIVE_CHECKS.includes(step.live))
|
|
54
93
|
throw new Error(`Connector ${connector.id}: no live check ${step.live}`);
|
|
55
94
|
const providerClients = { microsoft: microsoft.provider };
|
|
95
|
+
// A built-in app left out drops out of its provider's add-agent steps.
|
|
96
|
+
const left = new Set(readdirSync(CONNECTORS_DIR).filter((id) => existsSync(new URL(`${id}/connector.json`, CONNECTORS_DIR)) && !modules.has(id)));
|
|
56
97
|
const providers = loadProviders().map((provider) => {
|
|
57
98
|
const client = providerClients[provider.id];
|
|
58
99
|
if (!client)
|
|
59
100
|
throw new Error(`connectors/${provider.id}/provider.json has no client`);
|
|
60
|
-
|
|
101
|
+
const addAgent = provider.addAgent
|
|
102
|
+
.map((step) => ({ ...step, apps: step.apps.filter((id) => !left.has(id)) }))
|
|
103
|
+
.filter((step) => step.apps.length);
|
|
104
|
+
return { provider: { ...provider, addAgent }, client };
|
|
61
105
|
});
|
|
62
|
-
const teamsConnector = apps.find((a) => a.connector.id === "teams")?.connector;
|
|
63
|
-
if (!teamsConnector)
|
|
64
|
-
throw new Error("The teams connector is missing");
|
|
106
|
+
const teamsConnector = apps.find((a) => a.connector.id === "teams")?.connector ?? null;
|
|
65
107
|
const ownsSql = !("unsafe" in options.database);
|
|
66
108
|
const sql = "unsafe" in options.database ? options.database : connectDatabase(options.database.url);
|
|
67
109
|
if (options.migrate ?? true)
|
|
@@ -92,10 +134,22 @@ export async function createAgentConnect(options) {
|
|
|
92
134
|
key,
|
|
93
135
|
bots: { botForAgent: teamsStore.botForAgent, access: runtime.access },
|
|
94
136
|
});
|
|
137
|
+
const eventsStore = createEventsStore(sql, schema);
|
|
138
|
+
const eventApps = new Map(apps.filter((a) => a.connector.events).map((a) => [a.connector.id, a.connector]));
|
|
139
|
+
const eventDeps = {
|
|
140
|
+
store,
|
|
141
|
+
events: eventsStore,
|
|
142
|
+
key,
|
|
143
|
+
connectors: eventApps,
|
|
144
|
+
appCall: service.appCall,
|
|
145
|
+
runners,
|
|
146
|
+
};
|
|
147
|
+
const events = createEventsRuntime(eventDeps);
|
|
95
148
|
const app = createApp({
|
|
96
149
|
service,
|
|
97
150
|
store,
|
|
98
151
|
adminToken: options.adminToken,
|
|
152
|
+
events: { runtime: events, admin: createEventsAdmin({ ...eventDeps, publicUrl }) },
|
|
99
153
|
teams: {
|
|
100
154
|
runtime,
|
|
101
155
|
admin: createTeamsAdmin({
|
|
@@ -115,12 +169,15 @@ export async function createAgentConnect(options) {
|
|
|
115
169
|
connectors: apps.map((a) => a.connector.id),
|
|
116
170
|
start() {
|
|
117
171
|
runtime.start();
|
|
172
|
+
events.start();
|
|
118
173
|
// While rotating the key, move what Teams sealed onto the new one.
|
|
119
174
|
if (options.previousEncryptionKey)
|
|
120
175
|
resealTeamsCredentials(teamsStore, key).then((n) => log.log(`[agent-connect] re-sealed ${n.bots} bot credentials, ${n.claudeKeys} Claude keys and ${n.triggerSecrets} trigger secrets`), (error) => log.error("[agent-connect] re-sealing Teams credentials failed", error));
|
|
176
|
+
if (options.previousEncryptionKey)
|
|
177
|
+
resealEventSecrets(eventsStore, key).then((n) => log.log(`[agent-connect] re-sealed ${n} app event secrets`), (error) => log.error("[agent-connect] re-sealing app event secrets failed", error));
|
|
121
178
|
},
|
|
122
179
|
async stop() {
|
|
123
|
-
await runtime.stop();
|
|
180
|
+
await Promise.all([runtime.stop(), events.stop()]);
|
|
124
181
|
if (ownsSql)
|
|
125
182
|
await sql.end();
|
|
126
183
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/server/src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,aAAa,EACb,WAAW,GAEZ,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/server/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Sql } from "./store.js";
|
|
2
|
+
export type Migration = {
|
|
3
|
+
id: string;
|
|
4
|
+
version: number;
|
|
5
|
+
name: string;
|
|
6
|
+
sql: string;
|
|
7
|
+
checksum: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function migrationFiles(): Migration[];
|
|
10
|
+
/** Applies pending migrations in one transaction; returns what it did, in order. */
|
|
11
|
+
export declare function migrate(sql: Sql, schema: string, log?: (line: string) => void): Promise<string[]>;
|
|
@@ -67,7 +67,7 @@ export function openapi() {
|
|
|
67
67
|
(paths[spec.path] ??= {})[spec.method.toLowerCase()] = {
|
|
68
68
|
operationId,
|
|
69
69
|
summary: spec.summary,
|
|
70
|
-
...(spec.teams ? { tags: ["teams"] } : {}),
|
|
70
|
+
...(spec.teams ? { tags: ["teams"] } : spec.events ? { tags: ["events"] } : {}),
|
|
71
71
|
...(parameters.length ? { parameters } : {}),
|
|
72
72
|
...(spec.body
|
|
73
73
|
? {
|
|
@@ -87,7 +87,7 @@ export function openapi() {
|
|
|
87
87
|
version: "1",
|
|
88
88
|
description: "Server to server only: a bearer token (AGENT_CONNECT_ADMIN_TOKEN), and requests " +
|
|
89
89
|
"carrying X-Forwarded-For are refused. Routes tagged teams are served only where " +
|
|
90
|
-
"Teams is set up.",
|
|
90
|
+
"Teams is set up, routes tagged events only where app events are.",
|
|
91
91
|
},
|
|
92
92
|
servers: [{ url: ADMIN_V1 }],
|
|
93
93
|
security: [{ bearer: [] }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../../../packages/server/src/openapi.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"openapi.js","sourceRoot":"","sources":["../../../../packages/server/src/openapi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** A queue worker for one process: `next` handles one item and says whether there was one.
|
|
2
|
+
* One drain at a time; a kick during one makes it look again before stopping. */
|
|
3
|
+
export declare function drainer(name: string, next: () => Promise<boolean>): {
|
|
4
|
+
kick: () => void;
|
|
5
|
+
start(): void;
|
|
6
|
+
/** Stops claiming and waits for the item in hand, so a rollout neither strands it nor
|
|
7
|
+
* handles it twice. */
|
|
8
|
+
stop(): Promise<void>;
|
|
9
|
+
idle(): Promise<void>;
|
|
10
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** A queue worker for one process: `next` handles one item and says whether there was one.
|
|
2
|
+
* One drain at a time; a kick during one makes it look again before stopping. */
|
|
3
|
+
export function drainer(name, next) {
|
|
4
|
+
let draining = null;
|
|
5
|
+
let again = false;
|
|
6
|
+
let stopped = false;
|
|
7
|
+
async function drain() {
|
|
8
|
+
while (again) {
|
|
9
|
+
again = false;
|
|
10
|
+
while (!stopped && (await next()))
|
|
11
|
+
;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function kick() {
|
|
15
|
+
if (stopped)
|
|
16
|
+
return;
|
|
17
|
+
again = true;
|
|
18
|
+
draining ??= drain()
|
|
19
|
+
.catch((error) => console.error(`[${name}] worker`, error))
|
|
20
|
+
.finally(() => {
|
|
21
|
+
draining = null;
|
|
22
|
+
if (again)
|
|
23
|
+
kick();
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
kick,
|
|
28
|
+
start() {
|
|
29
|
+
stopped = false;
|
|
30
|
+
},
|
|
31
|
+
/** Stops claiming and waits for the item in hand, so a rollout neither strands it nor
|
|
32
|
+
* handles it twice. */
|
|
33
|
+
async stop() {
|
|
34
|
+
stopped = true;
|
|
35
|
+
again = false;
|
|
36
|
+
while (draining)
|
|
37
|
+
await draining;
|
|
38
|
+
},
|
|
39
|
+
async idle() {
|
|
40
|
+
while (draining)
|
|
41
|
+
await draining;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queue.js","sourceRoot":"","sources":["../../../../packages/server/src/queue.ts"],"names":[],"mappings":"AAAA;kFACkF;AAClF,MAAM,UAAU,OAAO,CAAC,IAAY,EAAE,IAA4B;IAChE,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,UAAU,KAAK;QAClB,OAAO,KAAK,EAAE,CAAC;YACb,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;gBAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,SAAS,IAAI;QACX,IAAI,OAAO;YAAE,OAAO;QACpB,KAAK,GAAG,IAAI,CAAC;QACb,QAAQ,KAAK,KAAK,EAAE;aACjB,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC;aAC1D,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,GAAG,IAAI,CAAC;YAChB,IAAI,KAAK;gBAAE,IAAI,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACP,CAAC;IAED,OAAO;QACL,IAAI;QACJ,KAAK;YACH,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QACD;gCACwB;QACxB,KAAK,CAAC,IAAI;YACR,OAAO,GAAG,IAAI,CAAC;YACf,KAAK,GAAG,KAAK,CAAC;YACd,OAAO,QAAQ;gBAAE,MAAM,QAAQ,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,IAAI;YACR,OAAO,QAAQ;gBAAE,MAAM,QAAQ,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC"}
|