@portpowered/reference-data 0.4.10 → 0.4.11
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/generated/capabilities.json +288 -7
- package/generated/guides.json +4 -4
- package/generated/openapi.json +284 -10
- package/generated/public/docs/for-ai/api-catalog.md +2 -1
- package/generated/public/docs/for-ai/capability-interfaces/media-player/1.0.md +1 -0
- package/generated/public/docs/for-ai/capability-interfaces/reminders-provider/1.0.md +8 -2
- package/generated/public/docs/for-ai/guides/authentication-and-dcr.md +26 -4
- package/generated/public/docs/for-ai/guides/oauth-consent-and-callback.md +23 -1
- package/generated/public/docs/for-ai/guides/oauth-discovery.md +2 -2
- package/generated/public/docs/for-ai/guides/oauth-token-lifecycle.md +1 -1
- package/generated/public/docs/for-ai/operations/beginOAuthAuthorization.md +2 -2
- package/generated/public/docs/for-ai/operations/completeOAuthConsent.md +5 -2
- package/generated/public/docs/for-ai/operations/deliverOAuthAuthorizationResponse.md +74 -0
- package/generated/public/docs/for-ai/operations/index.md +1 -0
- package/generated/public/docs/for-ai/schemas/m-1.md +1 -1
- package/generated/public/docs/for-ai/schemas/m-2.md +1 -0
- package/generated/public/docs/for-ai/schemas/r-1.md +7 -7
- package/generated/public/docs/for-ai/schemas/r-2.md +7 -0
- package/generated/public/docs/for-ai/schemas.md +4 -4
- package/generated/public/docs/references/authorization.json +9 -0
- package/generated/public/docs/references/authorization.yaml +7 -0
- package/generated/public/docs/references/capability-interfaces/media-player/1.0/attributes/now-playing.yaml +7 -0
- package/generated/public/docs/references/capability-interfaces/media-player/1.0/messages/transfer-playback.yaml +10 -0
- package/generated/public/docs/references/capability-interfaces/media-player/1.0.yaml +26 -0
- package/generated/public/docs/references/capability-interfaces/media-player.yaml +26 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder-response.yaml +33 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/create-reminder.yaml +20 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder-response.yaml +4 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/delete-reminder.yaml +16 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders-response.yaml +34 -2
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/list-reminders.yaml +17 -1
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder-response.yaml +33 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0/messages/update-reminder.yaml +26 -0
- package/generated/public/docs/references/capability-interfaces/reminders-provider/1.0.yaml +202 -4
- package/generated/public/docs/references/capability-interfaces/reminders-provider.yaml +202 -4
- package/generated/public/docs/references/manifest.json +206 -74
- package/generated/public/docs/references/openapi.yaml +236 -7
- package/generated/public/docs/references/schemas/MediaPlayerInterfaceNowPlayingAttribute.json +5 -0
- package/generated/public/docs/references/schemas/MediaPlayerInterfaceTransferPlaybackMessage.json +11 -0
- package/generated/public/docs/references/schemas/Reminder.json +33 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceCreateReminderMessage.json +31 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceCreateReminderResponseMessage.json +20 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceDeleteReminderMessage.json +28 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceDeleteReminderResponseMessage.json +12 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceListRemindersMessage.json +23 -2
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceListRemindersResponseMessage.json +15 -4
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceUpdateReminderMessage.json +39 -0
- package/generated/public/docs/references/schemas/RemindersProviderInterfaceUpdateReminderResponseMessage.json +20 -0
- package/generated/public/docs/references/schemas/index.json +48 -0
- package/generated/resources/media-player/message-transfer-playback.json +5 -0
- package/generated/resources/media-player/state-now-playing.json +5 -0
- package/generated/resources/reminders-provider/message-create-reminder-response.json +44 -0
- package/generated/resources/reminders-provider/message-create-reminder.json +25 -0
- package/generated/resources/reminders-provider/message-delete-reminder-response.json +6 -0
- package/generated/resources/reminders-provider/message-delete-reminder.json +22 -0
- package/generated/resources/reminders-provider/message-list-reminders-response.json +44 -3
- package/generated/resources/reminders-provider/message-list-reminders.json +23 -2
- package/generated/resources/reminders-provider/message-update-reminder-response.json +44 -0
- package/generated/resources/reminders-provider/message-update-reminder.json +33 -0
- package/package.json +1 -1
package/generated/openapi.json
CHANGED
|
@@ -7835,12 +7835,12 @@
|
|
|
7835
7835
|
{
|
|
7836
7836
|
"in": "query",
|
|
7837
7837
|
"name": "resource",
|
|
7838
|
-
"required":
|
|
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
|
|
7843
|
+
"description": "Canonical issuer for REST or issuer/mcp for MCP. Omission defaults to REST."
|
|
7844
7844
|
},
|
|
7845
7845
|
{
|
|
7846
7846
|
"in": "query",
|
|
@@ -7924,7 +7924,7 @@
|
|
|
7924
7924
|
},
|
|
7925
7925
|
"responses": {
|
|
7926
7926
|
"200": {
|
|
7927
|
-
"description": "
|
|
7927
|
+
"description": "One-time browser continuation URL. Navigate the browser to receive a 303 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": "
|
|
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
|
+
"303": {
|
|
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": "
|
|
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": "
|
|
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
|
-
|
|
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/
|
|
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
|
-
- [
|
|
14
|
-
- [
|
|
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.
|
|
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 `
|
|
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,
|
|
122
|
+
After approval, the consent page navigates to a one-time Port OS continuation.
|
|
123
|
+
That endpoint returns HTTP 303 See Other with the exact registered callback in
|
|
124
|
+
Location, carrying code, original state and iss. Denial uses the same 303 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 303, 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
|
|
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,
|
|
43
|
+
After approval, the consent page navigates to a one-time Port OS continuation.
|
|
44
|
+
That endpoint returns HTTP 303 See Other with the exact registered callback in
|
|
45
|
+
Location, carrying code, original state and iss. Denial uses the same 303 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 303, 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.
|
|
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 `
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
@@ -61,7 +61,9 @@ post:
|
|
|
61
61
|
approved: true
|
|
62
62
|
responses:
|
|
63
63
|
'200':
|
|
64
|
-
description:
|
|
64
|
+
description: >-
|
|
65
|
+
One-time browser continuation URL. Navigate the browser to receive a 303 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:
|
|
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':
|