@portpowered/reference-data 0.4.10 → 0.4.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/generated/capabilities.json +288 -7
  2. package/generated/guides.json +4 -4
  3. package/generated/openapi.json +285 -11
  4. package/generated/public/docs/for-ai/api-catalog.md +2 -1
  5. package/generated/public/docs/for-ai/capability-interfaces/media-player/1.0.md +1 -0
  6. package/generated/public/docs/for-ai/capability-interfaces/reminders-provider/1.0.md +8 -2
  7. package/generated/public/docs/for-ai/guides/authentication-and-dcr.md +26 -4
  8. package/generated/public/docs/for-ai/guides/oauth-consent-and-callback.md +23 -1
  9. package/generated/public/docs/for-ai/guides/oauth-discovery.md +2 -2
  10. package/generated/public/docs/for-ai/guides/oauth-token-lifecycle.md +1 -1
  11. package/generated/public/docs/for-ai/operations/beginOAuthAuthorization.md +3 -3
  12. package/generated/public/docs/for-ai/operations/completeOAuthConsent.md +5 -2
  13. package/generated/public/docs/for-ai/operations/deliverOAuthAuthorizationResponse.md +74 -0
  14. package/generated/public/docs/for-ai/operations/index.md +1 -0
  15. package/generated/public/docs/for-ai/schemas/m-1.md +1 -1
  16. package/generated/public/docs/for-ai/schemas/m-2.md +1 -0
  17. package/generated/public/docs/for-ai/schemas/r-1.md +7 -7
  18. package/generated/public/docs/for-ai/schemas/r-2.md +7 -0
  19. package/generated/public/docs/for-ai/schemas.md +4 -4
  20. package/generated/public/docs/references/authorization.json +9 -0
  21. package/generated/public/docs/references/authorization.yaml +7 -0
  22. package/generated/public/docs/references/capability-interfaces/media-player/1.0/attributes/now-playing.yaml +7 -0
  23. package/generated/public/docs/references/capability-interfaces/media-player/1.0/messages/transfer-playback.yaml +10 -0
  24. package/generated/public/docs/references/capability-interfaces/media-player/1.0.yaml +26 -0
  25. package/generated/public/docs/references/capability-interfaces/media-player.yaml +26 -0
  26. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder-response.yaml +33 -0
  27. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder.yaml +20 -0
  28. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder-response.yaml +4 -0
  29. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder.yaml +16 -0
  30. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders-response.yaml +34 -2
  31. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders.yaml +17 -1
  32. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder-response.yaml +33 -0
  33. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder.yaml +26 -0
  34. package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0.yaml +202 -4
  35. package/generated/public/docs/references/capability-interfaces/reminders-provider.yaml +202 -4
  36. package/generated/public/docs/references/manifest.json +206 -74
  37. package/generated/public/docs/references/openapi.yaml +237 -8
  38. package/generated/public/docs/references/schemas/MediaPlayerInterfaceNowPlayingAttribute.json +5 -0
  39. package/generated/public/docs/references/schemas/MediaPlayerInterfaceTransferPlaybackMessage.json +11 -0
  40. package/generated/public/docs/references/schemas/Reminder.json +33 -0
  41. package/generated/public/docs/references/schemas/RemindersProviderInterfaceCreateReminderMessage.json +31 -0
  42. package/generated/public/docs/references/schemas/RemindersProviderInterfaceCreateReminderResponseMessage.json +20 -0
  43. package/generated/public/docs/references/schemas/RemindersProviderInterfaceDeleteReminderMessage.json +28 -0
  44. package/generated/public/docs/references/schemas/RemindersProviderInterfaceDeleteReminderResponseMessage.json +12 -0
  45. package/generated/public/docs/references/schemas/RemindersProviderInterfaceListRemindersMessage.json +23 -2
  46. package/generated/public/docs/references/schemas/RemindersProviderInterfaceListRemindersResponseMessage.json +15 -4
  47. package/generated/public/docs/references/schemas/RemindersProviderInterfaceUpdateReminderMessage.json +39 -0
  48. package/generated/public/docs/references/schemas/RemindersProviderInterfaceUpdateReminderResponseMessage.json +20 -0
  49. package/generated/public/docs/references/schemas/index.json +48 -0
  50. package/generated/resources/media-player/message-transfer-playback.json +5 -0
  51. package/generated/resources/media-player/state-now-playing.json +5 -0
  52. package/generated/resources/reminders-provider/message-create-reminder-response.json +44 -0
  53. package/generated/resources/reminders-provider/message-create-reminder.json +25 -0
  54. package/generated/resources/reminders-provider/message-delete-reminder-response.json +6 -0
  55. package/generated/resources/reminders-provider/message-delete-reminder.json +22 -0
  56. package/generated/resources/reminders-provider/message-list-reminders-response.json +44 -3
  57. package/generated/resources/reminders-provider/message-list-reminders.json +23 -2
  58. package/generated/resources/reminders-provider/message-update-reminder-response.json +44 -0
  59. package/generated/resources/reminders-provider/message-update-reminder.json +33 -0
  60. package/package.json +1 -1
@@ -7835,12 +7835,12 @@
7835
7835
  {
7836
7836
  "in": "query",
7837
7837
  "name": "resource",
7838
- "required": true,
7838
+ "required": false,
7839
7839
  "schema": {
7840
7840
  "type": "string",
7841
7841
  "format": "uri"
7842
7842
  },
7843
- "description": "Canonical issuer for REST or issuer/mcp for MCP; discover rather than guess."
7843
+ "description": "Canonical issuer for REST or issuer/mcp for MCP. Omission defaults to REST."
7844
7844
  },
7845
7845
  {
7846
7846
  "in": "query",
@@ -7863,7 +7863,7 @@
7863
7863
  }
7864
7864
  ],
7865
7865
  "responses": {
7866
- "303": {
7866
+ "302": {
7867
7867
  "description": "Navigate to sign-in and pending consent.",
7868
7868
  "headers": {
7869
7869
  "Location": {
@@ -7924,7 +7924,7 @@
7924
7924
  },
7925
7925
  "responses": {
7926
7926
  "200": {
7927
- "description": "Callback navigation URL containing code or denial and original state.",
7927
+ "description": "One-time browser continuation URL. Navigate the browser to receive a 302 to the registered callback.",
7928
7928
  "content": {
7929
7929
  "application/json": {
7930
7930
  "schema": {
@@ -7940,7 +7940,7 @@
7940
7940
  }
7941
7941
  },
7942
7942
  "example": {
7943
- "redirect_url": "http://127.0.0.1:8765/callback?code=SERVER_ISSUED_CODE&state=ORIGINAL_STATE"
7943
+ "redirect_url": "https://portos-pilot-api-685761720421.us-west1.run.app/oauth/authorization-response?request_id=SERVER_ISSUED_RESPONSE_ID"
7944
7944
  }
7945
7945
  }
7946
7946
  }
@@ -8036,6 +8036,57 @@
8036
8036
  }
8037
8037
  }
8038
8038
  },
8039
+ "/oauth/authorization-response": {
8040
+ "get": {
8041
+ "operationId": "deliverOAuthAuthorizationResponse",
8042
+ "tags": [
8043
+ "Auth"
8044
+ ],
8045
+ "security": [],
8046
+ "x-portos-resource-permission": false,
8047
+ "x-portos-delegated": false,
8048
+ "summary": "Redirect the browser to the approved OAuth callback",
8049
+ "description": "Navigate the browser here using the continuation returned by authenticated\nconsent. The opaque reference expires after two minutes and is consumed once.\nThe server chooses the stored callback; caller-supplied redirect destinations\nare never used. Approval carries code, original state and issuer; denial\ncarries access_denied, original state and issuer. No bearer token is needed.\n",
8050
+ "parameters": [
8051
+ {
8052
+ "in": "query",
8053
+ "name": "request_id",
8054
+ "required": true,
8055
+ "schema": {
8056
+ "type": "string"
8057
+ }
8058
+ }
8059
+ ],
8060
+ "responses": {
8061
+ "302": {
8062
+ "description": "Navigate with GET to the exact registered callback.",
8063
+ "headers": {
8064
+ "Location": {
8065
+ "schema": {
8066
+ "type": "string",
8067
+ "format": "uri"
8068
+ }
8069
+ },
8070
+ "Cache-Control": {
8071
+ "schema": {
8072
+ "type": "string"
8073
+ },
8074
+ "description": "no-store"
8075
+ },
8076
+ "Referrer-Policy": {
8077
+ "schema": {
8078
+ "type": "string"
8079
+ },
8080
+ "description": "no-referrer"
8081
+ }
8082
+ }
8083
+ },
8084
+ "400": {
8085
+ "description": "Missing, wrong-stage, expired or consumed continuation reference."
8086
+ }
8087
+ }
8088
+ }
8089
+ },
8039
8090
  "/oauth/validate-request": {
8040
8091
  "post": {
8041
8092
  "operationId": "validateOAuthRequest",
@@ -13361,6 +13412,16 @@
13361
13412
  "type": "object",
13362
13413
  "additionalProperties": false
13363
13414
  },
13415
+ "MediaPlayerInterfaceTransferPlaybackMessage": {
13416
+ "x-namespace": "port1/systems/zero/capability-interfaces/media-player",
13417
+ "x-name": "transfer-playback",
13418
+ "x-version": "1.0",
13419
+ "x-type": "message",
13420
+ "x-directionality": "in",
13421
+ "description": "Move the current playback session of the destination route's connected provider account to this one destination, preserving playing or paused state and media context. Select an advertised destination route. This affects that account's current session; it does not copy media, restart playback, transfer between providers or accounts, or fan out to group members. Read fresh source and destination state before and after dispatch to verify the move. An unavailable target requires an explicit choice of another destination.",
13422
+ "type": "object",
13423
+ "additionalProperties": false
13424
+ },
13364
13425
  "MediaPlayerInterfaceSearchAndPlayMessage": {
13365
13426
  "x-namespace": "port1/systems/zero/capability-interfaces/media-player",
13366
13427
  "x-name": "search-and-play",
@@ -16706,36 +16767,212 @@
16706
16767
  ],
16707
16768
  "additionalProperties": false
16708
16769
  },
16770
+ "RemindersProviderInterfaceCreateReminderMessage": {
16771
+ "title": "RemindersProviderInterfaceCreateReminderMessage",
16772
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16773
+ "x-name": "create-reminder",
16774
+ "x-version": "1.0",
16775
+ "x-type": "message",
16776
+ "x-directionality": "in",
16777
+ "description": "Create a reminder in a discovered list. Creation is sent once; refresh before retrying an uncertain result.",
16778
+ "type": "object",
16779
+ "additionalProperties": false,
16780
+ "properties": {
16781
+ "listId": {
16782
+ "type": "string",
16783
+ "minLength": 1,
16784
+ "description": "Discovered list identifier."
16785
+ },
16786
+ "title": {
16787
+ "type": "string",
16788
+ "minLength": 1,
16789
+ "description": "Reminder title."
16790
+ },
16791
+ "notes": {
16792
+ "type": "string"
16793
+ }
16794
+ },
16795
+ "required": [
16796
+ "listId",
16797
+ "title"
16798
+ ]
16799
+ },
16800
+ "RemindersProviderInterfaceCreateReminderResponseMessage": {
16801
+ "title": "RemindersProviderInterfaceCreateReminderResponseMessage",
16802
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16803
+ "x-name": "create-reminder-response",
16804
+ "x-version": "1.0",
16805
+ "x-type": "message",
16806
+ "x-directionality": "out",
16807
+ "description": "The provider accepted the reminder change.",
16808
+ "type": "object",
16809
+ "additionalProperties": false,
16810
+ "properties": {
16811
+ "reminder": {
16812
+ "$ref": "#/components/schemas/Reminder"
16813
+ }
16814
+ },
16815
+ "required": [
16816
+ "reminder"
16817
+ ]
16818
+ },
16819
+ "RemindersProviderInterfaceUpdateReminderMessage": {
16820
+ "title": "RemindersProviderInterfaceUpdateReminderMessage",
16821
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16822
+ "x-name": "update-reminder",
16823
+ "x-version": "1.0",
16824
+ "x-type": "message",
16825
+ "x-directionality": "in",
16826
+ "description": "Edit a reminder using its last observed revision; omitted fields are preserved.",
16827
+ "type": "object",
16828
+ "additionalProperties": false,
16829
+ "properties": {
16830
+ "reminderId": {
16831
+ "type": "string",
16832
+ "minLength": 1,
16833
+ "description": "Reminder identifier."
16834
+ },
16835
+ "revision": {
16836
+ "type": "string",
16837
+ "minLength": 1,
16838
+ "description": "Revision from the latest listing."
16839
+ },
16840
+ "title": {
16841
+ "type": "string",
16842
+ "minLength": 1,
16843
+ "description": "Replacement title."
16844
+ },
16845
+ "notes": {
16846
+ "type": "string"
16847
+ },
16848
+ "completed": {
16849
+ "type": "boolean"
16850
+ }
16851
+ },
16852
+ "required": [
16853
+ "reminderId",
16854
+ "revision"
16855
+ ]
16856
+ },
16857
+ "RemindersProviderInterfaceUpdateReminderResponseMessage": {
16858
+ "title": "RemindersProviderInterfaceUpdateReminderResponseMessage",
16859
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16860
+ "x-name": "update-reminder-response",
16861
+ "x-version": "1.0",
16862
+ "x-type": "message",
16863
+ "x-directionality": "out",
16864
+ "description": "The provider accepted the reminder change.",
16865
+ "type": "object",
16866
+ "additionalProperties": false,
16867
+ "properties": {
16868
+ "reminder": {
16869
+ "$ref": "#/components/schemas/Reminder"
16870
+ }
16871
+ },
16872
+ "required": [
16873
+ "reminder"
16874
+ ]
16875
+ },
16876
+ "RemindersProviderInterfaceDeleteReminderMessage": {
16877
+ "title": "RemindersProviderInterfaceDeleteReminderMessage",
16878
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16879
+ "x-name": "delete-reminder",
16880
+ "x-version": "1.0",
16881
+ "x-type": "message",
16882
+ "x-directionality": "in",
16883
+ "description": "Soft-delete a reminder using its last observed revision.",
16884
+ "type": "object",
16885
+ "additionalProperties": false,
16886
+ "properties": {
16887
+ "reminderId": {
16888
+ "type": "string",
16889
+ "minLength": 1,
16890
+ "description": "Reminder identifier."
16891
+ },
16892
+ "revision": {
16893
+ "type": "string",
16894
+ "minLength": 1,
16895
+ "description": "Revision from the latest listing."
16896
+ }
16897
+ },
16898
+ "required": [
16899
+ "reminderId",
16900
+ "revision"
16901
+ ]
16902
+ },
16903
+ "RemindersProviderInterfaceDeleteReminderResponseMessage": {
16904
+ "title": "RemindersProviderInterfaceDeleteReminderResponseMessage",
16905
+ "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16906
+ "x-name": "delete-reminder-response",
16907
+ "x-version": "1.0",
16908
+ "x-type": "message",
16909
+ "x-directionality": "out",
16910
+ "description": "The provider accepted soft deletion of the reminder.",
16911
+ "type": "object",
16912
+ "additionalProperties": false
16913
+ },
16709
16914
  "RemindersProviderInterfaceListRemindersMessage": {
16915
+ "title": "RemindersProviderInterfaceListRemindersMessage",
16710
16916
  "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16711
16917
  "x-name": "list-reminders",
16712
16918
  "x-version": "1.0",
16713
16919
  "x-type": "message",
16714
16920
  "x-directionality": "in",
16715
- "description": "Request to list reminders from a reminders provider",
16921
+ "description": "List reminder lists and their reminders. Omit listId to enumerate all lists.",
16716
16922
  "type": "object",
16717
- "additionalProperties": false
16923
+ "additionalProperties": false,
16924
+ "properties": {
16925
+ "listId": {
16926
+ "type": "string",
16927
+ "minLength": 1,
16928
+ "description": "List identifier from a previous listing."
16929
+ },
16930
+ "includeCompleted": {
16931
+ "type": "boolean",
16932
+ "default": false
16933
+ },
16934
+ "cursor": {
16935
+ "type": "string",
16936
+ "description": "Opaque next-page cursor."
16937
+ },
16938
+ "maxResults": {
16939
+ "type": "integer",
16940
+ "minimum": 1,
16941
+ "maximum": 1000
16942
+ }
16943
+ }
16718
16944
  },
16719
16945
  "RemindersProviderInterfaceListRemindersResponseMessage": {
16946
+ "title": "RemindersProviderInterfaceListRemindersResponseMessage",
16720
16947
  "x-namespace": "port1/systems/zero/capability-interfaces/reminders-provider",
16721
16948
  "x-name": "list-reminders-response",
16722
16949
  "x-version": "1.0",
16723
16950
  "x-type": "message",
16724
16951
  "x-directionality": "out",
16725
- "description": "Response containing a list of reminder lists from a reminders provider",
16952
+ "description": "Reminder lists and one bounded page of reminders.",
16726
16953
  "type": "object",
16954
+ "additionalProperties": false,
16727
16955
  "properties": {
16728
16956
  "reminderLists": {
16729
16957
  "type": "array",
16730
16958
  "items": {
16731
16959
  "$ref": "#/components/schemas/ReminderList"
16732
16960
  }
16961
+ },
16962
+ "reminders": {
16963
+ "type": "array",
16964
+ "items": {
16965
+ "$ref": "#/components/schemas/Reminder"
16966
+ }
16967
+ },
16968
+ "nextCursor": {
16969
+ "type": "string"
16733
16970
  }
16734
16971
  },
16735
16972
  "required": [
16736
- "reminderLists"
16737
- ],
16738
- "additionalProperties": false
16973
+ "reminderLists",
16974
+ "reminders"
16975
+ ]
16739
16976
  },
16740
16977
  "ControlRouteGroupsProviderInterfaceCreateGroupMessage": {
16741
16978
  "x-namespace": "port1/systems/zero/capability-interfaces/control-route-groups-provider",
@@ -18155,6 +18392,11 @@
18155
18392
  },
18156
18393
  "name": {
18157
18394
  "type": "string"
18395
+ },
18396
+ "positionMs": {
18397
+ "description": "Provider-observed position within the current media item in milliseconds. Omitted when unknown. Compare fresh observations with media identity and playback state; a track transition does not prove continuity.",
18398
+ "type": "integer",
18399
+ "minimum": 0
18158
18400
  }
18159
18401
  },
18160
18402
  "required": [
@@ -28381,6 +28623,38 @@
28381
28623
  "albumId"
28382
28624
  ]
28383
28625
  },
28626
+ "Reminder": {
28627
+ "type": "object",
28628
+ "additionalProperties": false,
28629
+ "description": "A reminder and its current provider revision for guarded edits.",
28630
+ "properties": {
28631
+ "reminderId": {
28632
+ "type": "string"
28633
+ },
28634
+ "listId": {
28635
+ "type": "string"
28636
+ },
28637
+ "title": {
28638
+ "type": "string"
28639
+ },
28640
+ "notes": {
28641
+ "type": "string"
28642
+ },
28643
+ "completed": {
28644
+ "type": "boolean"
28645
+ },
28646
+ "revision": {
28647
+ "type": "string",
28648
+ "description": "Omitted when the provider does not supply a revision; writes require it."
28649
+ }
28650
+ },
28651
+ "required": [
28652
+ "reminderId",
28653
+ "listId",
28654
+ "title",
28655
+ "completed"
28656
+ ]
28657
+ },
28384
28658
  "ReminderList": {
28385
28659
  "type": "object",
28386
28660
  "description": "A reminder list",
@@ -84,7 +84,8 @@ To request the complete rendered catalog, fetch `/api/?full=1` with an HTML-comp
84
84
  | [GET /oauth-clients](/docs/for-ai/operations/enumerateOAuthClients.md) | OAuth (no scope) | query:nextToken, query:maxResults, query:expand | — |
85
85
  | [POST /oauth-clients](/docs/for-ai/operations/createOAuthClient.md) | OAuth (no scope) | — | allowedOrigins, clientName, clientUri, clientUriLocalized, contacts, grantTypes, jwks, jwksUri, logoUri, logoUriLocalized, policyUri, policyUriLocalized, redirectUris, responseTypes, scope, scopes, softwareId, softwareVersion, tokenEndpointAuthMethod, tokenEndpointAuthSigningAlg, tosUri, tosUriLocalized |
86
86
  | [GET /oauth/authorization-request](/docs/for-ai/operations/getPendingOAuthConsent.md) | See session/security contract | query:request_id (required) | — |
87
- | [GET /oauth/authorize](/docs/for-ai/operations/beginOAuthAuthorization.md) | Public | query:client_id (required), query:redirect_uri (required), query:response_type (required), query:scope (required), query:state (required), query:resource (required), query:code_challenge (required), query:code_challenge_method (required) | — |
87
+ | [GET /oauth/authorization-response](/docs/for-ai/operations/deliverOAuthAuthorizationResponse.md) | Public | query:request_id (required) | — |
88
+ | [GET /oauth/authorize](/docs/for-ai/operations/beginOAuthAuthorization.md) | Public | query:client_id (required), query:redirect_uri (required), query:response_type (required), query:scope (required), query:state (required), query:resource, query:code_challenge (required), query:code_challenge_method (required) | — |
88
89
  | [POST /oauth/authorize](/docs/for-ai/operations/completeOAuthConsent.md) | See session/security contract | — | approved, request_id, scope |
89
90
  | [POST /oauth/authorize-device](/docs/for-ai/operations/authorizeDevice.md) | OAuth (no scope) | — | scopes, user_code |
90
91
  | [POST /oauth/generate-code](/docs/for-ai/operations/generateOAuthCode.md) | OAuth (no scope) | — | client_id, code_challenge, code_challenge_method, redirect_uri, scopes, state |
@@ -27,6 +27,7 @@ Read scopes: endpoint:read. Inbound control scope: message:send. Resource permis
27
27
  - [skip-forward](/docs/references/capability-interfaces/media-player/1.0/messages/skip-forward.yaml) (in): Use this exact payload schema.
28
28
  - [start-over](/docs/references/capability-interfaces/media-player/1.0/messages/start-over.yaml) (in): Use this exact payload schema.
29
29
  - [stop](/docs/references/capability-interfaces/media-player/1.0/messages/stop.yaml) (in): Use this exact payload schema.
30
+ - [transfer-playback](/docs/references/capability-interfaces/media-player/1.0/messages/transfer-playback.yaml) (in): Move the current playback session of the destination route's connected provider account to this one destination, preserving playing or paused state and media context. Select an advertised destination route. This affects that account's current session; it does not copy media, restart playback, transfer between providers or accounts, or fan out to group members. Read fresh source and destination state before and after dispatch to verify the move. An unavailable target requires an explicit choice of another destination.
30
31
 
31
32
  ## State attributes
32
33
 
@@ -10,8 +10,14 @@ Read scopes: endpoint:read. Inbound control scope: message:send. Resource permis
10
10
 
11
11
  ## Messages
12
12
 
13
- - [list-reminders](/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders.yaml) (in): Request to list reminders from a reminders provider
14
- - [list-reminders-response](/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders-response.yaml) (out): Response containing a list of reminder lists from a reminders provider
13
+ - [create-reminder](/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder.yaml) (in): Create a reminder in a discovered list. Creation is sent once; refresh before retrying an uncertain result.
14
+ - [create-reminder-response](/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder-response.yaml) (out): The provider accepted the reminder change.
15
+ - [delete-reminder](/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder.yaml) (in): Soft-delete a reminder using its last observed revision.
16
+ - [delete-reminder-response](/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder-response.yaml) (out): The provider accepted soft deletion of the reminder.
17
+ - [list-reminders](/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders.yaml) (in): List reminder lists and their reminders. Omit listId to enumerate all lists.
18
+ - [list-reminders-response](/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders-response.yaml) (out): Reminder lists and one bounded page of reminders.
19
+ - [update-reminder](/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder.yaml) (in): Edit a reminder using its last observed revision; omitted fields are preserved.
20
+ - [update-reminder-response](/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder-response.yaml) (out): The provider accepted the reminder change.
15
21
 
16
22
  ## State attributes
17
23
 
@@ -27,7 +27,7 @@ This discovery step is shared by every client. The deployed pilot API is https:/
27
27
 
28
28
  An MCP connector can start at https://api.portoperatingsystem.lol/mcp and follow its WWW-Authenticate resource_metadata URL. Fetch that public metadata and the authorization server it names. MCP initialization alone does not prove that the account's devices are accessible. Never use a REST token on MCP or an MCP token on REST.
29
29
 
30
- Choose the transport before authorizing. Keep its resource unchanged through authorization, token exchange and refresh. If a REST request fails because you authorized the MCP resource (or the reverse), obtain a new user authorization for the correct resource. Refresh cannot change the token's audience.
30
+ Choose the transport before authorizing. Omitting resource at authorization selects REST. Supply the discovered resource explicitly to select MCP. Code exchange and refresh may omit resource and inherit the grant audience; an explicit resource must stay unchanged. If a REST request fails because you authorized the MCP resource (or the reverse), obtain a new user authorization for the correct resource. Refresh cannot change the token's audience.
31
31
 
32
32
  Choose one supported [client registration method](/docs/for-ai/guides/oauth-client-registration.md), then follow the same [consent and callback steps](/docs/for-ai/guides/oauth-consent-and-callback.md). If metadata omits registration_endpoint, new DCR registration is unavailable; do not guess a replacement endpoint or silently switch to another client's credentials.
33
33
 
@@ -45,7 +45,7 @@ const resource = authorizationServer.issuer;
45
45
  const apiBase = authorizationServer.issuer;
46
46
  ```
47
47
 
48
- For MCP, assign `resource` from the protected-resource metadata's `resource` field instead. Do not replace either value with the hostname you started from. A wrong `resource` can produce an `invalid_request` error callback even when client registration succeeded.
48
+ For MCP, assign `resource` from the protected-resource metadata's `resource` field instead. Do not replace either value with the hostname you started from. A wrong `resource` can produce an `invalid_target` error callback even when client registration succeeded.
49
49
 
50
50
  Canonical component: [Discover the OAuth server and choose REST or MCP](/docs/for-ai/guides/oauth-discovery.md).
51
51
 
@@ -81,6 +81,8 @@ Canonical component: [Register an OAuth client with DCR or CIMD](/docs/for-ai/gu
81
81
 
82
82
  Use the endpoints and resource from [discovery](/docs/for-ai/guides/oauth-discovery.md) and the client ID and exact callback from [registration](/docs/for-ai/guides/oauth-client-registration.md). These steps are identical for DCR and CIMD, REST and MCP; the chosen resource is the transport-specific input.
83
83
 
84
+ `resource` is optional. Omitting it selects the canonical REST audience (the authorization-server issuer). For MCP, supply its discovered `/mcp` resource explicitly. Token exchange and refresh can omit `resource` and inherit the audience bound to the authorization code or refresh token. Explicit mismatches are rejected as `invalid_target`.
85
+
84
86
  1. Start the callback handler the client controls. For a loopback callback, bind its listener locally before opening authorization.
85
87
  2. Generate a cryptographically random PKCE verifier of 43–128 permitted characters. Compute code_challenge = BASE64URL(SHA256(verifier)), without padding. Generate a separate random state and retain both in this authorization attempt.
86
88
  3. Open the discovered authorization_endpoint with the following query parameters. Percent-encode parameter values; do not append raw callback URLs or scopes into an unescaped query.
@@ -117,7 +119,27 @@ authorizationURL.search = new URLSearchParams({
117
119
 
118
120
  The user signs in on Port OS and reviews the requested permissions. Pause for the user; an agent must not approve its own grant, request passwords or manufacture a production sign-in identity. Local functional tests substitute an existing signed fixture identity at this boundary without changing production sign-in.
119
121
 
120
- After approval, Port OS navigates to the exact callback with code, state and iss. Reject a callback whose state or issuer does not match this attempt. Treat an error callback as a denied or failed authorization, not a code. Codes and pending consent expire after ten minutes and are single-use. Do not paste codes or credentials into shared chat or logs. Continue with [code exchange and token lifecycle](/docs/for-ai/guides/oauth-token-lifecycle.md).
122
+ After approval, the consent page navigates to a one-time Port OS continuation.
123
+ That endpoint returns HTTP 302 Found with the exact registered callback in
124
+ Location, carrying code, original state and iss. Denial uses the same 302 handoff
125
+ with access_denied instead of a code. The authenticated consent fetch returns
126
+ 200 JSON only for the intermediate continuation; it must be followed by document
127
+ navigation, not another fetch. Continuations expire after two minutes and are
128
+ single-use. They require no login token and cannot be used to approve consent.
129
+
130
+ Reject a callback whose state or issuer does not match this attempt. Treat an
131
+ error callback as a denied or failed authorization, not a code. Codes and pending
132
+ consent expire after ten minutes and are single-use. Do not paste codes,
133
+ continuation references or credentials into shared chat or logs. Continue with
134
+ [code exchange and token lifecycle](/docs/for-ai/guides/oauth-token-lifecycle.md).
135
+
136
+ For hosted-client acceptance, preserve the browser network log and approve a
137
+ fresh request. Verify the document request to /oauth/authorization-response
138
+ returns 302, the next GET reaches the registered client callback, and the client
139
+ posts its code and original PKCE verifier to the discovered token endpoint.
140
+ Repeat with Deny and verify access_denied without a code. Backend functional and
141
+ website browser tests cover these boundaries against an isolated callback;
142
+ compatibility with a specific hosted client still requires that live trace.
121
143
 
122
144
  Canonical component: [Obtain user consent and validate the OAuth callback](/docs/for-ai/guides/oauth-consent-and-callback.md).
123
145
 
@@ -151,7 +173,7 @@ const tokens = await tokenResponse.json(); // Store securely; do not print token
151
173
 
152
174
  Save access_token, refresh_token and returned scope in the connector's secure credential store. Public clients have no client secret. Use Authorization: Bearer <access_token> with REST requests or the MCP HTTP connection, according to that token's resource. A refresh token is never an API credential. [Scopes bound access; resource policies still apply](/docs/for-ai/guides/authorization-rules.md).
153
175
 
154
- Refresh with grant_type=refresh_token, client_id, refresh_token and the original resource at token_endpoint. Scope may stay the same or narrow; it cannot expand. Credentials rotate: store the newly returned refresh token atomically and stop using the previous one. A revoked or reused refresh token must not be retried in a loop. Reauthorize when the grant no longer permits the intended operation.
176
+ Refresh with grant_type=refresh_token, client_id and refresh_token at token_endpoint. The resource parameter is optional for code exchange and refresh: omission inherits the existing grant audience; if supplied, it must match the original resource. Scope may stay the same or narrow; it cannot expand. Credentials rotate: store the newly returned refresh token atomically and stop using the previous one. A revoked or reused refresh token must not be retried in a loop. Reauthorize when the grant no longer permits the intended operation.
155
177
 
156
178
  Revoke by POSTing application/x-www-form-urlencoded token=<refresh_token>&client_id=<client_id> to revocation_endpoint. Revoked grants stop authorizing both access and refresh requests. Removing a local configuration file alone is not server-side revocation.
157
179
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  Use the endpoints and resource from [discovery](/docs/for-ai/guides/oauth-discovery.md) and the client ID and exact callback from [registration](/docs/for-ai/guides/oauth-client-registration.md). These steps are identical for DCR and CIMD, REST and MCP; the chosen resource is the transport-specific input.
4
4
 
5
+ `resource` is optional. Omitting it selects the canonical REST audience (the authorization-server issuer). For MCP, supply its discovered `/mcp` resource explicitly. Token exchange and refresh can omit `resource` and inherit the audience bound to the authorization code or refresh token. Explicit mismatches are rejected as `invalid_target`.
6
+
5
7
  1. Start the callback handler the client controls. For a loopback callback, bind its listener locally before opening authorization.
6
8
  2. Generate a cryptographically random PKCE verifier of 43–128 permitted characters. Compute code_challenge = BASE64URL(SHA256(verifier)), without padding. Generate a separate random state and retain both in this authorization attempt.
7
9
  3. Open the discovered authorization_endpoint with the following query parameters. Percent-encode parameter values; do not append raw callback URLs or scopes into an unescaped query.
@@ -38,4 +40,24 @@ authorizationURL.search = new URLSearchParams({
38
40
 
39
41
  The user signs in on Port OS and reviews the requested permissions. Pause for the user; an agent must not approve its own grant, request passwords or manufacture a production sign-in identity. Local functional tests substitute an existing signed fixture identity at this boundary without changing production sign-in.
40
42
 
41
- After approval, Port OS navigates to the exact callback with code, state and iss. Reject a callback whose state or issuer does not match this attempt. Treat an error callback as a denied or failed authorization, not a code. Codes and pending consent expire after ten minutes and are single-use. Do not paste codes or credentials into shared chat or logs. Continue with [code exchange and token lifecycle](/docs/for-ai/guides/oauth-token-lifecycle.md).
43
+ After approval, the consent page navigates to a one-time Port OS continuation.
44
+ That endpoint returns HTTP 302 Found with the exact registered callback in
45
+ Location, carrying code, original state and iss. Denial uses the same 302 handoff
46
+ with access_denied instead of a code. The authenticated consent fetch returns
47
+ 200 JSON only for the intermediate continuation; it must be followed by document
48
+ navigation, not another fetch. Continuations expire after two minutes and are
49
+ single-use. They require no login token and cannot be used to approve consent.
50
+
51
+ Reject a callback whose state or issuer does not match this attempt. Treat an
52
+ error callback as a denied or failed authorization, not a code. Codes and pending
53
+ consent expire after ten minutes and are single-use. Do not paste codes,
54
+ continuation references or credentials into shared chat or logs. Continue with
55
+ [code exchange and token lifecycle](/docs/for-ai/guides/oauth-token-lifecycle.md).
56
+
57
+ For hosted-client acceptance, preserve the browser network log and approve a
58
+ fresh request. Verify the document request to /oauth/authorization-response
59
+ returns 302, the next GET reaches the registered client callback, and the client
60
+ posts its code and original PKCE verifier to the discovered token endpoint.
61
+ Repeat with Deny and verify access_denied without a code. Backend functional and
62
+ website browser tests cover these boundaries against an isolated callback;
63
+ compatibility with a specific hosted client still requires that live trace.
@@ -9,7 +9,7 @@ This discovery step is shared by every client. The deployed pilot API is https:/
9
9
 
10
10
  An MCP connector can start at https://api.portoperatingsystem.lol/mcp and follow its WWW-Authenticate resource_metadata URL. Fetch that public metadata and the authorization server it names. MCP initialization alone does not prove that the account's devices are accessible. Never use a REST token on MCP or an MCP token on REST.
11
11
 
12
- Choose the transport before authorizing. Keep its resource unchanged through authorization, token exchange and refresh. If a REST request fails because you authorized the MCP resource (or the reverse), obtain a new user authorization for the correct resource. Refresh cannot change the token's audience.
12
+ Choose the transport before authorizing. Omitting resource at authorization selects REST. Supply the discovered resource explicitly to select MCP. Code exchange and refresh may omit resource and inherit the grant audience; an explicit resource must stay unchanged. If a REST request fails because you authorized the MCP resource (or the reverse), obtain a new user authorization for the correct resource. Refresh cannot change the token's audience.
13
13
 
14
14
  Choose one supported [client registration method](/docs/for-ai/guides/oauth-client-registration.md), then follow the same [consent and callback steps](/docs/for-ai/guides/oauth-consent-and-callback.md). If metadata omits registration_endpoint, new DCR registration is unavailable; do not guess a replacement endpoint or silently switch to another client's credentials.
15
15
 
@@ -27,4 +27,4 @@ const resource = authorizationServer.issuer;
27
27
  const apiBase = authorizationServer.issuer;
28
28
  ```
29
29
 
30
- For MCP, assign `resource` from the protected-resource metadata's `resource` field instead. Do not replace either value with the hostname you started from. A wrong `resource` can produce an `invalid_request` error callback even when client registration succeeded.
30
+ For MCP, assign `resource` from the protected-resource metadata's `resource` field instead. Do not replace either value with the hostname you started from. A wrong `resource` can produce an `invalid_target` error callback even when client registration succeeded.
@@ -28,7 +28,7 @@ const tokens = await tokenResponse.json(); // Store securely; do not print token
28
28
 
29
29
  Save access_token, refresh_token and returned scope in the connector's secure credential store. Public clients have no client secret. Use Authorization: Bearer <access_token> with REST requests or the MCP HTTP connection, according to that token's resource. A refresh token is never an API credential. [Scopes bound access; resource policies still apply](/docs/for-ai/guides/authorization-rules.md).
30
30
 
31
- Refresh with grant_type=refresh_token, client_id, refresh_token and the original resource at token_endpoint. Scope may stay the same or narrow; it cannot expand. Credentials rotate: store the newly returned refresh token atomically and stop using the previous one. A revoked or reused refresh token must not be retried in a loop. Reauthorize when the grant no longer permits the intended operation.
31
+ Refresh with grant_type=refresh_token, client_id and refresh_token at token_endpoint. The resource parameter is optional for code exchange and refresh: omission inherits the existing grant audience; if supplied, it must match the original resource. Scope may stay the same or narrow; it cannot expand. Credentials rotate: store the newly returned refresh token atomically and stop using the previous one. A revoked or reused refresh token must not be retried in a loop. Reauthorize when the grant no longer permits the intended operation.
32
32
 
33
33
  Revoke by POSTing application/x-www-form-urlencoded token=<refresh_token>&client_id=<client_id> to revocation_endpoint. Revoked grants stop authorizing both access and refresh requests. Removing a local configuration file alone is not server-side revocation.
34
34
 
@@ -72,11 +72,11 @@ get:
72
72
  type: string
73
73
  - in: query
74
74
  name: resource
75
- required: true
75
+ required: false
76
76
  schema:
77
77
  type: string
78
78
  format: uri
79
- description: Canonical issuer for REST or issuer/mcp for MCP; discover rather than guess.
79
+ description: Canonical issuer for REST or issuer/mcp for MCP. Omission defaults to REST.
80
80
  - in: query
81
81
  name: code_challenge
82
82
  required: true
@@ -90,7 +90,7 @@ get:
90
90
  enum:
91
91
  - S256
92
92
  responses:
93
- '303':
93
+ '302':
94
94
  description: Navigate to sign-in and pending consent.
95
95
  headers:
96
96
  Location:
@@ -61,7 +61,9 @@ post:
61
61
  approved: true
62
62
  responses:
63
63
  '200':
64
- description: Callback navigation URL containing code or denial and original state.
64
+ description: >-
65
+ One-time browser continuation URL. Navigate the browser to receive a 302 to the registered
66
+ callback.
65
67
  content:
66
68
  application/json:
67
69
  schema:
@@ -73,7 +75,8 @@ post:
73
75
  type: string
74
76
  format: uri
75
77
  example:
76
- redirect_url: http://127.0.0.1:8765/callback?code=SERVER_ISSUED_CODE&state=ORIGINAL_STATE
78
+ redirect_url: >-
79
+ https://portos-pilot-api-685761720421.us-west1.run.app/oauth/authorization-response?request_id=SERVER_ISSUED_RESPONSE_ID
77
80
  '400':
78
81
  description: Invalid, expired or consumed request.
79
82
  '401':