Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Asana module

- Search Asana tasks and projects via `search`.
- View Asana tasks via `loadTask`.
- Inputs/outputs live in `index.ts`.
- Permissions live in `integration.ts`.
- No triggers.
62 changes: 62 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/asana/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
export type AsanaSearchInput = {
question: string
keywords: string
lookback?: string
}

export type AsanaSearchResultItem = {
id: string
type: "asana"
title: string
path: string
text: string
lastEdited: string
isPrivate: boolean
pageId: string
entity: string
taskId: string
project: string
assignee: string
workspace: string
team: string
url: string
href: string
}

export type AsanaSearchResult = {
results: Array<AsanaSearchResultItem>
}

export type AsanaLoadTaskInput =
| {
taskId: string
taskGid?: never
}
| {
taskId?: never
taskGid: string
}

export type AsanaLoadTaskResult = Record<string, unknown>
/*
Search Asana tasks and projects via the connected Asana search connector.
*/
export type AsanaSearch = (args: AsanaSearchInput) => Promise<AsanaSearchResult>

/*
Load an Asana task by ID.
*/
export type AsanaLoadTask = (
args: AsanaLoadTaskInput,
) => Promise<AsanaLoadTaskResult>

export type Module = {
search: AsanaSearch
loadTask: AsanaLoadTask
}

export type {
AsanaIntegration,
ModulePermissions,
ModuleState,
} from "./integration"
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
export type ModulePermission = {
/**
* User URL to run Asana searches as (URL).
* Required for custom agents; omit for personal agent modules.
*/
identifier: string
/**
* Must be ["search"].
*/
actions: ["search"]
}

export type ModulePermissions = ModulePermission
export type ModuleState = never

export type AsanaIntegration = {
type: "asana"
name: string
permissions?: Array<ModulePermissions>
state?: ModuleState
}
8 changes: 8 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/box/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Box module

- Search Box files via `search`.
- Load a Box file by ID via `loadFile`. Use the `fileId` from search results.
- Resolve a Box shared link to a file ID via `findSharedItem`. Use when the user provides a link like `https://app.box.com/s/...`.
- Inputs/outputs live in `index.ts`.
- Permissions live in `integration.ts`.
- No triggers.
73 changes: 73 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/box/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
export type BoxSearchInput = {
question: string
keywords: string
lookback?: string
}

export type BoxSearchResultItem = {
id: string
type: "box"
title: string
path: string
text: string
lastEdited: string
isPrivate: boolean
pageId: string
fileType: string
fileId: string
}

export type BoxSearchResult = {
results: Array<BoxSearchResultItem>
}

/*
Search Box files via the connected Box search connector.
*/
export type BoxSearch = (args: BoxSearchInput) => Promise<BoxSearchResult>

export type BoxLoadFileInput = {
fileId: string
}

export type BoxLoadFileResult = {
type: "box-file"
title: string
blocks: string[]
fileId: string
}

/*
Load a Box file by its file ID. Use fileId from search results.
*/
export type BoxLoadFile = (args: BoxLoadFileInput) => Promise<BoxLoadFileResult>

export type BoxFindSharedItemInput = {
sharedLink: string
}

export type BoxFindSharedItemResult = {
itemId: string
itemType: "file" | "folder"
name: string
size: number
modifiedAt: string
owner: string
}

/*
Resolve a Box shared link URL (e.g. https://app.box.com/s/...) to an item ID, type, and name.
*/
export type BoxFindSharedItem = (args: BoxFindSharedItemInput) => Promise<BoxFindSharedItemResult>

export type Module = {
search: BoxSearch
loadFile: BoxLoadFile
findSharedItem: BoxFindSharedItem
}

export type {
BoxIntegration,
ModulePermissions,
ModuleState,
} from "./integration"
14 changes: 14 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/box/integration.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
export type ModulePermission = {
identifier: string
actions: ["search"]
}

export type ModulePermissions = ModulePermission
export type ModuleState = never

export type BoxIntegration = {
type: "box"
name: string
permissions?: Array<ModulePermissions>
state?: ModuleState
}
35 changes: 35 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/calendar/AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@

# Calendar module

Notion Calendar module surfaces for calendar scheduling, time management, adhoc event create/update/delete, and meeting prep / recap. Users connect calendars from Google, iCloud, and Outlook, and also connect Notion databases to time-block / task manage on their grid. The Calendar module provides functionality to enable time-management workflows across all those ecosystems. Use this module instead of the Google Calendar module if the user has Notion Calendar connected.

## File routing

- Read `tools/events.ts` for tool inputs/outputs to read and edit calendar events.
- Read `integration.ts` to understand permissioning (when running in a custom agent).
- Read `triggers.ts` to understand agent triggers that can come from calendar.
- Read `skills/scheduling.md` for a guide on the best way to handle a user's request to find or propose times to meet with someone. The user might say "schedule meetings" , "schedule time" , "propose time" , "find time" , "when I am available" or something similar.
- Read `skills/optimize-schedule.md` for a guide on analyzing, optimizing or evaluating a user's calendar or schedule for a specific time period (today, this week, etc.), and also on identifying scheduling conflicts, meeting overload or focus time opportunities.
- Read `skills/meeting-prep.md` for a guide on how to prepare the user for a meeting.
- Read `skills/meeting-follow-up.md` for a guide on how to help a user follow-up on a meeting (comms, action items, next steps, etc.).
- Read `skills/project-planning.md` for a guide on how to help the user plan a project on their calendar.

## Relative dates

Triple check that your calculation of relative dates is correct (e.g. "Next Tuesday"). Use these rules:

- Always identify today and timezone first when performing this calculation.
- Use the user's timezone when in doubt.
- Also confirm that day (e.g. Friday) and date (e.g. February 6th, 2026) are consistent.

## Representing data to the user

- Try to avoid leaking code/API constructs to the user when responding. Below are some examples on how you can convert data to a readable format (not exhaustive):
- isTransparent should be "marked as free" if true, or "marked as busy" if false
- Recurrence rules should be represented as human-readable, vs. in the raw RRule format
- Response status should be "needs action" instead of "needsAction" when displayed to the user
- Calendar event links should be rendered with Notion AI's citation format
- Lists of events for the day should be shown to the user with link citations for the events
- Created or updated events should include a link citation to the event
- When showing a user their schedule, don't list events to the user that they have declined
- For situations where the user has responded "maybe", show that explicitly when listing the event
25 changes: 25 additions & 0 deletions SystemPrompts/Notion/notion-ai_20260322/modules/calendar/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@

import type { Module as ContactsModule } from "./tools/contacts"
import type { Module as EventsModule } from "./tools/events"

export type Module = EventsModule & ContactsModule

export type {
CalendarIntegration,
ModulePermissions,
ModuleState,
} from "./integration"
export type {
Trigger,
TriggerConfig,
TriggerVariables,
CalendarEventCreatedTrigger,
CalendarEventCreatedTriggerConfig,
CalendarEventCreatedTriggerVariables,
CalendarEventUpdatedTrigger,
CalendarEventUpdatedTriggerConfig,
CalendarEventUpdatedTriggerVariables,
CalendarEventCanceledTrigger,
CalendarEventCanceledTriggerConfig,
CalendarEventCanceledTriggerVariables,
} from "./triggers"
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@

import type { CalendarReference } from "./tools/events"

export type CalendarModulePermissionAction = "read" | "write" | "readCoworker"

export type CalendarModulePermissionConstraints = {
skipConfirmation: boolean
}

export type CalendarModulePermission = {
accountId: string
calendarId?: string
actions?: Array<CalendarModulePermissionAction>
constraints?: CalendarModulePermissionConstraints
}

export type CalendarModuleCalendarAccount = {
accountId: string
email: string | undefined
provider: string
displayName: string
supportsTriggers: boolean
calendars: Array<{
calendarId: string
name: string
primary: boolean
accessRole: string
}>
}

export type CalendarModuleState = {
defaultCalendar?: CalendarReference | null
availableAccounts?: CalendarModuleCalendarAccount[] | null
}

export type ModulePermissions = CalendarModulePermission
export type ModuleState = CalendarModuleState

export type CalendarIntegration = {
type: "calendar"
name: string
permissions?: Array<ModulePermissions>
state?: ModuleState
}
Loading