Files
admin-cli/cpp-golang-ffi/go/internal/graph/schema.graphql
T

862 lines
18 KiB
GraphQL

scalar URL
scalar Time
scalar Upload
enum ErrorCode {
NOT_REGISTERED
ALREADY_REGISTERED
INVALID_EMAIL
INVALID_CODE
BAD_USER_INPUT
UNAUTHENTICATED
FORBIDDEN
NOT_FOUND
INTERNAL_SERVER_ERROR
SIGNIN_CODE_EXPIRED_OR_NOT_FOUND
}
type Query {
"""
Roles: flowy-admin
"""
getWaitlist: [WaitlistEntry!]!
"""
Temporary public way to pull all humans.
"""
humans: [Human!]!
"""
"""
human(id: ID!): Human!
"""
[Temporary] Must set 'Authorization' header to auth-token.
"""
viewer: Human!
"""
Search for humans including contacts by their display name, email.
"""
searchHumans(query: String!): [Human!]!
"""
Returns all of the spaces for the authed human.
"""
spaces: SpaceConnection!
}
type Subscription {
"""
Subscribes to new echoes relevant to the authed human. This means the echo is in 'SENT' state.
Includes echoes sent by the authed human.
"""
echoSent: Echo!
"""
Notifies authed human when relevant echo is expired.
"""
echoExpired(echoId: ID!): Echo!
"""
New conversation created which involves the authed human.
"""
newConversation: ID!
"""
Watch the basic online status of a human.
"""
humanStatus(humanId: ID!): Boolean!
"""
Watches for signals for people echoing in a conversation.
"""
echoSignal(conversationId: ID!): ID!
"""
Receive instructions (for the chrome extension) sent by given human on the keypad.
"""
instruction(humanId: ID!): Instruction!
"""
Receive messages from the chrome extension.
"""
peripheralMessage: PeripheralMessage!
}
type OpenUrlInstruction {
url: URL!
}
type ChatGptFollowUpInstruction {
query: String!
}
type ChatGptToggleWebSearchInstruction {
# FIX: required to have one field for some reason
fakeField: Boolean
}
type GoogleCalendarUpdateViewInstruction {
hotkey: String!
}
type VariableInstruction {
"""
Will be a json representation of a instruction defined in keypad & chrome extension.
"""
message: String!
}
union Instruction = OpenUrlInstruction | ChatGptFollowUpInstruction | ChatGptToggleWebSearchInstruction | GoogleCalendarUpdateViewInstruction | VariableInstruction
type UrlUpdatedMessage {
currentUrl: URL!
}
type StateUpdateMessage {
url: URL!
"""
Json representation for specific application context.
"""
state: String
}
union PeripheralMessage = UrlUpdatedMessage | StateUpdateMessage
type Mutation {
"""
Registers a new human.
Errors if already registered.
"""
register(email: String!, displayName: String!): Boolean!
"""
Sends email with a code.
ErrorCodeNotFound if not registered.
"""
signIn(email: String!): Boolean!
"""
Verifies the code and returns a token.
ErrorCodeNotFound if not registered.
ErrorSignInCodeExpiredOrNotFound if the code is expired or not found.
"""
signInVerify(email: String!, code: String!): TokenOutput!
"""
If already in the waitlist, gracefully returns success.
Roles: public
"""
joinWaitlist(input: JoinWaitlistInput!): Boolean!
"""
Add a human into the system.
Returns the human.
"""
addHuman(input: AddHumanInput!): Human!
"""
The first step in flowy.llink (thought).
Returns ID of the draft echo.
"""
draftEcho(input: DraftEchoInput!): DraftEchoOutput!
"""
The second step in flowy.llink (top-of-mind people).
Requires authentication as the human who drafted.
The system will prepare and send the echo after this step and you will be notified in echoReceived subscription.
Returns true if successful.
"""
commitEcho(input: CommitEchoInput!): Boolean!
"""
Adds a human to a conversation.
Requires authentication as the admin of the conversation.
"""
addHumanToConversation(input: AddHumanToConversationInput!): Boolean!
"""
Updates the profile picture of the authed human.
"""
updateHumanProfile(input: UpdateHumanProfileInput!): Boolean!
"""
Updates the playback marker for the authed human in a conversation.
Must be a member of the conversation.
"""
updatePlaybackMarker(conversationId: ID!, echoId: ID!, currentPositionSeconds: Int!): ConversationPlaybackMarker!
"""
Updates the last seen time of the authed human.
"""
updateLastSeen: Boolean!
"""
Updates the presence of the authed human.
"""
disconnectPresence: Boolean!
"""
Must be a member of the conversation.
Signals to others in the conversation that the authed human is echoing.
"""
sendEchoSignal(conversationId: ID!): Boolean!
"""
Generates a token to join the live room.
"""
generateLiveToken(conversationId: ID!): String!
"""
Sends instruction to chrome extension.
"""
sendInstruction(input: SendInstructionInput!): Boolean!
"""
For sending responses/messages from the chrome extension to the keypad.
"""
sendMessageToKeypad(input: SendMessageToKeypadInput!): Boolean!
addSpace(input: AddSpaceInput!): Space!
updateSpace(input: UpdateSpaceInput!): Space!
moveSpace(input: MoveSpaceInput!): Boolean!
deleteSpace(input: DeleteSpaceInput!): Boolean!
setKey(input: SetKeyInput!): Key!
swapKeys(input: SwapKeysInput!): Boolean!
deleteKey(input: DeleteKeyInput!): Boolean!
}
input AddSpaceInput {
name: String!
"""
Optional. Either set this or `iconUrl`, not both.
"""
iconName: String
"""
Optional. Either set this or `iconName`, not both.
"""
iconUrl: URL
"""
Optional. Either specify a domain or an app name followed by the extension
(e.g. 'app:Visual Studio Code' or 'url_contains:flowy.com' or 'url_contains:youtube.com/watch').
"""
trigger: String
}
input UpdateSpaceInput {
spaceId: ID!
name: String!
"""
Optional. Either set this or `iconUrl`, not both.
"""
iconName: String
"""
Optional. Either set this or `iconName`, not both.
"""
iconUrl: URL
"""
Optional. Either specify a domain or an app name followed by the extension
(e.g. 'app:Visual Studio Code' or 'url_contains:flowy.com' or 'url_contains:youtube.com/watch').
"""
trigger: String
}
enum MoveSpaceDirection {
UP
DOWN
}
input MoveSpaceInput {
spaceId: ID!
direction: MoveSpaceDirection!
}
input DeleteSpaceInput {
spaceId: ID!
}
input KeyTypeKeypressInput {
mainKey: String!
shiftKey: Boolean!
commandKey: Boolean!
optionKey: Boolean!
controlKey: Boolean!
}
input KeyTypeOpenUrlInput {
url: String! # URL is typically represented as a String in GraphQL
newWindow: Boolean!
}
input KeyTypeOpenAppInput {
appName: String!
}
input KeyTypeTextSnippetInput {
text: String!
pasteInCurrentInput: Boolean!
copyToClipboard: Boolean!
}
input KeyTypeTerminalCommandInput {
command: String!
directory: String!
}
input KeyTypeWriteForMeInput {
prependedInstruction: String!
writingStyle: String
formatForCurrentApp: Boolean!
attachScreenshot: Boolean!
}
input KeyTypeTypeForMeInput {
minimallyProcess: Boolean!
formatForCurrentApp: Boolean!
}
input KeyTypeFlowyChatInput {
prependedInstruction: String!
}
input KeyTypeMacOsCommandInput {
commandType: MacOsCommandType!
}
input KeyConfigurationInput {
keypress: KeyTypeKeypressInput
openUrl: KeyTypeOpenUrlInput
openApp: KeyTypeOpenAppInput
textSnippet: KeyTypeTextSnippetInput
terminalCommand: KeyTypeTerminalCommandInput
writeForMe: KeyTypeWriteForMeInput
typeForMe: KeyTypeTypeForMeInput
flowyChat: KeyTypeFlowyChatInput
macOsCommand: KeyTypeMacOsCommandInput
}
input SetKeyInput {
spaceId: ID!
position: Int!
title: String!
"""
Optional. Either set this or `iconUrl`, not both.
"""
iconName: String
"""
Optional. Either set this or `iconName`, not both.
"""
iconUrl: URL
hexColor: String
"""
Must specify one of the inputs.
"""
keyConfiguration: KeyConfigurationInput!
}
input SwapKeysInput {
spaceId: ID!
positionA: Int!
positionB: Int!
}
input DeleteKeyInput {
spaceId: ID!
position: Int!
}
enum Role {
ADMIN,
HUMAN,
}
type TokenOutput {
token: String!
role: Role!
}
input UrlUpdatedMessageInput {
"""
Current url of the active tab and focused window.
"""
currentUrl: URL!
}
input StateUpdateInput {
url: URL!
"""
State of specific site in url in json form.
"""
state: String
}
input SendMessageToKeypadInput {
humanId: ID!
urlUpdated: UrlUpdatedMessageInput
stateUpdate: StateUpdateInput
}
input SendInstructionUpdateGoogleCalendarViewInput {
"""
The hotkey to update the google calendar view.
"""
hotkey: String!
}
input SendInstructionOpenUrlInput {
url: URL!
}
input SendInstructionChatGptFollowUpInput {
query: String!
}
input SendInstructionChatGptToggleWebSearchInput {
# FIX: required to have one field for some reason
fakeField: Boolean
}
input SendVariableInstructionInput {
"""
Will be a json representation of a instruction defined in keypad & chrome extension.
"""
message: String!
}
### FIX: dealing with polymorphism here by having different optional fields because can't have a union in an input type
input SendInstructionInput {
openUrl: SendInstructionOpenUrlInput
chatGptFollowUp: SendInstructionChatGptFollowUpInput
chatGptToggleWebSearch: SendInstructionChatGptToggleWebSearchInput
updateGoogleCalendarView: SendInstructionUpdateGoogleCalendarViewInput
variable: SendVariableInstructionInput
}
type Header {
key: String!
value: String!
}
type DraftEchoOutput {
draftEchoId: ID!
"""
The URL to upload the asset to. Must be done before committing the echo.
"""
assetUploadUrl: URL!
"""
Use these headers to upload the asset to the given URL.
"""
uploadHeaders: [Header!]!
}
enum CompanyWorkspaceSuite {
GSuite
Office365
}
type WaitlistEntry {
email: String!
firstName: String
lastName: String
companyWebsite: URL
companyWorkspaceSuite: CompanyWorkspaceSuite
isDecisionMaker: Boolean
}
input JoinWaitlistInput {
email: String!
firstName: String
lastName: String
companyWebsite: URL
companyWorkspaceSuite: CompanyWorkspaceSuite
isDecisionMaker: Boolean
}
input AddHumanInput {
email: String!
displayName: String!
profilePicture: Upload
}
input DraftEchoInput {
contentLength: Int!
contentType: String!
"""
Must match the mime type of the asset. If `video/*`, then you can use `VIDEO` or `SCREEN`.
"""
echoType: EchoType!
}
input CommitEchoInput {
draftEchoId: ID!
"""
Send to the given existing conversation.
Authed human must be a member of the conversation.
Must have this or `newConversation`.
"""
existingConversation: String
"""
Send to a new conversation with the given human ids.
Authed human becomes the admin of the conversation.
Must have this or `existingConversation`.
Do NOT include the echo creator in the list.
"""
newConversation: [ID!]
}
input AddHumanToConversationInput {
conversationId: ID!
humanId: ID!
}
input UpdateHumanProfileInput {
"""
The profile picture to update. Optional.
If kept empty, will retain the former profile picture.
"""
profilePicture: Upload
"""
The display name to update. Optional.
If kept empty, will retain the former display name.
"""
displayName: String
}
"""
Orders by all types DESC
"""
enum PaginationOrderBy {
CREATED_AT
UPDATED_AT
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
type Human {
id: ID!
email: String!
displayName: String!
profilePictureUrl: URL
"""
Two letters based on the display name.
"""
initials: String!
isFlowyAdmin: Boolean!
createdAt: Time!
"""
Conversations that the human is involved.
Only available if the viewer is this human or flowy-admin.
"""
conversations(
"""
Whether or not to show expired conversations.
"""
includeExpired: Boolean! = false
): HumanConversationConnection!
}
type HumanConversationConnection {
edges: [HumanConversationEdge!]!
nodes: [Conversation!]!
pageInfo: PageInfo!
}
type ConversationPlaybackMarker {
"""
This is the id of the echo that the human last played within this conversation.
Serves as a playback marker for the human to enable 'continue playing a youtube video'.
"""
echoId: String
"""
This is how far we are on the current marker echo. Used for precision.
If we are at the end, will start playing the next echo.
Similar to [MDN audio currentTime](https://developer.mozilla.org/en-US/docs/Web/API/BaseAudioContext/currentTime)
"""
currentPositionSeconds: Int
# """
# Whether or not the current marker is at the latest echo in the conversation.
# """
# FIXME: want data from echoes resolver to update this upstream resolver...how? consolidate resolvers?
# isLatestEcho: Boolean!
}
type HumanConversationEdge {
cursor: String!
node: Conversation!
"""
A set of properties for seamless playback experience for a human in a conversation.
"""
playbackMarker: ConversationPlaybackMarker!
}
type Conversation {
id: ID!
"""
All members of a conversation *excluding* the viewer.
"""
members: ConversationMemberConnection!
"""
Echoes for this conversation, sorted by createdAt ASC.
"""
echoes(
"""
Whether or not to show all echoes for this conversation.
An echo is considered expired if it was created more than 48 hours ago.
"""
includeExpired: Boolean! = false
): EchoConnection!
"""
The last time that an echo, radio, or chat happened in this conversation.
"""
lastActivityAt: Time
"""
A conversation is considered expired if the last activity was more than 48 hours ago.
"""
isExpired: Boolean!
}
type ConversationMemberConnection {
edges: [ConversationMemberEdge!]!
# NOTE: be careful to not to trigger infinite fetch here.
nodes: [Human!]!
pageInfo: PageInfo!
}
type ConversationMemberEdge {
cursor: String!
node: Human!
}
type EchoConnection {
edges: [EchoEdge!]!
nodes: [Echo!]!
pageInfo: PageInfo!
# lastEchoTranscript: String
}
type EchoEdge {
cursor: ID!
node: Echo!
}
enum EchoType {
AUDIO_ONLY
VIDEO
SCREEN
}
enum EchoState {
DRAFT
"""
The creator has committed this to be sent to a conversation when complete.
"""
COMMITTED
"""
Transcribing, transcoding and other activities in progress.
"""
PREPARING
"""
Everything ready for playback experience, going to send soon.
"""
READY
"""
The echo is sent within a conversation.
"""
SENT
"""
The echo failed in some way.
"""
FAILURE
}
type Echo {
id: ID!
createdBy: Human!
createdByViewer: Boolean!
createdAt: Time!
echoType: EchoType!
echoState: EchoState!
"""
URL to download the asset. Will be a temporary pre-signed URL.
"""
assetUrl: URL!
"""
HLS streal URL for asset. Only available if the echo is in 'SENT' state.
"""
streamUrl: URL
"""
Thumbnail image for the asset. Only available if the echo is in 'SENT' state.
"""
thumbnailUrl: URL
"""
Thumbnail gif for the asset. Only available if the echo is in 'SENT' state.
"""
thumbnailGifUrl: URL
"""
Duration in seconds. Only available if the echo is in 'SENT' state.
"""
durationSeconds: Float
"""
The conversation that this echo belongs to.
Only available if the echo is past the 'DRAFT' state.
"""
conversation: Conversation
"""
The transcript of the echo. Only available if the echo is in 'SENT' state.
"""
transcript: Transcript
}
type TranscriptWord {
word: String!
start: Float!
end: Float!
}
type Transcript {
fullText: String!
words: [TranscriptWord!]!
}
type IconName {
value: String!
}
type IconUrl {
value: URL!
}
union VariableIcon = IconName | IconUrl
type KeyTypeKeypress {
mainKey: String!
shiftKey: Boolean!
commandKey: Boolean!
optionKey: Boolean!
controlKey: Boolean!
}
type KeyTypeOpenUrl {
url: URL!
newWindow: Boolean!
}
type KeyTypeOpenApp {
appName: String!
}
type KeyTypeTextSnippet {
text: String!
pasteInCurrentInput: Boolean!
copyToClipboard: Boolean!
}
type KeyTypeTerminalCommand {
command: String!
directory: String!
}
type KeyTypeWriteForMe {
prependedInstruction: String!
"""
e.g. casual, friendly, formal, concise (or any combination)
"""
writingStyle: String!
"""
Whether or not to format for the current app (e.g. Notion in markdown vs. email formatting differences)
Default: true.
"""
formatForCurrentApp: Boolean!
"""
Optional. Provides more context of what I am doing and reading.
"""
attachScreenshot: Boolean!
}
type KeyTypeTypeForMe {
"""
Help with breaking sentences apart and small grammar rules.
"""
minimallyProcess: Boolean!
"""
Whether or not to format for the current app (e.g. Notion in markdown vs. email formatting differences)
Default: true.
"""
formatForCurrentApp: Boolean!
}
type KeyTypeFlowyChat {
prependedInstruction: String!
}
enum MacOsCommandType {
INCREASE_BRIGHTNESS
DECREASE_BRIGHTNESS
MUTE_VOLUME
INCREASE_VOLUME
DECREASE_VOLUME
PLAY_PAUSE
NEXT_TRACK
PREVIOUS_TRACK
DO_NOT_DISTURB
LOCK_SCREEN
LOG_OUT
SLEEP
SHUT_DOWN
RESTART
MISSION_CONTROL
APP_DRAWER
SPOTLIGHT
"""
MacOS: + SHIFT + 3
"""
SCREENSHOT_SCREEN
"""
MacOS: + SHIFT + 4
"""
SCREENSHOT_AREA_SELECT
"""
MacOS: + SHIFT + 5
"""
SCREENSHOT_FULL_OPTIONS
}
type KeyTypeMacOsCommand {
commandType: MacOsCommandType!
}
union KeyConfiguration = KeyTypeKeypress | KeyTypeOpenUrl | KeyTypeOpenApp | KeyTypeTextSnippet | KeyTypeTerminalCommand | KeyTypeWriteForMe | KeyTypeTypeForMe | KeyTypeFlowyChat | KeyTypeMacOsCommand
type Key {
id: ID!
title: String!
position: Int!
hexColor: String
icon: VariableIcon
createdAt: Time!
keyConfiguration: KeyConfiguration!
}
type Space {
id: ID!
name: String!
keys: [Key!]!
createdAt: Time!
icon: VariableIcon
trigger: String
}
type SpaceConnection {
edges: [SpaceEdge!]!
nodes: [Space!]!
pageInfo: PageInfo!
}
type SpaceEdge {
cursor: ID!
node: Space!
}