frontier-os-app-builder 1.0.0 → 1.2.0

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/LICENSE +21 -0
  2. package/README.md +90 -14
  3. package/agents/fos-executor.md +105 -39
  4. package/agents/fos-plan-checker.md +62 -25
  5. package/agents/fos-planner.md +80 -72
  6. package/agents/fos-researcher.md +26 -15
  7. package/agents/fos-verifier.md +96 -27
  8. package/bin/fos-tools.cjs +146 -42
  9. package/bin/install.js +8 -5
  10. package/commands/fos/add-feature.md +1 -2
  11. package/commands/fos/discuss.md +0 -1
  12. package/commands/fos/new-app.md +2 -4
  13. package/commands/fos/new-milestone.md +1 -1
  14. package/commands/fos/plan.md +0 -2
  15. package/package.json +7 -1
  16. package/references/app-patterns.md +128 -21
  17. package/references/deployment.md +40 -124
  18. package/references/module-index.md +32 -0
  19. package/references/sdk/chain.md +92 -0
  20. package/references/sdk/communities.md +159 -0
  21. package/references/sdk/events.md +212 -0
  22. package/references/sdk/init.md +126 -0
  23. package/references/sdk/navigation.md +49 -0
  24. package/references/sdk/offices.md +76 -0
  25. package/references/sdk/partnerships.md +111 -0
  26. package/references/sdk/storage.md +44 -0
  27. package/references/sdk/thirdparty.md +240 -0
  28. package/references/sdk/token-amount.md +99 -0
  29. package/references/sdk/types.md +27 -0
  30. package/references/sdk/ui-utils.md +39 -0
  31. package/references/sdk/user.md +208 -0
  32. package/references/sdk/wallet.md +334 -0
  33. package/references/verification-rules.md +111 -50
  34. package/templates/app/frontier-services.tsx +871 -0
  35. package/templates/app/layout-standalone.tsx +8 -0
  36. package/templates/app/layout.tsx +19 -9
  37. package/templates/app/package-standalone.json +35 -0
  38. package/templates/app/package.json +2 -1
  39. package/templates/app/public/favicon.svg +3 -0
  40. package/templates/app/sdk-context.tsx +7 -9
  41. package/templates/app/sdk-services.tsx +98 -0
  42. package/templates/app/vercel-standalone.json +5 -0
  43. package/templates/app/vercel.json +8 -95
  44. package/templates/state/plan.md +32 -14
  45. package/templates/state/requirements.md +1 -1
  46. package/templates/state/roadmap.md +57 -24
  47. package/templates/state/summary.md +27 -30
  48. package/workflows/add-feature.md +6 -1
  49. package/workflows/discuss.md +126 -11
  50. package/workflows/execute-plan.md +21 -14
  51. package/workflows/execute.md +204 -24
  52. package/workflows/new-app.md +64 -23
  53. package/workflows/new-milestone.md +10 -3
  54. package/workflows/plan.md +16 -5
  55. package/workflows/ship.md +91 -34
  56. package/workflows/status.md +1 -2
  57. package/references/module-inference.md +0 -349
  58. package/references/sdk-surface.md +0 -1622
  59. package/templates/app/main-simple.tsx +0 -19
  60. package/templates/state/manifest.json +0 -11
package/workflows/ship.md CHANGED
@@ -43,7 +43,7 @@ Recommended: Run `/fos:status` to see which phases are incomplete.
43
43
  Continue with deployment anyway? Some features may be missing.
44
44
  ```
45
45
 
46
- Use AskUserQuestion:
46
+ Use AskUserQuestion (if available):
47
47
  - header: "Incomplete Phases"
48
48
  - question: "Deploy with incomplete phases?"
49
49
  - options:
@@ -52,6 +52,7 @@ Use AskUserQuestion:
52
52
  - "Cancel" — Go back and finish phases
53
53
 
54
54
  **If "Check status first" or "Cancel":** Exit workflow.
55
+ **If AskUserQuestion denied:** Default to "Deploy anyway".
55
56
 
56
57
  **Display ship summary:**
57
58
  ```
@@ -90,14 +91,19 @@ else
90
91
  TEST_STATUS=0
91
92
  fi
92
93
 
94
+ # Read the SDK Integration phase from the manifest so the validators run their
95
+ # Tier-2 checks (CORS origins, SDK→services bridge, exact permissions). Empty
96
+ # when no sdkPhase is set — the validator then falls back to the STATE.md phase.
97
+ SDK_PHASE=$(node -e "const m=JSON.parse(require('fs').readFileSync('.frontier-app/manifest.json','utf8')); console.log(m.sdkPhase ?? '')")
98
+
93
99
  # 4. FOS structure validation
94
100
  echo "--- Structure ---"
95
- node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate structure
101
+ node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate structure ${SDK_PHASE:+--phase "$SDK_PHASE"}
96
102
  STRUCT_STATUS=$?
97
103
 
98
104
  # 5. FOS permissions validation
99
105
  echo "--- Permissions ---"
100
- node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate permissions
106
+ node "$HOME/.claude/frontier-os-app-builder/bin/fos-tools.cjs" validate permissions ${SDK_PHASE:+--phase "$SDK_PHASE"}
101
107
  PERMS_STATUS=$?
102
108
  ```
103
109
 
@@ -128,57 +134,97 @@ Preflight failed. Fix the issues above before deploying.
128
134
  **Do NOT proceed to deployment if preflight fails.** The user must fix issues and re-run `/fos:ship`.
129
135
  </step>
130
136
 
131
- <step name="check_vercel_cli">
132
- **Check if Vercel CLI is available.**
137
+ <step name="check_tools">
138
+ **Check that gh and vercel CLIs are available and authenticated.**
133
139
 
134
140
  ```bash
135
- which vercel 2>/dev/null && vercel --version 2>/dev/null
141
+ echo "=== GitHub CLI ==="
142
+ which gh && gh auth status 2>&1 | head -3
143
+
144
+ echo "=== Vercel CLI ==="
145
+ which vercel && vercel whoami 2>&1
136
146
  ```
137
147
 
138
- **If Vercel CLI not found:**
148
+ **If gh not found or not authenticated:**
139
149
  ```
140
- Vercel CLI is not installed. Install it to deploy:
150
+ GitHub CLI is required for automated deployment. Install and authenticate:
141
151
 
142
- npm i -g vercel
152
+ brew install gh
153
+ gh auth login
143
154
 
144
- Then log in:
155
+ Then re-run `/fos:ship`.
156
+ ```
157
+ Exit workflow.
145
158
 
159
+ **If vercel not found or not authenticated:**
160
+ ```
161
+ Vercel CLI is required for deployment. Install and authenticate:
162
+
163
+ npm i -g vercel
146
164
  vercel login
147
165
 
148
- After that, re-run `/fos:ship`.
166
+ Then re-run `/fos:ship`.
149
167
  ```
168
+ Exit workflow.
169
+ </step>
150
170
 
151
- Use AskUserQuestion:
152
- - header: "Vercel CLI"
153
- - question: "Vercel CLI is not installed. What do you want to do?"
154
- - options:
155
- - "Install it now" — Run `npm i -g vercel` and continue
156
- - "Skip deployment" — Just run preflight, I'll deploy manually
157
- - "Cancel" — Exit
171
+ <step name="create_github_repo">
172
+ **Create GitHub repo and push code.**
173
+
174
+ Read the app name from manifest.json to construct the repo name.
158
175
 
159
- **If "Install it now":**
160
176
  ```bash
161
- npm i -g vercel
162
- echo "Vercel installed. Run 'vercel login' to authenticate, then re-run /fos:ship."
177
+ # Get package name from manifest (e.g., "app-tip-jar" → "frontier-os-app-tip-jar")
178
+ PACKAGE_NAME=$(node -e "const m=JSON.parse(require('fs').readFileSync('.frontier-app/manifest.json','utf8')); console.log(m.packageName)")
179
+ REPO_NAME="frontier-os-${PACKAGE_NAME}"
180
+ APP_DESC=$(node -e "const m=JSON.parse(require('fs').readFileSync('.frontier-app/manifest.json','utf8')); console.log(m.description)")
181
+ # Org is optional. Set FOS_GITHUB_ORG to create the repo under a GitHub org;
182
+ # when it's empty the repo is created under the authenticated gh user.
183
+ ORG="${FOS_GITHUB_ORG:-}"
184
+ if [ -n "$ORG" ]; then
185
+ REPO_TARGET="$ORG/$REPO_NAME"
186
+ else
187
+ REPO_TARGET="$REPO_NAME"
188
+ fi
189
+
190
+ echo "Repo: $REPO_TARGET"
163
191
  ```
164
- Exit — user needs to authenticate manually.
165
192
 
166
- **If "Skip deployment":** Jump to update_state step, mark as "preflight-passed".
193
+ **Check if remote already exists:**
194
+ ```bash
195
+ git remote get-url origin 2>/dev/null
196
+ ```
197
+
198
+ **If no remote:**
199
+ ```bash
200
+ # Create private repo (under $FOS_GITHUB_ORG if set, else the authed gh user)
201
+ gh repo create "$REPO_TARGET" --private --description "$APP_DESC" --source . --push
202
+
203
+ # Verify
204
+ gh repo view "$REPO_TARGET" --json url -q .url
205
+ ```
206
+
207
+ **If remote already exists:** Just push.
208
+ ```bash
209
+ BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || echo main)
210
+ git push -u origin "$BRANCH"
211
+ ```
167
212
  </step>
168
213
 
169
214
  <step name="deploy_to_vercel">
170
- **Deploy to Vercel production.**
215
+ **Deploy to Vercel production — fully automated, no interactive prompts.**
171
216
 
172
217
  ```bash
173
218
  # Check if already linked to a Vercel project
174
219
  if [ -d ".vercel" ]; then
175
220
  echo "Vercel project already linked."
221
+ vercel --prod 2>&1
176
222
  else
177
- echo "First deployment — Vercel will prompt for project setup."
223
+ # First deployment — link and deploy non-interactively
224
+ # Use --yes to skip all interactive prompts
225
+ vercel link --yes 2>&1
226
+ vercel --prod 2>&1
178
227
  fi
179
-
180
- # Deploy to production
181
- vercel --prod 2>&1
182
228
  DEPLOY_STATUS=$?
183
229
  ```
184
230
 
@@ -194,19 +240,28 @@ Status: Live
194
240
  The app is now accessible at the URL above.
195
241
  ```
196
242
 
197
- **If deployment fails:**
243
+ **If `vercel link --yes` fails** (e.g., needs team selection):
244
+ Try with explicit project name:
245
+ ```bash
246
+ PACKAGE_NAME=$(node -e "const m=JSON.parse(require('fs').readFileSync('.frontier-app/manifest.json','utf8')); console.log(m.packageName)")
247
+ vercel link --yes --project "$PACKAGE_NAME" 2>&1
248
+ vercel --prod 2>&1
249
+ ```
250
+
251
+ **If deployment still fails:**
198
252
  ```
199
- Deployment failed. Common issues:
200
- - Not authenticated: run `vercel login`
201
- - Build error on Vercel: check the build output above
202
- - Missing environment variables: check Vercel dashboard
253
+ Deployment failed. Ask the user to run this interactively:
254
+
255
+ ! vercel --prod
256
+
257
+ This will prompt for team/project selection. After first deploy, subsequent deploys are automatic.
203
258
  ```
204
259
  </step>
205
260
 
206
261
  <step name="app_registration">
207
262
  **Optionally register the app in the Frontier app store.**
208
263
 
209
- Use AskUserQuestion:
264
+ Use AskUserQuestion (if available):
210
265
  - header: "App Store"
211
266
  - question: "Register this app in the Frontier app store? This makes it discoverable to Frontier OS users."
212
267
  - options:
@@ -214,6 +269,8 @@ Use AskUserQuestion:
214
269
  - "Later" — Skip registration, I'll do it manually
215
270
  - "Not needed" — This is a private/internal app
216
271
 
272
+ If AskUserQuestion denied: default to "Later" — skip registration.
273
+
217
274
  **If "Register now":**
218
275
  ```
219
276
  ## App Registration
@@ -97,7 +97,7 @@ done
97
97
 
98
98
  | # | Phase | Context | Plans | Done | Status |
99
99
  |---|-------|---------|-------|------|--------|
100
- | 1 | Scaffold + SDK Core | [yes/no] | [count] | [count]/[total] | [status] |
100
+ | 1 | Scaffold + Standalone Shell | [yes/no] | [count] | [count]/[total] | [status] |
101
101
  | 2 | [Feature Name] | [yes/no] | [count] | [count]/[total] | [status] |
102
102
  | 3 | [Feature Name] | [yes/no] | [count] | [count]/[total] | [status] |
103
103
 
@@ -119,7 +119,6 @@ done
119
119
 
120
120
  wallet:
121
121
  - wallet:getBalance
122
- - wallet:getBalanceFormatted
123
122
  - wallet:transferFrontierDollar
124
123
 
125
124
  events:
@@ -1,349 +0,0 @@
1
- # SDK Module Inference
2
-
3
- Maps business descriptions to Frontier SDK modules, methods, and permissions.
4
-
5
- ---
6
-
7
- ## Inference Algorithm
8
-
9
- Given a natural-language business description of an app:
10
-
11
- 1. **Tokenize** -- lowercase the description and split into words. Remove stop words.
12
- 2. **Match against keyword patterns** -- for each SDK module, check if any of its trigger keywords appear in the token set.
13
- 3. **Always include baseline modules:**
14
- - **Storage** -- every app needs at least `storage:get` and `storage:set` for user preferences and local state.
15
- - **Chain** -- every app needs `chain:getCurrentNetwork` and `chain:getContractAddresses` for environment context.
16
- 4. **Include User if any user-facing features** -- if the app has any interactive UI (not purely informational), include `user:getDetails` and `user:getProfile`.
17
- 5. **Present inferred modules to user for confirmation** -- show the matched modules, the keywords that triggered them, and the permissions that would be requested. Let the user add or remove modules before proceeding.
18
-
19
- ---
20
-
21
- ## Module Reference
22
-
23
- ### Wallet
24
-
25
- **Trigger keywords:** payment, pay, checkout, transfer, send, receive, money, balance, wallet, token, swap, deposit, withdraw, bank, fiat, dollar, FND, iFND, ERC20, purchase, buy, sell, fund, currency, on-ramp, off-ramp, tip, donate, subscription (when involving recurring payments)
26
-
27
- **Most commonly used methods:**
28
- - `getBalance()` / `getBalanceFormatted()` -- read wallet balance
29
- - `getAddress()` -- get user's wallet address
30
- - `transferFrontierDollar(to, amount)` -- send FND to another address
31
- - `transferInternalFrontierDollar(to, amount)` -- send iFND
32
- - `transferOverallFrontierDollar(to, amount)` -- send FND, preferring iFND first
33
- - `payWithFrontierDollar(paymentRefId)` -- pay via PaymentRouter with a reference ID
34
- - `swap(params)` / `quoteSwap(params)` -- token swap operations
35
- - `getUsdDepositInstructions()` / `getEurDepositInstructions()` -- fiat on-ramp
36
- - `getLinkedBanks()` / `linkUsBankAccount()` / `linkEuroAccount()` -- fiat off-ramp
37
-
38
- **Permissions:**
39
-
40
- | Permission | Description |
41
- | --------------------------------------- | --------------------------------------------- |
42
- | `wallet:getBalance` | Access wallet balance |
43
- | `wallet:getBalanceFormatted` | Access formatted wallet balance |
44
- | `wallet:getAddress` | Access wallet address |
45
- | `wallet:getSmartAccount` | Access smart account details |
46
- | `wallet:transferERC20` | Transfer ERC20 tokens |
47
- | `wallet:approveERC20` | Approve ERC20 token spending |
48
- | `wallet:transferNative` | Transfer native currency (ETH) |
49
- | `wallet:transferFrontierDollar` | Transfer Frontier Dollars |
50
- | `wallet:transferInternalFrontierDollar`| Transfer Internal Frontier Dollars |
51
- | `wallet:transferOverallFrontierDollar` | Transfer FND with iFND preferred |
52
- | `wallet:executeCall` | Execute arbitrary contract calls |
53
- | `wallet:executeBatchCall` | Execute multiple contract calls atomically |
54
- | `wallet:getSupportedTokens` | Get list of supported tokens for swaps |
55
- | `wallet:swap` | Execute token swaps |
56
- | `wallet:quoteSwap` | Get quotes for token swaps |
57
- | `wallet:getUsdDepositInstructions` | Get USD bank deposit instructions |
58
- | `wallet:getEurDepositInstructions` | Get EUR (SEPA) deposit instructions |
59
- | `wallet:getLinkedBanks` | Get linked bank accounts |
60
- | `wallet:linkUsBankAccount` | Link a US bank account |
61
- | `wallet:linkEuroAccount` | Link a EUR/IBAN bank account |
62
- | `wallet:deleteLinkedBank` | Delete a linked bank account |
63
- | `wallet:getDeprecatedSmartAccounts` | Get deprecated smart accounts |
64
- | `wallet:payWithFrontierDollar` | Pay via PaymentRouter with reference ID |
65
-
66
- **Example business descriptions:**
67
- - "A tipping app where users can send FND to content creators"
68
- - "A checkout widget for purchasing physical goods with Frontier Dollars"
69
- - "A savings dashboard showing the user's balance and deposit history"
70
-
71
- ---
72
-
73
- ### Storage
74
-
75
- **Trigger keywords:** save, store, persist, preferences, settings, cache, remember, bookmark, favorite, history, draft, note, data, local
76
-
77
- **Always included.** Every app needs storage for user preferences at minimum.
78
-
79
- **Most commonly used methods:**
80
- - `get(key)` -- read a value
81
- - `set(key, value)` -- write a value
82
- - `remove(key)` -- delete a value
83
-
84
- **Permissions:**
85
-
86
- | Permission | Description |
87
- | ----------------- | --------------------- |
88
- | `storage:get` | Read from storage |
89
- | `storage:set` | Write to storage |
90
- | `storage:remove` | Remove from storage |
91
- | `storage:clear` | Clear all storage |
92
-
93
- **Example business descriptions:**
94
- - "An app that remembers the user's preferred language and notification settings"
95
- - "A note-taking app that saves drafts locally"
96
-
97
- ---
98
-
99
- ### Chain
100
-
101
- **Trigger keywords:** network, chain, contract, blockchain, onchain, smart contract, address, deploy, testnet, mainnet
102
-
103
- **Always included.** Every app needs chain context for environment detection and contract addresses.
104
-
105
- **Most commonly used methods:**
106
- - `getCurrentNetwork()` -- get current network name
107
- - `getContractAddresses()` -- get FND, iFND, PaymentRouter, SubscriptionManager addresses
108
- - `getCurrentChainConfig()` -- full chain configuration
109
-
110
- **Permissions:**
111
-
112
- | Permission | Description |
113
- | ------------------------------ | --------------------------------------- |
114
- | `chain:getCurrentNetwork` | Get current network name |
115
- | `chain:getAvailableNetworks` | Get list of available networks |
116
- | `chain:switchNetwork` | Switch to a different network |
117
- | `chain:getCurrentChainConfig` | Get full chain configuration |
118
- | `chain:getContractAddresses` | Get contract addresses |
119
-
120
- **Example business descriptions:**
121
- - "A dashboard showing contract deployment status across networks"
122
- - "An app that reads on-chain data from the SubscriptionManager"
123
-
124
- ---
125
-
126
- ### User
127
-
128
- **Trigger keywords:** user, profile, account, member, membership, signup, register, login, identity, referral, invite, KYC, verification, contact, email, subscription status, access control
129
-
130
- **Include if any user-facing features.** Most apps need at minimum `user:getDetails`.
131
-
132
- **Most commonly used methods:**
133
- - `getDetails()` -- current user details
134
- - `getProfile()` -- user profile information
135
- - `getVerifiedAccessControls()` -- cryptographically verified access controls (always use for gating)
136
- - `createSignupRequest(params)` -- submit membership signup with crypto payment
137
- - `getReferralOverview()` -- referral statistics
138
-
139
- **Permissions:**
140
-
141
- | Permission | Description |
142
- | -------------------------------- | -------------------------------------------------- |
143
- | `user:getDetails` | Access current user details |
144
- | `user:getProfile` | Access current user profile information |
145
- | `user:getReferralOverview` | Access referral statistics |
146
- | `user:getReferralDetails` | Access detailed referral information |
147
- | `user:addUserContact` | Add user contact information |
148
- | `user:getOrCreateKyc` | Get or create KYC verification status |
149
- | `user:createSignupRequest` | Submit a new membership signup request |
150
- | `user:getVerifiedAccessControls` | Get cryptographically verified access controls |
151
-
152
- **Important:** Always use `getVerifiedAccessControls()` when making access decisions -- never trust unsigned user data from other SDK methods for gating features, content, or permissions. The method returns a cryptographically signed payload verified against hardcoded per-environment public keys inside the iframe.
153
-
154
- **Example business descriptions:**
155
- - "A membership signup form with KYC verification"
156
- - "A referral tracking dashboard showing invite statistics"
157
- - "An app that shows different content based on subscription plan"
158
-
159
- ---
160
-
161
- ### Communities
162
-
163
- **Trigger keywords:** community, communities, group, team, internship, intern, member management, reassign, transfer member, pass, organization
164
-
165
- **Most commonly used methods:**
166
- - `listCommunities()` -- list all visible communities (paginated)
167
- - `getCommunity(id)` -- get a community by ID or slug
168
- - `createInternshipPass(params)` -- create an internship pass
169
- - `listInternshipPasses()` -- list internship passes (paginated)
170
-
171
- **Permissions:**
172
-
173
- | Permission | Description |
174
- | ------------------------------------- | -------------------------------------------- |
175
- | `communities:listCommunities` | List all visible communities |
176
- | `communities:getCommunity` | Get a community by ID or slug |
177
- | `communities:createInternshipPass` | Create an internship pass |
178
- | `communities:listInternshipPasses` | List internship passes |
179
- | `communities:getInternshipPass` | Retrieve an internship pass by ID |
180
- | `communities:revokeInternshipPass` | Revoke an internship pass |
181
- | `communities:createReassignRequest` | Create a member reassignment request |
182
- | `communities:listReassignRequests` | List pending reassignment requests |
183
- | `communities:getReassignRequest` | Retrieve a reassignment request by ID |
184
- | `communities:acceptReassignRequest` | Accept a reassignment request |
185
- | `communities:rejectReassignRequest` | Reject a reassignment request |
186
-
187
- **Example business descriptions:**
188
- - "An internship management tool for community leaders"
189
- - "A community directory app"
190
- - "A tool to manage member transfers between communities"
191
-
192
- ---
193
-
194
- ### Partnerships
195
-
196
- **Trigger keywords:** sponsor, sponsorship, partner, partnership, brand, advertiser, promotion, pass, voucher, coupon
197
-
198
- **Most commonly used methods:**
199
- - `listSponsors()` -- list sponsors you manage (paginated)
200
- - `createSponsorPass(params)` -- create a sponsor pass
201
- - `listActiveSponsorPasses()` -- list active passes (paginated)
202
-
203
- **Permissions:**
204
-
205
- | Permission | Description |
206
- | --------------------------------------- | ---------------------------------------- |
207
- | `partnerships:listSponsors` | List sponsors you manage |
208
- | `partnerships:getSponsor` | Retrieve a Sponsor by ID |
209
- | `partnerships:createSponsorPass` | Create a SponsorPass |
210
- | `partnerships:listActiveSponsorPasses` | List active SponsorPasses |
211
- | `partnerships:listAllSponsorPasses` | List all SponsorPasses |
212
- | `partnerships:getSponsorPass` | Retrieve a SponsorPass by ID |
213
- | `partnerships:revokeSponsorPass` | Revoke a SponsorPass by ID |
214
-
215
- **Example business descriptions:**
216
- - "A sponsor management dashboard for partnership managers"
217
- - "A tool for creating and distributing sponsor passes at events"
218
- - "A brand promotion platform within the Frontier network"
219
-
220
- ---
221
-
222
- ### Events
223
-
224
- **Trigger keywords:** event, events, calendar, meetup, gathering, conference, workshop, hackathon, location, venue, room, booking, schedule, RSVP, host
225
-
226
- **Most commonly used methods:**
227
- - `listEvents(filters)` -- list events with optional filters (paginated)
228
- - `createEvent(params)` -- create a new event
229
- - `listLocations()` -- list available locations
230
- - `createRoomBooking(params)` -- create a room booking
231
-
232
- **Permissions:**
233
-
234
- | Permission | Description |
235
- | ----------------------------- | ---------------------------------------- |
236
- | `events:listEvents` | List events with optional filters |
237
- | `events:createEvent` | Create a new event |
238
- | `events:addEventHost` | Add a co-host to an event |
239
- | `events:listLocations` | List available locations |
240
- | `events:listRoomBookings` | List room bookings |
241
- | `events:createRoomBooking` | Create a room booking |
242
-
243
- **Example business descriptions:**
244
- - "A room booking app for co-working spaces"
245
- - "An event calendar with RSVP functionality"
246
- - "A venue management tool for event organizers"
247
-
248
- ---
249
-
250
- ### Offices
251
-
252
- **Trigger keywords:** office, access pass, access control, building, door, entry, coworking, membership contract, check-in, keycard
253
-
254
- **Most commonly used methods:**
255
- - `createAccessPass(params)` -- create an access pass for a membership contract
256
- - `listAccessPasses()` -- list access passes (paginated)
257
-
258
- **Permissions:**
259
-
260
- | Permission | Description |
261
- | ----------------------------- | -------------------------------------------------- |
262
- | `offices:createAccessPass` | Create an access pass for a membership contract |
263
- | `offices:listAccessPasses` | List access passes for managed contracts |
264
- | `offices:getAccessPass` | Retrieve an access pass by ID |
265
- | `offices:revokeAccessPass` | Revoke an access pass |
266
-
267
- **Example business descriptions:**
268
- - "A digital access pass manager for co-working spaces"
269
- - "A building entry system for office members"
270
- - "A tool for managing physical access to Frontier offices"
271
-
272
- ---
273
-
274
- ### ThirdParty
275
-
276
- **Trigger keywords:** developer, API, webhook, app registration, integrate, third-party, 3rd party, platform, marketplace, SDK, developer portal
277
-
278
- **Most commonly used methods:**
279
- - `listDevelopers()` -- list developer accounts
280
- - `createApp(params)` -- register a new app
281
- - `createWebhook(params)` -- create a webhook
282
- - `rotateWebhookSigningKey(webhookId)` -- rotate webhook signing key
283
-
284
- **Permissions:**
285
-
286
- | Permission | Description |
287
- | ------------------------------------- | ---------------------------------------- |
288
- | `thirdParty:listDevelopers` | List developer accounts |
289
- | `thirdParty:getDeveloper` | Get developer details by ID |
290
- | `thirdParty:updateDeveloper` | Update developer information |
291
- | `thirdParty:rotateDeveloperApiKey` | Rotate developer API key |
292
- | `thirdParty:listApps` | List registered apps |
293
- | `thirdParty:createApp` | Register a new app |
294
- | `thirdParty:getApp` | Get app details by ID |
295
- | `thirdParty:updateApp` | Update an app |
296
- | `thirdParty:deleteApp` | Request app deactivation |
297
- | `thirdParty:listWebhooks` | List webhooks |
298
- | `thirdParty:createWebhook` | Create a new webhook |
299
- | `thirdParty:getWebhook` | Get webhook details by ID |
300
- | `thirdParty:updateWebhook` | Update a webhook |
301
- | `thirdParty:deleteWebhook` | Delete a webhook |
302
- | `thirdParty:rotateWebhookSigningKey` | Rotate webhook signing key |
303
-
304
- **Example business descriptions:**
305
- - "A developer portal for managing apps and API keys"
306
- - "A webhook configuration dashboard"
307
- - "A tool for registering and monitoring third-party integrations"
308
-
309
- ---
310
-
311
- ## Inference Examples
312
-
313
- ### Example 1: "A hotel booking app where users can browse rooms and pay with FND"
314
-
315
- | Module | Matched keywords | Permissions |
316
- | ----------- | --------------------------- | ------------------------------------------------ |
317
- | Wallet | pay, FND | `wallet:getBalance`, `wallet:transferFrontierDollar` or `wallet:payWithFrontierDollar` |
318
- | Storage | (always) | `storage:get`, `storage:set` |
319
- | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
320
- | User | users, booking | `user:getDetails`, `user:getProfile` |
321
- | Events | booking, rooms | `events:listLocations`, `events:createRoomBooking` |
322
-
323
- ### Example 2: "A community directory showing all communities and their members"
324
-
325
- | Module | Matched keywords | Permissions |
326
- | ----------- | --------------------------- | ------------------------------------------------ |
327
- | Communities | community, communities, members | `communities:listCommunities`, `communities:getCommunity` |
328
- | Storage | (always) | `storage:get`, `storage:set` |
329
- | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
330
- | User | members | `user:getDetails`, `user:getProfile` |
331
-
332
- ### Example 3: "A subscription management tool for signing up and managing membership plans"
333
-
334
- | Module | Matched keywords | Permissions |
335
- | ----------- | --------------------------- | ------------------------------------------------ |
336
- | Wallet | subscription (payments) | `wallet:getBalance`, `wallet:payWithFrontierDollar` |
337
- | User | signup, membership, managing | `user:getDetails`, `user:getVerifiedAccessControls`, `user:createSignupRequest` |
338
- | Storage | (always) | `storage:get`, `storage:set` |
339
- | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
340
-
341
- ### Example 4: "A sponsor pass distribution tool for event organizers"
342
-
343
- | Module | Matched keywords | Permissions |
344
- | ------------ | --------------------------- | ------------------------------------------------ |
345
- | Partnerships | sponsor, pass | `partnerships:listSponsors`, `partnerships:createSponsorPass` |
346
- | Events | event | `events:listEvents` |
347
- | Storage | (always) | `storage:get`, `storage:set` |
348
- | Chain | (always) | `chain:getCurrentNetwork`, `chain:getContractAddresses` |
349
- | User | organizers | `user:getDetails`, `user:getProfile` |