Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2af8522
feat(credentials): add v2 OAuth connection APIs
TheodoreSpeaks Aug 13, 2026
f0767d3
fix(credentials): preserve active OAuth connection links
TheodoreSpeaks Aug 13, 2026
e4b09dc
fix(credentials): bind OAuth links to connection intent
TheodoreSpeaks Aug 13, 2026
e149636
feat(credentials): complete v2 credential lifecycle
TheodoreSpeaks Aug 13, 2026
7fcf26f
fix(credentials): make disconnect idempotent
TheodoreSpeaks Aug 13, 2026
cf680e6
fix(credentials): stabilize oauth draft retries
TheodoreSpeaks Aug 13, 2026
91ce49f
fix(credentials): require credential admin for deletion
TheodoreSpeaks Aug 14, 2026
bfdfa4e
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
b8d4a95
fix(credentials): bind oauth callbacks to drafts
TheodoreSpeaks Aug 14, 2026
cbe9b7b
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
75d3327
fix(credentials): fail closed on oauth completion
TheodoreSpeaks Aug 14, 2026
333fdf6
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
c9a51ae
fix(credentials): bind shopify completion to oauth state
TheodoreSpeaks Aug 14, 2026
036bfa0
fix(credentials): align custom oauth reconnects
TheodoreSpeaks Aug 14, 2026
22d845a
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
981f757
fix(credentials): centralize application authorization
TheodoreSpeaks Aug 14, 2026
135d95b
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
96ef2bd
fix(credentials): keep OAuth draft intent immutable
TheodoreSpeaks Aug 14, 2026
a3bca71
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
2cb08cd
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
b24b6c0
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
147b161
fix(credentials): allow renamed reconnect targets
TheodoreSpeaks Aug 14, 2026
7b74299
fix(credentials): close OAuth draft edge cases
TheodoreSpeaks Aug 14, 2026
d419ada
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
ae46594
fix(credentials): fail closed without breaking auth
TheodoreSpeaks Aug 14, 2026
65b2ce0
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 14, 2026
4660f65
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 15, 2026
b413183
fix(credentials): preserve migrated route behavior
TheodoreSpeaks Aug 15, 2026
035bb35
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 15, 2026
f04d2e2
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 15, 2026
dd8baef
feat(credentials): add provider search
TheodoreSpeaks Aug 15, 2026
3b3586a
Merge remote-tracking branch 'origin/staging' into feat/credential-v2…
TheodoreSpeaks Aug 15, 2026
4430cd5
fix(credentials): prevent stale secrets and drafts
TheodoreSpeaks Aug 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions .agents/skills/migrate-application-operation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,43 @@ Classify each as `migrate`, `defer`, or `non-goal`. Do not migrate adjacent oper

Preserve behavior unless the task explicitly changes it. Stop and report a decision when surfaces currently disagree on security or compatibility behavior; do not silently choose one.

## Freeze observable behavior before editing

Treat the legacy route or tool as an ordered program, not merely a bag of business logic. Before moving code, write a compact baseline for every in-scope entry point and add focused characterization tests for behavior not already pinned down.

Capture all of these when they apply:

- Accepted inputs, including trimming, blank omission, duplicate query keys, aliases, defaults, and bounds.
- Authentication and authorization order, minimum roles, resource membership, concealment, and exact error/status mapping.
- Exact success bodies, optional fields, status codes, redirects, cookies, headers, and binary or stream behavior.
- Mutation ordering, transaction boundaries, idempotency, no-ops, and observable state after each possible partial failure.
- Audit, notification, analytics, and billing timing plus exact semantic dimensions and attribution.
- Browser or protocol state ownership, concurrency isolation, expiry, callback ordering, and cleanup behavior.
- Every value newly crossing into HTML, JavaScript, SQL, URLs, logs, provider payloads, or another encoding context.

Compare the old statement order with the proposed application lifecycle explicitly:

```text
legacy parse/normalize
-> legacy authorization checks
-> branch-specific canonical lookup
-> mutation(s)
-> per-step side effects
-> response or redirect catch
```

Moving those steps under a wrapper may change behavior even when each individual call is reused. In particular:

- `projectAudit` and `afterSuccess` run only after `execute` returns. They cannot describe earlier committed mutations when a later step throws. Make the compound mutation atomic or define explicit partial-result/failure projection semantics before migrating it.
- Operation metadata is executable policy. Adding a resource role to a workspace-only legacy read is an authorization change, not an architectural cleanup.
- A shared error policy does not automatically preserve route-local concealment, subclass ordering, browser redirects, or branch-specific messages.
- A shared contract does not automatically preserve manual `URLSearchParams` normalization or exact legacy response unions.
- A shared use case may own domain behavior while separate surface presenters still preserve different wire shapes.
- Per-flow identity is insufficient when another part of the flow remains in browser-global state such as one cookie.
- Passing a newly supported parameter through old rendering code creates a new security boundary even when the renderer itself is unchanged.

Fail fast if the baseline cannot be established from code, tests, or an explicit product decision. Do not infer that behavior is unimportant because it was previously implicit.

## Keep the layers distinct

Use these responsibilities:
Expand Down Expand Up @@ -270,6 +307,10 @@ Add focused tests for every migrated surface and principal kind allowed by the o
- Public API: personal and workspace keys, rate and rollout behavior, concealment, exact external envelope, and rate headers.
- Copilot or tools: trusted context, exact registered operation membership, rejected forged scope, aliases and resume paths, permission re-check, safe errors, and unchanged tool result shapes.
- Side effects: audit derives from authoritative results; shared notifications follow audit; neither occurs for rejection or no-op.
- Compatibility characterization: legacy normalization, exact response/redirect/cookie behavior, concealment, error subclass precedence, and branch-specific output.
- Failure sequencing: inject a failure after each independently committing step and assert persisted state plus audit, analytics, and notification effects.
- Concurrency: overlap stateful browser or provider flows and prove each callback consumes only its own state and return destination.
- Rendering boundaries: exercise hostile values for every newly connected input that reaches HTML, inline JavaScript, URLs, logs, or provider requests.

Run at minimum:

Expand Down
41 changes: 41 additions & 0 deletions .claude/commands/migrate-application-operation.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,43 @@ Classify each as `migrate`, `defer`, or `non-goal`. Do not migrate adjacent oper

Preserve behavior unless the task explicitly changes it. Stop and report a decision when surfaces currently disagree on security or compatibility behavior; do not silently choose one.

## Freeze observable behavior before editing

Treat the legacy route or tool as an ordered program, not merely a bag of business logic. Before moving code, write a compact baseline for every in-scope entry point and add focused characterization tests for behavior not already pinned down.

Capture all of these when they apply:

- Accepted inputs, including trimming, blank omission, duplicate query keys, aliases, defaults, and bounds.
- Authentication and authorization order, minimum roles, resource membership, concealment, and exact error/status mapping.
- Exact success bodies, optional fields, status codes, redirects, cookies, headers, and binary or stream behavior.
- Mutation ordering, transaction boundaries, idempotency, no-ops, and observable state after each possible partial failure.
- Audit, notification, analytics, and billing timing plus exact semantic dimensions and attribution.
- Browser or protocol state ownership, concurrency isolation, expiry, callback ordering, and cleanup behavior.
- Every value newly crossing into HTML, JavaScript, SQL, URLs, logs, provider payloads, or another encoding context.

Compare the old statement order with the proposed application lifecycle explicitly:

```text
legacy parse/normalize
-> legacy authorization checks
-> branch-specific canonical lookup
-> mutation(s)
-> per-step side effects
-> response or redirect catch
```

Moving those steps under a wrapper may change behavior even when each individual call is reused. In particular:

- `projectAudit` and `afterSuccess` run only after `execute` returns. They cannot describe earlier committed mutations when a later step throws. Make the compound mutation atomic or define explicit partial-result/failure projection semantics before migrating it.
- Operation metadata is executable policy. Adding a resource role to a workspace-only legacy read is an authorization change, not an architectural cleanup.
- A shared error policy does not automatically preserve route-local concealment, subclass ordering, browser redirects, or branch-specific messages.
- A shared contract does not automatically preserve manual `URLSearchParams` normalization or exact legacy response unions.
- A shared use case may own domain behavior while separate surface presenters still preserve different wire shapes.
- Per-flow identity is insufficient when another part of the flow remains in browser-global state such as one cookie.
- Passing a newly supported parameter through old rendering code creates a new security boundary even when the renderer itself is unchanged.

Fail fast if the baseline cannot be established from code, tests, or an explicit product decision. Do not infer that behavior is unimportant because it was previously implicit.

## Keep the layers distinct

Use these responsibilities:
Expand Down Expand Up @@ -269,6 +306,10 @@ Add focused tests for every migrated surface and principal kind allowed by the o
- Public API: personal and workspace keys, rate and rollout behavior, concealment, exact external envelope, and rate headers.
- Copilot or tools: trusted context, exact registered operation membership, rejected forged scope, aliases and resume paths, permission re-check, safe errors, and unchanged tool result shapes.
- Side effects: audit derives from authoritative results; shared notifications follow audit; neither occurs for rejection or no-op.
- Compatibility characterization: legacy normalization, exact response/redirect/cookie behavior, concealment, error subclass precedence, and branch-specific output.
- Failure sequencing: inject a failure after each independently committing step and assert persisted state plus audit, analytics, and notification effects.
- Concurrency: overlap stateful browser or provider flows and prove each callback consumes only its own state and return destination.
- Rendering boundaries: exercise hostile values for every newly connected input that reaches HTML, inline JavaScript, URLs, logs, or provider requests.

Run at minimum:

Expand Down
41 changes: 41 additions & 0 deletions .cursor/commands/migrate-application-operation.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,43 @@ Classify each as `migrate`, `defer`, or `non-goal`. Do not migrate adjacent oper

Preserve behavior unless the task explicitly changes it. Stop and report a decision when surfaces currently disagree on security or compatibility behavior; do not silently choose one.

## Freeze observable behavior before editing

Treat the legacy route or tool as an ordered program, not merely a bag of business logic. Before moving code, write a compact baseline for every in-scope entry point and add focused characterization tests for behavior not already pinned down.

Capture all of these when they apply:

- Accepted inputs, including trimming, blank omission, duplicate query keys, aliases, defaults, and bounds.
- Authentication and authorization order, minimum roles, resource membership, concealment, and exact error/status mapping.
- Exact success bodies, optional fields, status codes, redirects, cookies, headers, and binary or stream behavior.
- Mutation ordering, transaction boundaries, idempotency, no-ops, and observable state after each possible partial failure.
- Audit, notification, analytics, and billing timing plus exact semantic dimensions and attribution.
- Browser or protocol state ownership, concurrency isolation, expiry, callback ordering, and cleanup behavior.
- Every value newly crossing into HTML, JavaScript, SQL, URLs, logs, provider payloads, or another encoding context.

Compare the old statement order with the proposed application lifecycle explicitly:

```text
legacy parse/normalize
-> legacy authorization checks
-> branch-specific canonical lookup
-> mutation(s)
-> per-step side effects
-> response or redirect catch
```

Moving those steps under a wrapper may change behavior even when each individual call is reused. In particular:

- `projectAudit` and `afterSuccess` run only after `execute` returns. They cannot describe earlier committed mutations when a later step throws. Make the compound mutation atomic or define explicit partial-result/failure projection semantics before migrating it.
- Operation metadata is executable policy. Adding a resource role to a workspace-only legacy read is an authorization change, not an architectural cleanup.
- A shared error policy does not automatically preserve route-local concealment, subclass ordering, browser redirects, or branch-specific messages.
- A shared contract does not automatically preserve manual `URLSearchParams` normalization or exact legacy response unions.
- A shared use case may own domain behavior while separate surface presenters still preserve different wire shapes.
- Per-flow identity is insufficient when another part of the flow remains in browser-global state such as one cookie.
- Passing a newly supported parameter through old rendering code creates a new security boundary even when the renderer itself is unchanged.

Fail fast if the baseline cannot be established from code, tests, or an explicit product decision. Do not infer that behavior is unimportant because it was previously implicit.

## Keep the layers distinct

Use these responsibilities:
Expand Down Expand Up @@ -265,6 +302,10 @@ Add focused tests for every migrated surface and principal kind allowed by the o
- Public API: personal and workspace keys, rate and rollout behavior, concealment, exact external envelope, and rate headers.
- Copilot or tools: trusted context, exact registered operation membership, rejected forged scope, aliases and resume paths, permission re-check, safe errors, and unchanged tool result shapes.
- Side effects: audit derives from authoritative results; shared notifications follow audit; neither occurs for rejection or no-op.
- Compatibility characterization: legacy normalization, exact response/redirect/cookie behavior, concealment, error subclass precedence, and branch-specific output.
- Failure sequencing: inject a failure after each independently committing step and assert persisted state plus audit, analytics, and notification effects.
- Concurrency: overlap stateful browser or provider flows and prove each callback consumes only its own state and return destination.
- Rendering boundaries: exercise hostile values for every newly connected input that reaches HTML, inline JavaScript, URLs, logs, or provider requests.

Run at minimum:

Expand Down
1 change: 0 additions & 1 deletion apps/docs/content/docs/en/integrations/logrocket.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -188,4 +188,3 @@ Register a release version in LogRocket so uploaded source maps can decode stack
| --------- | ---- | ----------- |
| `version` | string | Release version that was registered |


2 changes: 1 addition & 1 deletion apps/docs/openapi-v2-billing.json
Original file line number Diff line number Diff line change
Expand Up @@ -479,7 +479,7 @@
"description": "Human-readable explanation of the error."
},
"details": {
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `CREDENTIAL_ADMIN_ACCESS_REQUIRED` — The caller can reach the workspace but cannot administer this credential.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
}
},
"required": ["code", "message"],
Expand Down
Loading
Loading