Health checks for Microsoft Graph and Google#1109
Conversation
15950e9 to
522f93b
Compare
62e30c7 to
1287945
Compare
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-marketing | 2cbcd9c | Commit Preview URL Branch Preview URL |
Jun 26 2026, 02:30 AM |
Deploying with
|
| Status | Name | Latest Commit | Updated (UTC) |
|---|---|---|---|
| ✅ Deployment successful! View logs |
executor-cloud | 2cbcd9c | Jun 26 2026, 02:32 AM |
Cloudflare preview
Sign-in is Cloudflare Access (one-time PIN to an allowed email). The preview has its own database and encryption key; it is destroyed when this PR closes. |
@executor-js/cli
@executor-js/config
@executor-js/execution
@executor-js/sdk
@executor-js/codemode-core
@executor-js/runtime-quickjs
@executor-js/plugin-file-secrets
@executor-js/plugin-graphql
@executor-js/plugin-keychain
@executor-js/plugin-mcp
@executor-js/plugin-onepassword
@executor-js/plugin-openapi
executor
commit: |
Greptile SummaryThis PR wires the four OpenAPI health-check hooks (
Confidence Score: 5/5Safe to merge. The health-check wiring is additive and the config schema changes correctly prevent stored health checks from being silently dropped on updateBundle read-modify-write cycles. Both Google and Microsoft plugins correctly add No files require special attention. The Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[addBundle / addGraph] --> B{Google: People API URL?}
B -- Yes --> C[defaultGoogleHealthCheck<br/>find people.people.get op]
C -- found --> D[write healthCheck into integrationConfig]
C -- not found --> E[no default health check set]
B -- No --> E
D --> F[ctx.core.integrations.register<br/>config includes healthCheck]
E --> F
G[updateBundle / updateGraph] --> H[spread ...current config<br/>existing healthCheck preserved]
H --> I[ctx.core.integrations.update]
J[setHealthCheck] --> K[setHealthCheckOpenApi<br/>read raw config, merge key]
K --> L[write back raw config<br/>healthCheck undefined = cleared]
M[checkHealth] --> N[checkHealthOpenApi<br/>resolve binding for spec.operation]
N --> O{binding found?}
O -- Yes --> P[invoke HTTP probe]
P --> Q{HTTP status}
Q -- 2xx --> R[healthy + extract identity]
Q -- 4xx/5xx --> S[expired / degraded]
O -- No --> T[unknown: operation not found]
U[listHealthCheckCandidates] --> V[listHealthCheckCandidatesOpenApi<br/>list stored ops, reparse spec for summaries]
V --> W[ranked candidates returned to editor]
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A[addBundle / addGraph] --> B{Google: People API URL?}
B -- Yes --> C[defaultGoogleHealthCheck<br/>find people.people.get op]
C -- found --> D[write healthCheck into integrationConfig]
C -- not found --> E[no default health check set]
B -- No --> E
D --> F[ctx.core.integrations.register<br/>config includes healthCheck]
E --> F
G[updateBundle / updateGraph] --> H[spread ...current config<br/>existing healthCheck preserved]
H --> I[ctx.core.integrations.update]
J[setHealthCheck] --> K[setHealthCheckOpenApi<br/>read raw config, merge key]
K --> L[write back raw config<br/>healthCheck undefined = cleared]
M[checkHealth] --> N[checkHealthOpenApi<br/>resolve binding for spec.operation]
N --> O{binding found?}
O -- Yes --> P[invoke HTTP probe]
P --> Q{HTTP status}
Q -- 2xx --> R[healthy + extract identity]
Q -- 4xx/5xx --> S[expired / degraded]
O -- No --> T[unknown: operation not found]
U[listHealthCheckCandidates] --> V[listHealthCheckCandidatesOpenApi<br/>list stored ops, reparse spec for summaries]
V --> W[ranked candidates returned to editor]
Reviews (5): Last reviewed commit: "feat: health checks for Microsoft Graph ..." | Re-trigger Greptile |
522f93b to
59fd53f
Compare
1287945 to
761118f
Compare
f87af0f to
0fdd8fe
Compare
761118f to
69d2ed8
Compare
0fdd8fe to
169e9b7
Compare
69d2ed8 to
cc3fa8e
Compare
Wire the OpenAPI health-check backing into the Microsoft Graph and Google provider plugins (both compile their spec through the OpenAPI machinery and store config in the same shape), so their connections report alive/expired + identity instead of always "unknown". Both plugins now implement the four health-check hooks by delegating to the shared OpenAPI backing, and persist a `healthCheck` field on their own config schema (so it survives the plugin's own decode). Each auto-configures a sensible default at add time: - Microsoft Graph: `GET /me` with identity `userPrincipalName` (always present on /me, unlike `mail`), when the default profile preset is selected. - Google: People API `people.get` with the required args pinned (`resourceName=people/me`, `personFields=names,emailAddresses`) and identity `emailAddresses.0.value`, when the bundle includes the People API. The user can switch the operation/identity from the now-available editor. Covered by e2e: adding a Google People bundle (against a local discovery doc) auto-writes the default identity check and projects the email field as a typed candidate. Graph's spec source is a fixed upstream URL, so its hooks + default are covered through the shared backing path and verified against a live tenant.
169e9b7 to
1327086
Compare
cc3fa8e to
2cbcd9c
Compare
Extends connection health checks to the provider plugins.
E2E:
health-checks-providers.test.ts(MCP healthy→expired + validate; Google auto-default + candidate response fields).Stacked on #1108.
Stack