@keystrokehq/cli 0.0.50 → 0.0.53
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/dist/{cat-TSFMZVYS-COyQw_zT.mjs → cat-TSFMZVYS-BfwZOafs.mjs} +2 -2
- package/dist/{cat-TSFMZVYS-COyQw_zT.mjs.map → cat-TSFMZVYS-BfwZOafs.mjs.map} +1 -1
- package/dist/{cut-OKARJCCV-DAC5beNE.mjs → cut-OKARJCCV-Cm3OStWG.mjs} +2 -2
- package/dist/{cut-OKARJCCV-DAC5beNE.mjs.map → cut-OKARJCCV-Cm3OStWG.mjs.map} +1 -1
- package/dist/{dist-CnoekdhF-nc3ePIKw.mjs → dist-CXHSlVhd-CTQzOALD.mjs} +620 -52
- package/dist/dist-CXHSlVhd-CTQzOALD.mjs.map +1 -0
- package/dist/{du-572XNP42-ClFDz1ub.mjs → du-572XNP42-DeJ11TW7.mjs} +2 -2
- package/dist/{du-572XNP42-ClFDz1ub.mjs.map → du-572XNP42-DeJ11TW7.mjs.map} +1 -1
- package/dist/{emit-route-manifest-DRcNXHCP-CqaK0qtn.mjs → emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs} +194 -16
- package/dist/{emit-route-manifest-DRcNXHCP-CqaK0qtn.mjs.map → emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs.map} +1 -1
- package/dist/index.mjs +2152 -60
- package/dist/index.mjs.map +1 -1
- package/dist/{jq-4XLYLOS5-BWKcXbpD.mjs → jq-4XLYLOS5-DrYXLsYH.mjs} +2 -2
- package/dist/{jq-4XLYLOS5-BWKcXbpD.mjs.map → jq-4XLYLOS5-DrYXLsYH.mjs.map} +1 -1
- package/dist/{ls-ZJGQER7M-DjEDom2D.mjs → ls-ZJGQER7M-C_1bAeGq.mjs} +2 -2
- package/dist/{ls-ZJGQER7M-DjEDom2D.mjs.map → ls-ZJGQER7M-C_1bAeGq.mjs.map} +1 -1
- package/dist/{mistral-nX_EdAQA-BcnqjD2e.mjs → mistral-B75PpahY-Bd3ZQ07v.mjs} +3 -3
- package/dist/{mistral-nX_EdAQA-BcnqjD2e.mjs.map → mistral-B75PpahY-Bd3ZQ07v.mjs.map} +1 -1
- package/dist/skills-bundle/_AGENTS.md +2 -0
- package/dist/skills-bundle/skills/cli/SKILL.md +1 -1
- package/dist/skills-bundle/skills/cli/references/api-targets.md +4 -4
- package/dist/{sort-SW2YEO5B-BGiKfkqv.mjs → sort-SW2YEO5B-D08jaQ5v.mjs} +2 -2
- package/dist/{sort-SW2YEO5B-BGiKfkqv.mjs.map → sort-SW2YEO5B-D08jaQ5v.mjs.map} +1 -1
- package/dist/templates/hello-world/package.json +1 -1
- package/dist/{tree-YLD52CNT-B616RO-w.mjs → tree-YLD52CNT-DiHyiFBi.mjs} +2 -2
- package/dist/{tree-YLD52CNT-B616RO-w.mjs.map → tree-YLD52CNT-DiHyiFBi.mjs.map} +1 -1
- package/dist/{uniq-XSIZR6PB-ByjUQvSp.mjs → uniq-XSIZR6PB-BA-vRB1O.mjs} +2 -2
- package/dist/{uniq-XSIZR6PB-ByjUQvSp.mjs.map → uniq-XSIZR6PB-BA-vRB1O.mjs.map} +1 -1
- package/dist/{wc-LF7NU4LA-C9tSAYz9.mjs → wc-LF7NU4LA-BWoItyXd.mjs} +2 -2
- package/dist/{wc-LF7NU4LA-C9tSAYz9.mjs.map → wc-LF7NU4LA-BWoItyXd.mjs.map} +1 -1
- package/dist/{xan-Y6WF3IRG-FxihFV4-.mjs → xan-Y6WF3IRG-BilR2MsH.mjs} +2 -2
- package/dist/{xan-Y6WF3IRG-FxihFV4-.mjs.map → xan-Y6WF3IRG-BilR2MsH.mjs.map} +1 -1
- package/package.json +18 -18
- package/dist/dist-CnoekdhF-nc3ePIKw.mjs.map +0 -1
- package/dist/skills-bundle/index.cjs +0 -46
- package/dist/skills-bundle/index.cjs.map +0 -1
- package/dist/skills-bundle/index.d.cts +0 -12
- package/dist/skills-bundle/index.d.cts.map +0 -1
- package/dist/skills-bundle/index.d.mts +0 -12
- package/dist/skills-bundle/index.d.mts.map +0 -1
- package/dist/skills-bundle/index.mjs +0 -40
- package/dist/skills-bundle/index.mjs.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -3914,10 +3914,10 @@ var $ZodRegistry = class {
|
|
|
3914
3914
|
return this._map.has(schema);
|
|
3915
3915
|
}
|
|
3916
3916
|
};
|
|
3917
|
-
function registry() {
|
|
3917
|
+
function registry$1() {
|
|
3918
3918
|
return new $ZodRegistry();
|
|
3919
3919
|
}
|
|
3920
|
-
(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry());
|
|
3920
|
+
(_a = globalThis).__zod_globalRegistry ?? (_a.__zod_globalRegistry = registry$1());
|
|
3921
3921
|
const globalRegistry = globalThis.__zod_globalRegistry;
|
|
3922
3922
|
//#endregion
|
|
3923
3923
|
//#region ../../node_modules/.pnpm/zod@4.4.3/node_modules/zod/v4/core/api.js
|
|
@@ -6228,16 +6228,560 @@ const DISCOVERY_CONVENTIONS = {
|
|
|
6228
6228
|
openapi: "GET /openapi.json is built from the same discovery + mount loop as the live server."
|
|
6229
6229
|
};
|
|
6230
6230
|
const ACTIVE_ORG_HEADER = "x-keystroke-org-id";
|
|
6231
|
-
/**
|
|
6232
|
-
const
|
|
6233
|
-
"
|
|
6231
|
+
/** Auth, session, and account-entry URL segments. */
|
|
6232
|
+
const AUTH_ACCOUNT_SLUGS = [
|
|
6233
|
+
"2fa",
|
|
6234
|
+
"accept-invite",
|
|
6235
|
+
"auth",
|
|
6236
|
+
"authorize",
|
|
6237
|
+
"callback",
|
|
6238
|
+
"callbacks",
|
|
6239
|
+
"confirm-email",
|
|
6240
|
+
"confirmation",
|
|
6241
|
+
"connect",
|
|
6234
6242
|
"device",
|
|
6243
|
+
"email-verification",
|
|
6244
|
+
"forgot-password",
|
|
6245
|
+
"invite",
|
|
6246
|
+
"invites",
|
|
6235
6247
|
"login",
|
|
6248
|
+
"logout",
|
|
6249
|
+
"magic-link",
|
|
6250
|
+
"mfa",
|
|
6251
|
+
"oauth",
|
|
6236
6252
|
"onboarding",
|
|
6253
|
+
"password",
|
|
6254
|
+
"recovery",
|
|
6255
|
+
"register",
|
|
6256
|
+
"reset-password",
|
|
6257
|
+
"saml",
|
|
6258
|
+
"session",
|
|
6259
|
+
"sessions",
|
|
6260
|
+
"sign-in",
|
|
6261
|
+
"sign-up",
|
|
6262
|
+
"signin",
|
|
6263
|
+
"signout",
|
|
6264
|
+
"signup",
|
|
6265
|
+
"sso",
|
|
6266
|
+
"token",
|
|
6267
|
+
"tokens",
|
|
6268
|
+
"unlink",
|
|
6269
|
+
"verify",
|
|
6270
|
+
"verify-email"
|
|
6271
|
+
];
|
|
6272
|
+
/** Org, workspace, billing, and account-management URL segments. */
|
|
6273
|
+
const ORG_ACCOUNT_SLUGS = [
|
|
6274
|
+
"account",
|
|
6275
|
+
"accounts",
|
|
6276
|
+
"billing",
|
|
6277
|
+
"console",
|
|
6278
|
+
"invoice",
|
|
6279
|
+
"invoices",
|
|
6280
|
+
"member",
|
|
6281
|
+
"members",
|
|
6282
|
+
"me",
|
|
6283
|
+
"org",
|
|
6237
6284
|
"organization",
|
|
6238
|
-
"
|
|
6285
|
+
"organizations",
|
|
6286
|
+
"orgs",
|
|
6287
|
+
"payment",
|
|
6288
|
+
"payments",
|
|
6289
|
+
"plan",
|
|
6290
|
+
"plans",
|
|
6291
|
+
"portal",
|
|
6292
|
+
"preferences",
|
|
6293
|
+
"profile",
|
|
6294
|
+
"settings",
|
|
6295
|
+
"subscription",
|
|
6296
|
+
"subscriptions",
|
|
6297
|
+
"team",
|
|
6298
|
+
"teams",
|
|
6299
|
+
"upgrade",
|
|
6300
|
+
"usage",
|
|
6301
|
+
"user",
|
|
6302
|
+
"users",
|
|
6303
|
+
"workspace",
|
|
6304
|
+
"workspaces"
|
|
6305
|
+
];
|
|
6306
|
+
/** Product surfaces, resource types, and in-app navigation segments. */
|
|
6307
|
+
const PRODUCT_SLUGS = [
|
|
6308
|
+
"action",
|
|
6309
|
+
"actions",
|
|
6310
|
+
"activity",
|
|
6311
|
+
"agent",
|
|
6312
|
+
"agents",
|
|
6313
|
+
"analytics",
|
|
6314
|
+
"app",
|
|
6315
|
+
"apps",
|
|
6316
|
+
"artifact",
|
|
6317
|
+
"artifacts",
|
|
6318
|
+
"assistant",
|
|
6319
|
+
"assistants",
|
|
6320
|
+
"audit",
|
|
6321
|
+
"audit-log",
|
|
6322
|
+
"automation",
|
|
6323
|
+
"automations",
|
|
6324
|
+
"branch",
|
|
6325
|
+
"branches",
|
|
6326
|
+
"canvas",
|
|
6327
|
+
"chat",
|
|
6328
|
+
"chats",
|
|
6329
|
+
"connection",
|
|
6330
|
+
"connections",
|
|
6331
|
+
"create",
|
|
6332
|
+
"credential",
|
|
6333
|
+
"credentials",
|
|
6334
|
+
"dashboard",
|
|
6335
|
+
"deployment",
|
|
6336
|
+
"deployments",
|
|
6337
|
+
"examples",
|
|
6338
|
+
"execute",
|
|
6339
|
+
"execution",
|
|
6340
|
+
"executions",
|
|
6341
|
+
"explore",
|
|
6342
|
+
"get-started",
|
|
6343
|
+
"history",
|
|
6344
|
+
"inbox",
|
|
6345
|
+
"inspector",
|
|
6346
|
+
"integration",
|
|
6347
|
+
"integrations",
|
|
6348
|
+
"library",
|
|
6349
|
+
"logs",
|
|
6350
|
+
"marketplace",
|
|
6351
|
+
"mcp",
|
|
6352
|
+
"mcps",
|
|
6353
|
+
"new",
|
|
6354
|
+
"notifications",
|
|
6355
|
+
"observe",
|
|
6356
|
+
"plugin",
|
|
6357
|
+
"plugins",
|
|
6358
|
+
"primitive",
|
|
6359
|
+
"primitives",
|
|
6360
|
+
"project",
|
|
6361
|
+
"projects",
|
|
6362
|
+
"recents",
|
|
6363
|
+
"registry",
|
|
6364
|
+
"reports",
|
|
6365
|
+
"run",
|
|
6366
|
+
"runs",
|
|
6367
|
+
"runtime",
|
|
6368
|
+
"runtimes",
|
|
6369
|
+
"sandbox",
|
|
6370
|
+
"sandboxes",
|
|
6371
|
+
"search",
|
|
6372
|
+
"skill",
|
|
6373
|
+
"skills",
|
|
6374
|
+
"templates",
|
|
6375
|
+
"thread",
|
|
6376
|
+
"threads",
|
|
6377
|
+
"trigger",
|
|
6378
|
+
"triggers",
|
|
6379
|
+
"version",
|
|
6380
|
+
"versions",
|
|
6381
|
+
"workflow",
|
|
6382
|
+
"workflows"
|
|
6383
|
+
];
|
|
6384
|
+
/** Marketing, docs, company, and go-to-market URL segments. */
|
|
6385
|
+
const MARKETING_SITE_SLUGS = [
|
|
6386
|
+
"about",
|
|
6387
|
+
"affiliates",
|
|
6388
|
+
"ai",
|
|
6389
|
+
"announcements",
|
|
6390
|
+
"anthropic",
|
|
6391
|
+
"blog",
|
|
6392
|
+
"book-demo",
|
|
6393
|
+
"brand",
|
|
6394
|
+
"campaigns",
|
|
6395
|
+
"career",
|
|
6396
|
+
"careers",
|
|
6397
|
+
"case-studies",
|
|
6398
|
+
"casestudies",
|
|
6399
|
+
"changelog",
|
|
6400
|
+
"chatgpt",
|
|
6401
|
+
"chrome-extension",
|
|
6402
|
+
"claude",
|
|
6403
|
+
"codex",
|
|
6404
|
+
"community",
|
|
6405
|
+
"company",
|
|
6406
|
+
"compare",
|
|
6407
|
+
"contact",
|
|
6408
|
+
"contribute",
|
|
6409
|
+
"creators",
|
|
6410
|
+
"customers",
|
|
6411
|
+
"demo",
|
|
6412
|
+
"demos",
|
|
6413
|
+
"discord",
|
|
6414
|
+
"docs",
|
|
6415
|
+
"documentation",
|
|
6416
|
+
"download",
|
|
6417
|
+
"downloads",
|
|
6418
|
+
"dust",
|
|
6419
|
+
"emerging-talent",
|
|
6420
|
+
"engineering-blog",
|
|
6421
|
+
"enterprise",
|
|
6422
|
+
"events",
|
|
6423
|
+
"experts",
|
|
6424
|
+
"extension",
|
|
6425
|
+
"faq",
|
|
6426
|
+
"faqs",
|
|
6427
|
+
"features",
|
|
6428
|
+
"forum",
|
|
6429
|
+
"glean",
|
|
6430
|
+
"grok",
|
|
6431
|
+
"guide",
|
|
6432
|
+
"guides",
|
|
6433
|
+
"gumloop",
|
|
6434
|
+
"handbook",
|
|
6435
|
+
"help",
|
|
6436
|
+
"help-center",
|
|
6437
|
+
"home",
|
|
6438
|
+
"how-it-works",
|
|
6439
|
+
"howitworks",
|
|
6440
|
+
"inspo",
|
|
6441
|
+
"intern",
|
|
6442
|
+
"investors",
|
|
6443
|
+
"jobs",
|
|
6444
|
+
"keystroke",
|
|
6445
|
+
"legal",
|
|
6446
|
+
"lindy",
|
|
6447
|
+
"llm",
|
|
6448
|
+
"llms",
|
|
6449
|
+
"love",
|
|
6450
|
+
"make",
|
|
6451
|
+
"manifesto",
|
|
6452
|
+
"media",
|
|
6453
|
+
"merch",
|
|
6454
|
+
"mission",
|
|
6455
|
+
"mobile",
|
|
6456
|
+
"models",
|
|
6457
|
+
"n8n",
|
|
6458
|
+
"news",
|
|
6459
|
+
"newsroom",
|
|
6460
|
+
"open",
|
|
6461
|
+
"open-claw",
|
|
6462
|
+
"open-source",
|
|
6463
|
+
"openai",
|
|
6464
|
+
"our-story",
|
|
6465
|
+
"overview",
|
|
6466
|
+
"partners",
|
|
6467
|
+
"pi",
|
|
6468
|
+
"pipedream",
|
|
6469
|
+
"platform",
|
|
6470
|
+
"press",
|
|
6471
|
+
"press-kit",
|
|
6472
|
+
"pricing",
|
|
6473
|
+
"privacy",
|
|
6474
|
+
"product",
|
|
6475
|
+
"products",
|
|
6476
|
+
"provider",
|
|
6477
|
+
"providers",
|
|
6478
|
+
"quick-start",
|
|
6479
|
+
"quickstart",
|
|
6480
|
+
"refer",
|
|
6481
|
+
"relay",
|
|
6482
|
+
"relay-app",
|
|
6483
|
+
"reporting",
|
|
6484
|
+
"request-demo",
|
|
6485
|
+
"resources",
|
|
6486
|
+
"roadmap",
|
|
6487
|
+
"schedule-demo",
|
|
6488
|
+
"security",
|
|
6489
|
+
"solutions",
|
|
6490
|
+
"stack-ai",
|
|
6491
|
+
"stackai",
|
|
6492
|
+
"startup",
|
|
6493
|
+
"startups",
|
|
6494
|
+
"status",
|
|
6495
|
+
"stories",
|
|
6496
|
+
"story",
|
|
6497
|
+
"students",
|
|
6498
|
+
"support",
|
|
6499
|
+
"swag",
|
|
6500
|
+
"switch",
|
|
6501
|
+
"talent",
|
|
6502
|
+
"terms",
|
|
6503
|
+
"testimonials",
|
|
6504
|
+
"thesis",
|
|
6505
|
+
"tines",
|
|
6506
|
+
"trust",
|
|
6507
|
+
"tutorials",
|
|
6508
|
+
"university",
|
|
6509
|
+
"use-case",
|
|
6510
|
+
"use-cases",
|
|
6511
|
+
"usecases",
|
|
6512
|
+
"versus",
|
|
6513
|
+
"vellum",
|
|
6514
|
+
"vs",
|
|
6515
|
+
"webinars",
|
|
6516
|
+
"workato",
|
|
6517
|
+
"xai",
|
|
6518
|
+
"yc",
|
|
6519
|
+
"zapier"
|
|
6520
|
+
];
|
|
6521
|
+
/** Integrations, competitors, and partner brand slugs (marketing / integration pages). */
|
|
6522
|
+
const INTEGRATION_BRAND_SLUGS = [
|
|
6523
|
+
"airtable",
|
|
6524
|
+
"asana",
|
|
6525
|
+
"aws",
|
|
6526
|
+
"azure",
|
|
6527
|
+
"bun",
|
|
6528
|
+
"confluence",
|
|
6529
|
+
"copilot",
|
|
6530
|
+
"cursor",
|
|
6531
|
+
"databricks",
|
|
6532
|
+
"figma",
|
|
6533
|
+
"firebase",
|
|
6534
|
+
"fly",
|
|
6535
|
+
"gcp",
|
|
6536
|
+
"gemini",
|
|
6537
|
+
"github",
|
|
6538
|
+
"gitlab",
|
|
6539
|
+
"gmail",
|
|
6540
|
+
"heroku",
|
|
6541
|
+
"hubspot",
|
|
6542
|
+
"huggingface",
|
|
6543
|
+
"jira",
|
|
6544
|
+
"linear",
|
|
6545
|
+
"mailchimp",
|
|
6546
|
+
"meta",
|
|
6547
|
+
"mistral",
|
|
6548
|
+
"mixmax",
|
|
6549
|
+
"monday",
|
|
6550
|
+
"netlify",
|
|
6551
|
+
"neon",
|
|
6552
|
+
"notion",
|
|
6553
|
+
"npm",
|
|
6554
|
+
"outlook",
|
|
6555
|
+
"outreach",
|
|
6556
|
+
"perplexity",
|
|
6557
|
+
"planetscale",
|
|
6558
|
+
"pnpm",
|
|
6559
|
+
"postmark",
|
|
6560
|
+
"ramp",
|
|
6561
|
+
"railway",
|
|
6562
|
+
"render",
|
|
6563
|
+
"resend",
|
|
6564
|
+
"salesforce",
|
|
6565
|
+
"segment",
|
|
6566
|
+
"sendgrid",
|
|
6567
|
+
"shopify",
|
|
6568
|
+
"slack",
|
|
6569
|
+
"snowflake",
|
|
6570
|
+
"stripe",
|
|
6571
|
+
"supabase",
|
|
6572
|
+
"terraform",
|
|
6573
|
+
"trello",
|
|
6574
|
+
"turso",
|
|
6575
|
+
"twilio",
|
|
6576
|
+
"typeform",
|
|
6577
|
+
"vercel",
|
|
6578
|
+
"vscode",
|
|
6579
|
+
"windsurf",
|
|
6580
|
+
"yarn"
|
|
6581
|
+
];
|
|
6582
|
+
/** Company, team, and department landing-page segments. */
|
|
6583
|
+
const COMPANY_TEAM_SLUGS = [
|
|
6584
|
+
"engineers",
|
|
6585
|
+
"engineering",
|
|
6586
|
+
"executives",
|
|
6587
|
+
"hc",
|
|
6588
|
+
"intern",
|
|
6589
|
+
"it",
|
|
6590
|
+
"leadership",
|
|
6591
|
+
"marketing",
|
|
6592
|
+
"ops",
|
|
6593
|
+
"revops",
|
|
6594
|
+
"sales",
|
|
6595
|
+
"services",
|
|
6596
|
+
"tech"
|
|
6597
|
+
];
|
|
6598
|
+
/** Legal, trust, compliance, and policy URL segments. */
|
|
6599
|
+
const LEGAL_TRUST_SLUGS = [
|
|
6600
|
+
"accessibility",
|
|
6601
|
+
"agreement",
|
|
6602
|
+
"a11y",
|
|
6603
|
+
"bug-bounty",
|
|
6604
|
+
"compliance",
|
|
6605
|
+
"cookie-policy",
|
|
6606
|
+
"cookies",
|
|
6607
|
+
"disclose",
|
|
6608
|
+
"dpa",
|
|
6609
|
+
"eula",
|
|
6610
|
+
"gdpr",
|
|
6611
|
+
"hipaa",
|
|
6612
|
+
"iso",
|
|
6613
|
+
"msa",
|
|
6614
|
+
"pci",
|
|
6615
|
+
"responsible-disclosure",
|
|
6616
|
+
"sla",
|
|
6617
|
+
"soc2",
|
|
6618
|
+
"tos",
|
|
6619
|
+
"trust-center",
|
|
6620
|
+
"trustcenter",
|
|
6621
|
+
"vulnerability"
|
|
6622
|
+
];
|
|
6623
|
+
/** Developer, API, CLI, and technical URL segments. */
|
|
6624
|
+
const DEVELOPER_TECH_SLUGS = [
|
|
6625
|
+
"api",
|
|
6626
|
+
"api-docs",
|
|
6627
|
+
"cli",
|
|
6628
|
+
"code",
|
|
6629
|
+
"config",
|
|
6630
|
+
"developer",
|
|
6631
|
+
"developer-tools",
|
|
6632
|
+
"developers",
|
|
6633
|
+
"dev-tools",
|
|
6634
|
+
"devtools",
|
|
6635
|
+
"dev",
|
|
6636
|
+
"dev-states",
|
|
6637
|
+
"graphql",
|
|
6638
|
+
"graphql-playground",
|
|
6639
|
+
"mcp-server",
|
|
6640
|
+
"mcp-servers",
|
|
6641
|
+
"openapi",
|
|
6642
|
+
"sdk",
|
|
6643
|
+
"swagger"
|
|
6644
|
+
];
|
|
6645
|
+
/** Infra, ops, static assets, and system URL segments. */
|
|
6646
|
+
const INFRA_SYSTEM_SLUGS = [
|
|
6647
|
+
"acme-challenge",
|
|
6648
|
+
"admin",
|
|
6649
|
+
"apple-app-site-association",
|
|
6650
|
+
"assets",
|
|
6651
|
+
"batch",
|
|
6652
|
+
"cache",
|
|
6653
|
+
"cdn",
|
|
6654
|
+
"cron",
|
|
6655
|
+
"debug",
|
|
6656
|
+
"error",
|
|
6657
|
+
"errors",
|
|
6658
|
+
"favicon",
|
|
6659
|
+
"feed",
|
|
6660
|
+
"files",
|
|
6661
|
+
"health",
|
|
6662
|
+
"healthcheck",
|
|
6663
|
+
"healthz",
|
|
6664
|
+
"hooks",
|
|
6665
|
+
"internal",
|
|
6666
|
+
"item",
|
|
6667
|
+
"manifest",
|
|
6668
|
+
"metrics",
|
|
6669
|
+
"null",
|
|
6670
|
+
"ping",
|
|
6671
|
+
"prod",
|
|
6672
|
+
"public",
|
|
6673
|
+
"redirect",
|
|
6674
|
+
"robots",
|
|
6675
|
+
"rpc",
|
|
6676
|
+
"rss",
|
|
6677
|
+
"sharer",
|
|
6678
|
+
"sitemap",
|
|
6679
|
+
"staging",
|
|
6680
|
+
"static",
|
|
6681
|
+
"storage",
|
|
6682
|
+
"test",
|
|
6683
|
+
"undefined",
|
|
6684
|
+
"universal",
|
|
6685
|
+
"webhooks",
|
|
6686
|
+
"well-known",
|
|
6687
|
+
"www"
|
|
6688
|
+
];
|
|
6689
|
+
/** Reserved slugs that are valid org names in theory but blocked for routing safety. */
|
|
6690
|
+
const ROUTING_SAFETY_SLUGS = [
|
|
6691
|
+
"alpha",
|
|
6692
|
+
"anonymous",
|
|
6693
|
+
"archive",
|
|
6694
|
+
"archived",
|
|
6695
|
+
"beta",
|
|
6696
|
+
"clone",
|
|
6697
|
+
"copy",
|
|
6698
|
+
"default",
|
|
6699
|
+
"deleted",
|
|
6700
|
+
"demo-org",
|
|
6701
|
+
"draft",
|
|
6702
|
+
"drafts",
|
|
6703
|
+
"duplicate",
|
|
6704
|
+
"early-access",
|
|
6705
|
+
"embed",
|
|
6706
|
+
"embedded",
|
|
6707
|
+
"export",
|
|
6708
|
+
"fork",
|
|
6709
|
+
"free",
|
|
6710
|
+
"guest",
|
|
6711
|
+
"import",
|
|
6712
|
+
"index",
|
|
6713
|
+
"list",
|
|
6714
|
+
"manage",
|
|
6715
|
+
"moderator",
|
|
6716
|
+
"newsletter",
|
|
6717
|
+
"owner",
|
|
6718
|
+
"preview",
|
|
6719
|
+
"previews",
|
|
6720
|
+
"private",
|
|
6721
|
+
"pro",
|
|
6722
|
+
"public-api",
|
|
6723
|
+
"publish",
|
|
6724
|
+
"published",
|
|
6725
|
+
"queue",
|
|
6726
|
+
"remove",
|
|
6727
|
+
"root",
|
|
6728
|
+
"sample",
|
|
6729
|
+
"samples",
|
|
6730
|
+
"selection",
|
|
6731
|
+
"share",
|
|
6732
|
+
"shared",
|
|
6733
|
+
"sponsor",
|
|
6734
|
+
"sponsors",
|
|
6735
|
+
"sponsorship",
|
|
6736
|
+
"subscribe",
|
|
6737
|
+
"super",
|
|
6738
|
+
"superuser",
|
|
6739
|
+
"system",
|
|
6740
|
+
"sys",
|
|
6741
|
+
"test-org",
|
|
6742
|
+
"trash",
|
|
6743
|
+
"unpublish",
|
|
6744
|
+
"unsubscribe",
|
|
6745
|
+
"upload",
|
|
6746
|
+
"uploads",
|
|
6747
|
+
"waitlist",
|
|
6748
|
+
"widget",
|
|
6749
|
+
"widgets",
|
|
6750
|
+
"worker",
|
|
6751
|
+
"workers"
|
|
6752
|
+
];
|
|
6753
|
+
/**
|
|
6754
|
+
* URL segments reserved for global (non-org) routes — cannot be used as an org slug.
|
|
6755
|
+
* Prefer adding new entries to the category arrays above; the Set is the enforcement surface.
|
|
6756
|
+
*/
|
|
6757
|
+
const RESERVED_ORGANIZATION_SLUGS = new Set([
|
|
6758
|
+
...AUTH_ACCOUNT_SLUGS,
|
|
6759
|
+
...ORG_ACCOUNT_SLUGS,
|
|
6760
|
+
...PRODUCT_SLUGS,
|
|
6761
|
+
...MARKETING_SITE_SLUGS,
|
|
6762
|
+
...INTEGRATION_BRAND_SLUGS,
|
|
6763
|
+
...COMPANY_TEAM_SLUGS,
|
|
6764
|
+
...LEGAL_TRUST_SLUGS,
|
|
6765
|
+
...DEVELOPER_TECH_SLUGS,
|
|
6766
|
+
...INFRA_SYSTEM_SLUGS,
|
|
6767
|
+
...ROUTING_SAFETY_SLUGS
|
|
6239
6768
|
]);
|
|
6240
|
-
|
|
6769
|
+
/**
|
|
6770
|
+
* Base slug format: lowercase, 2-64 chars, alphanumeric + dashes.
|
|
6771
|
+
*
|
|
6772
|
+
* IMPORTANT: this is the schema for *reading* slugs (persisted rows, API
|
|
6773
|
+
* responses). It intentionally does NOT enforce the reserved-name list — an org
|
|
6774
|
+
* created before a name became reserved must still parse on read. Use
|
|
6775
|
+
* `ClaimableOrganizationSlugSchema` to validate slugs a user is trying to claim.
|
|
6776
|
+
*/
|
|
6777
|
+
const OrganizationSlugSchema = string().trim().toLowerCase().min(2, "Slug must be at least 2 characters").max(64, "Slug must be at most 64 characters").regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, "Use lowercase letters, numbers, and dashes only");
|
|
6778
|
+
/**
|
|
6779
|
+
* Slug validation for *claiming* a slug (organization create/rename). Adds the
|
|
6780
|
+
* reserved-name check on top of the base format. Never use this to parse
|
|
6781
|
+
* existing org data, or pre-existing orgs whose slug later became reserved would
|
|
6782
|
+
* fail to load.
|
|
6783
|
+
*/
|
|
6784
|
+
const ClaimableOrganizationSlugSchema = OrganizationSlugSchema.refine((slug) => !RESERVED_ORGANIZATION_SLUGS.has(slug), "This slug is reserved");
|
|
6241
6785
|
/** Browser→platform request budget (ping + small platform overhead). */
|
|
6242
6786
|
const PROJECT_REACHABILITY_REQUEST_TIMEOUT_MS = 17e3;
|
|
6243
6787
|
/** TCP port to bind for a local server, derived from a public URL. */
|
|
@@ -6312,13 +6856,81 @@ function toCredentialRequirement(item) {
|
|
|
6312
6856
|
...item.tokenField !== void 0 ? { tokenField: item.tokenField } : {}
|
|
6313
6857
|
};
|
|
6314
6858
|
}
|
|
6859
|
+
const OrganizationSlugErrorCodeSchema = _enum([
|
|
6860
|
+
"slug_taken",
|
|
6861
|
+
"slug_reserved",
|
|
6862
|
+
"slug_invalid"
|
|
6863
|
+
]);
|
|
6864
|
+
const SlugAvailabilityReasonSchema = _enum([
|
|
6865
|
+
"taken",
|
|
6866
|
+
"reserved",
|
|
6867
|
+
"invalid"
|
|
6868
|
+
]);
|
|
6869
|
+
const SlugAvailabilityResponseSchema = object({
|
|
6870
|
+
slug: string(),
|
|
6871
|
+
available: boolean$2(),
|
|
6872
|
+
reason: SlugAvailabilityReasonSchema.optional(),
|
|
6873
|
+
suggestion: OrganizationSlugSchema.optional()
|
|
6874
|
+
});
|
|
6875
|
+
object({
|
|
6876
|
+
slug: string().trim().min(1),
|
|
6877
|
+
excludeOrganizationId: string().min(1).optional()
|
|
6878
|
+
});
|
|
6879
|
+
const ProjectStatusSchema = _enum([
|
|
6880
|
+
"inactive",
|
|
6881
|
+
"starting",
|
|
6882
|
+
"active",
|
|
6883
|
+
"failed"
|
|
6884
|
+
]);
|
|
6885
|
+
const OrganizationUserRoleSchema = _enum(["admin"]);
|
|
6886
|
+
const isoDateTime$1 = string().datetime();
|
|
6887
|
+
const OrganizationSchema = object({
|
|
6888
|
+
id: string(),
|
|
6889
|
+
name: string(),
|
|
6890
|
+
slug: OrganizationSlugSchema,
|
|
6891
|
+
createdAt: isoDateTime$1,
|
|
6892
|
+
updatedAt: isoDateTime$1
|
|
6893
|
+
});
|
|
6894
|
+
const ProjectSchema = object({
|
|
6895
|
+
id: string(),
|
|
6896
|
+
organizationId: string(),
|
|
6897
|
+
name: string(),
|
|
6898
|
+
status: ProjectStatusSchema,
|
|
6899
|
+
baseUrl: string().nullable(),
|
|
6900
|
+
runtimeId: string().nullable(),
|
|
6901
|
+
lastError: string().nullable(),
|
|
6902
|
+
createdAt: isoDateTime$1,
|
|
6903
|
+
updatedAt: isoDateTime$1
|
|
6904
|
+
});
|
|
6905
|
+
const UserOrganizationSchema = object({
|
|
6906
|
+
organization: OrganizationSchema,
|
|
6907
|
+
role: OrganizationUserRoleSchema
|
|
6908
|
+
});
|
|
6909
|
+
const ActiveOrganizationResponseSchema = object({ organization: UserOrganizationSchema.nullable() });
|
|
6910
|
+
const ListOrganizationsResponseSchema = object({ organizations: array(UserOrganizationSchema) });
|
|
6911
|
+
const SetActiveOrganizationRequestSchema = object({ organizationId: string().min(1) });
|
|
6912
|
+
const CreateOrganizationRequestSchema = object({
|
|
6913
|
+
name: string().trim().min(1),
|
|
6914
|
+
/** Format-only at the wire boundary; reserved-name checks run in platform-database. */
|
|
6915
|
+
slug: OrganizationSlugSchema.optional()
|
|
6916
|
+
});
|
|
6917
|
+
const UpdateOrganizationRequestSchema = object({ slug: ClaimableOrganizationSlugSchema });
|
|
6918
|
+
const CreateOrganizationResponseSchema = object({ organization: UserOrganizationSchema });
|
|
6919
|
+
const ListProjectsResponseSchema = object({ projects: array(ProjectSchema) });
|
|
6920
|
+
const CreateProjectRequestSchema = object({ name: string().trim().min(1) });
|
|
6921
|
+
const CreateProjectResponseSchema = object({ project: ProjectSchema });
|
|
6922
|
+
const ProjectResponseSchema = object({ project: ProjectSchema });
|
|
6923
|
+
const ProjectReachabilityResponseSchema = object({ reachable: boolean$2() });
|
|
6315
6924
|
const ValidationErrorDetailSchema = object({
|
|
6316
6925
|
path: string(),
|
|
6317
6926
|
message: string()
|
|
6318
6927
|
});
|
|
6928
|
+
/** Machine-readable codes returned in standard API error bodies. */
|
|
6929
|
+
const ErrorResponseCodeSchema = OrganizationSlugErrorCodeSchema.or(_enum(["needs_org_selection"]));
|
|
6319
6930
|
/** Standard JSON error body returned by the HTTP API. */
|
|
6320
6931
|
const ErrorResponseSchema = object({
|
|
6321
6932
|
error: string(),
|
|
6933
|
+
code: ErrorResponseCodeSchema.optional(),
|
|
6322
6934
|
message: string().optional(),
|
|
6323
6935
|
details: array(ValidationErrorDetailSchema).optional()
|
|
6324
6936
|
});
|
|
@@ -6751,50 +7363,6 @@ const TriggerListItemSchema = object({
|
|
|
6751
7363
|
});
|
|
6752
7364
|
const TriggerListResponseSchema = object({ triggers: array(TriggerListItemSchema) });
|
|
6753
7365
|
const TriggerDetailResponseSchema = TriggerListItemSchema;
|
|
6754
|
-
const ProjectStatusSchema = _enum([
|
|
6755
|
-
"inactive",
|
|
6756
|
-
"starting",
|
|
6757
|
-
"active",
|
|
6758
|
-
"failed"
|
|
6759
|
-
]);
|
|
6760
|
-
const OrganizationUserRoleSchema = _enum(["admin"]);
|
|
6761
|
-
const isoDateTime$1 = string().datetime();
|
|
6762
|
-
const OrganizationSchema = object({
|
|
6763
|
-
id: string(),
|
|
6764
|
-
name: string(),
|
|
6765
|
-
slug: OrganizationSlugSchema,
|
|
6766
|
-
createdAt: isoDateTime$1,
|
|
6767
|
-
updatedAt: isoDateTime$1
|
|
6768
|
-
});
|
|
6769
|
-
const ProjectSchema = object({
|
|
6770
|
-
id: string(),
|
|
6771
|
-
organizationId: string(),
|
|
6772
|
-
name: string(),
|
|
6773
|
-
status: ProjectStatusSchema,
|
|
6774
|
-
baseUrl: string().nullable(),
|
|
6775
|
-
runtimeId: string().nullable(),
|
|
6776
|
-
lastError: string().nullable(),
|
|
6777
|
-
createdAt: isoDateTime$1,
|
|
6778
|
-
updatedAt: isoDateTime$1
|
|
6779
|
-
});
|
|
6780
|
-
const UserOrganizationSchema = object({
|
|
6781
|
-
organization: OrganizationSchema,
|
|
6782
|
-
role: OrganizationUserRoleSchema
|
|
6783
|
-
});
|
|
6784
|
-
const ActiveOrganizationResponseSchema = object({ organization: UserOrganizationSchema.nullable() });
|
|
6785
|
-
const ListOrganizationsResponseSchema = object({ organizations: array(UserOrganizationSchema) });
|
|
6786
|
-
const SetActiveOrganizationRequestSchema = object({ organizationId: string().min(1) });
|
|
6787
|
-
const CreateOrganizationRequestSchema = object({
|
|
6788
|
-
name: string().trim().min(1),
|
|
6789
|
-
slug: OrganizationSlugSchema.optional()
|
|
6790
|
-
});
|
|
6791
|
-
const UpdateOrganizationRequestSchema = object({ slug: OrganizationSlugSchema });
|
|
6792
|
-
const CreateOrganizationResponseSchema = object({ organization: UserOrganizationSchema });
|
|
6793
|
-
const ListProjectsResponseSchema = object({ projects: array(ProjectSchema) });
|
|
6794
|
-
const CreateProjectRequestSchema = object({ name: string().trim().min(1) });
|
|
6795
|
-
const CreateProjectResponseSchema = object({ project: ProjectSchema });
|
|
6796
|
-
const ProjectResponseSchema = object({ project: ProjectSchema });
|
|
6797
|
-
const ProjectReachabilityResponseSchema = object({ reachable: boolean$2() });
|
|
6798
7366
|
const ProjectArtifactStatusSchema = _enum(["pending", "ready"]);
|
|
6799
7367
|
const isoDateTime = string().datetime();
|
|
6800
7368
|
const ProjectArtifactSchema = object({
|
|
@@ -6874,7 +7442,7 @@ function detailSearchParams$2(query) {
|
|
|
6874
7442
|
if (!query?.include) return {};
|
|
6875
7443
|
return { include: query.include };
|
|
6876
7444
|
}
|
|
6877
|
-
function createAgentsResource(http) {
|
|
7445
|
+
function createAgentsResource$1(http) {
|
|
6878
7446
|
return {
|
|
6879
7447
|
async prompt(id, input) {
|
|
6880
7448
|
const body = PromptInputSchema.parse(input);
|
|
@@ -6928,7 +7496,7 @@ function createConnectResource(http) {
|
|
|
6928
7496
|
}
|
|
6929
7497
|
};
|
|
6930
7498
|
}
|
|
6931
|
-
function createCredentialsResource(http) {
|
|
7499
|
+
function createCredentialsResource$1(http) {
|
|
6932
7500
|
return {
|
|
6933
7501
|
async listInstances(options) {
|
|
6934
7502
|
try {
|
|
@@ -7090,7 +7658,7 @@ function detailSearchParams(query) {
|
|
|
7090
7658
|
if (!query?.include) return {};
|
|
7091
7659
|
return { include: query.include };
|
|
7092
7660
|
}
|
|
7093
|
-
function createWorkflowsResource(http) {
|
|
7661
|
+
function createWorkflowsResource$1(http) {
|
|
7094
7662
|
return {
|
|
7095
7663
|
async run(id, input = {}) {
|
|
7096
7664
|
try {
|
|
@@ -7137,10 +7705,10 @@ function createKeystrokeClient(options) {
|
|
|
7137
7705
|
http,
|
|
7138
7706
|
health: createHealthResource$1(http),
|
|
7139
7707
|
connect: createConnectResource(http),
|
|
7140
|
-
credentials: createCredentialsResource(http),
|
|
7708
|
+
credentials: createCredentialsResource$1(http),
|
|
7141
7709
|
openapi: createOpenApiResource(http),
|
|
7142
|
-
agents: createAgentsResource(http),
|
|
7143
|
-
workflows: createWorkflowsResource(http),
|
|
7710
|
+
agents: createAgentsResource$1(http),
|
|
7711
|
+
workflows: createWorkflowsResource$1(http),
|
|
7144
7712
|
triggers: createTriggersResource(http)
|
|
7145
7713
|
};
|
|
7146
7714
|
}
|
|
@@ -7252,11 +7820,13 @@ function kyCredentials(auth) {
|
|
|
7252
7820
|
var PlatformError = class extends Error {
|
|
7253
7821
|
status;
|
|
7254
7822
|
body;
|
|
7255
|
-
|
|
7823
|
+
code;
|
|
7824
|
+
constructor(message, status, body, code) {
|
|
7256
7825
|
super(message);
|
|
7257
7826
|
this.name = "PlatformError";
|
|
7258
7827
|
this.status = status;
|
|
7259
7828
|
this.body = body;
|
|
7829
|
+
this.code = code;
|
|
7260
7830
|
}
|
|
7261
7831
|
};
|
|
7262
7832
|
async function toPlatformError(error) {
|
|
@@ -7264,7 +7834,7 @@ async function toPlatformError(error) {
|
|
|
7264
7834
|
const status = error.response.status;
|
|
7265
7835
|
const body = error.data ?? null;
|
|
7266
7836
|
const parsed = ErrorResponseSchema.safeParse(body);
|
|
7267
|
-
return new PlatformError(parsed.success ? parsed.data.error : `Request failed with status ${status}`, status, body);
|
|
7837
|
+
return new PlatformError(parsed.success ? parsed.data.error : `Request failed with status ${status}`, status, body, parsed.success ? parsed.data.code : void 0);
|
|
7268
7838
|
}
|
|
7269
7839
|
function createArtifactsResource(http) {
|
|
7270
7840
|
return {
|
|
@@ -7354,6 +7924,16 @@ function createOrganizationsResource(http, options = {}) {
|
|
|
7354
7924
|
} catch (error) {
|
|
7355
7925
|
throw await toPlatformError(error);
|
|
7356
7926
|
}
|
|
7927
|
+
},
|
|
7928
|
+
async checkSlug(slug, options = {}) {
|
|
7929
|
+
const searchParams = new URLSearchParams({ slug });
|
|
7930
|
+
if (options.excludeOrganizationId) searchParams.set("excludeOrganizationId", options.excludeOrganizationId);
|
|
7931
|
+
try {
|
|
7932
|
+
const data = await http.get(`/api/organizations/slug-available?${searchParams}`).json();
|
|
7933
|
+
return SlugAvailabilityResponseSchema.parse(data);
|
|
7934
|
+
} catch (error) {
|
|
7935
|
+
throw await toPlatformError(error);
|
|
7936
|
+
}
|
|
7357
7937
|
}
|
|
7358
7938
|
};
|
|
7359
7939
|
}
|
|
@@ -7394,6 +7974,1506 @@ function createProjectsResource(http) {
|
|
|
7394
7974
|
}
|
|
7395
7975
|
};
|
|
7396
7976
|
}
|
|
7977
|
+
const registry = /* @__PURE__ */ new Map();
|
|
7978
|
+
/**
|
|
7979
|
+
* Wraps a mock implementation, registering it in the manifest. The returned
|
|
7980
|
+
* function is the unchanged implementation — `mock()` only adds bookkeeping.
|
|
7981
|
+
*/
|
|
7982
|
+
function mock(entry, impl) {
|
|
7983
|
+
registry.set(`${entry.domain}.${entry.method}`, entry);
|
|
7984
|
+
return impl;
|
|
7985
|
+
}
|
|
7986
|
+
/**
|
|
7987
|
+
* The supported-app catalog shown in the "Connect an app" picker. Mirrors the
|
|
7988
|
+
* curated integration list from keystroke-mockups. No connected/available flag:
|
|
7989
|
+
* "connected" is not a property of an app, it's whether a credential exists.
|
|
7990
|
+
*/
|
|
7991
|
+
const appCatalogSeed = [
|
|
7992
|
+
{
|
|
7993
|
+
id: "app-gmail",
|
|
7994
|
+
name: "Gmail",
|
|
7995
|
+
description: "Email trigger and delivery integration.",
|
|
7996
|
+
category: "Communication"
|
|
7997
|
+
},
|
|
7998
|
+
{
|
|
7999
|
+
id: "app-slack",
|
|
8000
|
+
name: "Slack",
|
|
8001
|
+
description: "Post messages and handle approvals via Slack channels.",
|
|
8002
|
+
category: "Communication"
|
|
8003
|
+
},
|
|
8004
|
+
{
|
|
8005
|
+
id: "app-github",
|
|
8006
|
+
name: "GitHub",
|
|
8007
|
+
description: "React to repo events and manage pull requests.",
|
|
8008
|
+
category: "Development"
|
|
8009
|
+
},
|
|
8010
|
+
{
|
|
8011
|
+
id: "app-anthropic",
|
|
8012
|
+
name: "Anthropic",
|
|
8013
|
+
description: "Claude models for agent and workflow AI steps.",
|
|
8014
|
+
category: "AI"
|
|
8015
|
+
},
|
|
8016
|
+
{
|
|
8017
|
+
id: "app-attio",
|
|
8018
|
+
name: "Attio",
|
|
8019
|
+
description: "CRM operations for deals, contacts, and notes.",
|
|
8020
|
+
category: "CRM"
|
|
8021
|
+
},
|
|
8022
|
+
{
|
|
8023
|
+
id: "app-openai",
|
|
8024
|
+
name: "OpenAI",
|
|
8025
|
+
description: "GPT models and embeddings for AI-powered steps.",
|
|
8026
|
+
category: "AI"
|
|
8027
|
+
},
|
|
8028
|
+
{
|
|
8029
|
+
id: "app-airtable",
|
|
8030
|
+
name: "Airtable",
|
|
8031
|
+
description: "Read and write records in Airtable bases.",
|
|
8032
|
+
category: "Data"
|
|
8033
|
+
},
|
|
8034
|
+
{
|
|
8035
|
+
id: "app-google-sheets",
|
|
8036
|
+
name: "Google Sheets",
|
|
8037
|
+
description: "Read, update, and append rows in spreadsheets.",
|
|
8038
|
+
category: "Data"
|
|
8039
|
+
},
|
|
8040
|
+
{
|
|
8041
|
+
id: "app-google-drive",
|
|
8042
|
+
name: "Google Drive",
|
|
8043
|
+
description: "Find, read, and organize files across shared drives.",
|
|
8044
|
+
category: "Productivity"
|
|
8045
|
+
},
|
|
8046
|
+
{
|
|
8047
|
+
id: "app-google-calendar",
|
|
8048
|
+
name: "Google Calendar",
|
|
8049
|
+
description: "Create events, check availability, and coordinate meetings.",
|
|
8050
|
+
category: "Productivity"
|
|
8051
|
+
},
|
|
8052
|
+
{
|
|
8053
|
+
id: "app-notion",
|
|
8054
|
+
name: "Notion",
|
|
8055
|
+
description: "Query databases, create pages, and update workspace docs.",
|
|
8056
|
+
category: "Productivity"
|
|
8057
|
+
},
|
|
8058
|
+
{
|
|
8059
|
+
id: "app-linear",
|
|
8060
|
+
name: "Linear",
|
|
8061
|
+
description: "Create issues, update triage queues, and comment on work.",
|
|
8062
|
+
category: "Development"
|
|
8063
|
+
},
|
|
8064
|
+
{
|
|
8065
|
+
id: "app-jira",
|
|
8066
|
+
name: "Jira",
|
|
8067
|
+
description: "Sync issues, transitions, comments, and project fields.",
|
|
8068
|
+
category: "Development"
|
|
8069
|
+
},
|
|
8070
|
+
{
|
|
8071
|
+
id: "app-asana",
|
|
8072
|
+
name: "Asana",
|
|
8073
|
+
description: "Create tasks, update projects, and track team work.",
|
|
8074
|
+
category: "Project Management"
|
|
8075
|
+
},
|
|
8076
|
+
{
|
|
8077
|
+
id: "app-trello",
|
|
8078
|
+
name: "Trello",
|
|
8079
|
+
description: "Move cards, update boards, and automate checklist work.",
|
|
8080
|
+
category: "Project Management"
|
|
8081
|
+
},
|
|
8082
|
+
{
|
|
8083
|
+
id: "app-clickup",
|
|
8084
|
+
name: "ClickUp",
|
|
8085
|
+
description: "Manage tasks, docs, custom fields, and workspace automations.",
|
|
8086
|
+
category: "Project Management"
|
|
8087
|
+
},
|
|
8088
|
+
{
|
|
8089
|
+
id: "app-monday",
|
|
8090
|
+
name: "monday.com",
|
|
8091
|
+
description: "Automate boards, items, updates, and team workflows.",
|
|
8092
|
+
category: "Project Management"
|
|
8093
|
+
},
|
|
8094
|
+
{
|
|
8095
|
+
id: "app-discord",
|
|
8096
|
+
name: "Discord",
|
|
8097
|
+
description: "Post updates, listen for commands, and manage communities.",
|
|
8098
|
+
category: "Communication"
|
|
8099
|
+
},
|
|
8100
|
+
{
|
|
8101
|
+
id: "app-microsoft-teams",
|
|
8102
|
+
name: "Microsoft Teams",
|
|
8103
|
+
description: "Send messages, route approvals, and coordinate team channels.",
|
|
8104
|
+
category: "Communication"
|
|
8105
|
+
},
|
|
8106
|
+
{
|
|
8107
|
+
id: "app-google-chat",
|
|
8108
|
+
name: "Google Chat",
|
|
8109
|
+
description: "Send messages and surface agent responses in Google Chat.",
|
|
8110
|
+
category: "Communication"
|
|
8111
|
+
},
|
|
8112
|
+
{
|
|
8113
|
+
id: "app-telegram",
|
|
8114
|
+
name: "Telegram",
|
|
8115
|
+
description: "Send bot messages and respond to chats and groups.",
|
|
8116
|
+
category: "Communication"
|
|
8117
|
+
},
|
|
8118
|
+
{
|
|
8119
|
+
id: "app-whatsapp",
|
|
8120
|
+
name: "WhatsApp",
|
|
8121
|
+
description: "Send WhatsApp messages and respond to customer threads.",
|
|
8122
|
+
category: "Communication"
|
|
8123
|
+
},
|
|
8124
|
+
{
|
|
8125
|
+
id: "app-hubspot",
|
|
8126
|
+
name: "HubSpot",
|
|
8127
|
+
description: "Manage contacts, companies, deals, tickets, and timelines.",
|
|
8128
|
+
category: "CRM"
|
|
8129
|
+
},
|
|
8130
|
+
{
|
|
8131
|
+
id: "app-salesforce",
|
|
8132
|
+
name: "Salesforce",
|
|
8133
|
+
description: "Read and update leads, accounts, opportunities, and cases.",
|
|
8134
|
+
category: "CRM"
|
|
8135
|
+
},
|
|
8136
|
+
{
|
|
8137
|
+
id: "app-pipedrive",
|
|
8138
|
+
name: "Pipedrive",
|
|
8139
|
+
description: "Move deals, update contacts, and automate sales pipelines.",
|
|
8140
|
+
category: "CRM"
|
|
8141
|
+
},
|
|
8142
|
+
{
|
|
8143
|
+
id: "app-intercom",
|
|
8144
|
+
name: "Intercom",
|
|
8145
|
+
description: "Route conversations, update users, and summarize support.",
|
|
8146
|
+
category: "Support"
|
|
8147
|
+
},
|
|
8148
|
+
{
|
|
8149
|
+
id: "app-zendesk",
|
|
8150
|
+
name: "Zendesk",
|
|
8151
|
+
description: "Create tickets, reply to customers, and sync support context.",
|
|
8152
|
+
category: "Support"
|
|
8153
|
+
},
|
|
8154
|
+
{
|
|
8155
|
+
id: "app-freshdesk",
|
|
8156
|
+
name: "Freshdesk",
|
|
8157
|
+
description: "Automate ticket routing, replies, and customer updates.",
|
|
8158
|
+
category: "Support"
|
|
8159
|
+
},
|
|
8160
|
+
{
|
|
8161
|
+
id: "app-front",
|
|
8162
|
+
name: "Front",
|
|
8163
|
+
description: "Manage shared inboxes, comments, tags, and customer replies.",
|
|
8164
|
+
category: "Support"
|
|
8165
|
+
},
|
|
8166
|
+
{
|
|
8167
|
+
id: "app-stripe",
|
|
8168
|
+
name: "Stripe",
|
|
8169
|
+
description: "React to payments, manage customers, and reconcile billing.",
|
|
8170
|
+
category: "Finance"
|
|
8171
|
+
},
|
|
8172
|
+
{
|
|
8173
|
+
id: "app-quickbooks",
|
|
8174
|
+
name: "QuickBooks",
|
|
8175
|
+
description: "Create invoices, sync customers, and reconcile accounting data.",
|
|
8176
|
+
category: "Finance"
|
|
8177
|
+
},
|
|
8178
|
+
{
|
|
8179
|
+
id: "app-xero",
|
|
8180
|
+
name: "Xero",
|
|
8181
|
+
description: "Automate invoices, contacts, bills, and accounting workflows.",
|
|
8182
|
+
category: "Finance"
|
|
8183
|
+
},
|
|
8184
|
+
{
|
|
8185
|
+
id: "app-shopify",
|
|
8186
|
+
name: "Shopify",
|
|
8187
|
+
description: "Process orders, update products, and coordinate fulfillment.",
|
|
8188
|
+
category: "Commerce"
|
|
8189
|
+
},
|
|
8190
|
+
{
|
|
8191
|
+
id: "app-woocommerce",
|
|
8192
|
+
name: "WooCommerce",
|
|
8193
|
+
description: "Sync orders, customers, products, and storefront events.",
|
|
8194
|
+
category: "Commerce"
|
|
8195
|
+
},
|
|
8196
|
+
{
|
|
8197
|
+
id: "app-webflow",
|
|
8198
|
+
name: "Webflow",
|
|
8199
|
+
description: "Publish CMS items, update site content, and trigger workflows.",
|
|
8200
|
+
category: "Marketing"
|
|
8201
|
+
},
|
|
8202
|
+
{
|
|
8203
|
+
id: "app-mailchimp",
|
|
8204
|
+
name: "Mailchimp",
|
|
8205
|
+
description: "Manage audiences, campaigns, tags, and email automations.",
|
|
8206
|
+
category: "Marketing"
|
|
8207
|
+
},
|
|
8208
|
+
{
|
|
8209
|
+
id: "app-sendgrid",
|
|
8210
|
+
name: "SendGrid",
|
|
8211
|
+
description: "Send transactional email and react to delivery events.",
|
|
8212
|
+
category: "Marketing"
|
|
8213
|
+
},
|
|
8214
|
+
{
|
|
8215
|
+
id: "app-typeform",
|
|
8216
|
+
name: "Typeform",
|
|
8217
|
+
description: "Capture form responses and enrich follow-up workflows.",
|
|
8218
|
+
category: "Forms"
|
|
8219
|
+
},
|
|
8220
|
+
{
|
|
8221
|
+
id: "app-surveymonkey",
|
|
8222
|
+
name: "SurveyMonkey",
|
|
8223
|
+
description: "Collect survey responses and sync insights into workflows.",
|
|
8224
|
+
category: "Forms"
|
|
8225
|
+
},
|
|
8226
|
+
{
|
|
8227
|
+
id: "app-calendly",
|
|
8228
|
+
name: "Calendly",
|
|
8229
|
+
description: "React to bookings, cancellations, and scheduling updates.",
|
|
8230
|
+
category: "Productivity"
|
|
8231
|
+
},
|
|
8232
|
+
{
|
|
8233
|
+
id: "app-docusign",
|
|
8234
|
+
name: "DocuSign",
|
|
8235
|
+
description: "Send envelopes, track signatures, and file completed agreements.",
|
|
8236
|
+
category: "Documents"
|
|
8237
|
+
},
|
|
8238
|
+
{
|
|
8239
|
+
id: "app-dropbox",
|
|
8240
|
+
name: "Dropbox",
|
|
8241
|
+
description: "Read files, upload assets, and organize shared folders.",
|
|
8242
|
+
category: "Files"
|
|
8243
|
+
},
|
|
8244
|
+
{
|
|
8245
|
+
id: "app-box",
|
|
8246
|
+
name: "Box",
|
|
8247
|
+
description: "Search enterprise files, update folders, and manage documents.",
|
|
8248
|
+
category: "Files"
|
|
8249
|
+
},
|
|
8250
|
+
{
|
|
8251
|
+
id: "app-figma",
|
|
8252
|
+
name: "Figma",
|
|
8253
|
+
description: "Inspect designs, sync comments, and coordinate design handoffs.",
|
|
8254
|
+
category: "Design"
|
|
8255
|
+
},
|
|
8256
|
+
{
|
|
8257
|
+
id: "app-canva",
|
|
8258
|
+
name: "Canva",
|
|
8259
|
+
description: "Create design assets and automate content production.",
|
|
8260
|
+
category: "Design"
|
|
8261
|
+
},
|
|
8262
|
+
{
|
|
8263
|
+
id: "app-sentry",
|
|
8264
|
+
name: "Sentry",
|
|
8265
|
+
description: "Triage errors, summarize issues, and route incidents.",
|
|
8266
|
+
category: "Observability"
|
|
8267
|
+
},
|
|
8268
|
+
{
|
|
8269
|
+
id: "app-datadog",
|
|
8270
|
+
name: "Datadog",
|
|
8271
|
+
description: "Query metrics, inspect monitors, and coordinate incidents.",
|
|
8272
|
+
category: "Observability"
|
|
8273
|
+
},
|
|
8274
|
+
{
|
|
8275
|
+
id: "app-pagerduty",
|
|
8276
|
+
name: "PagerDuty",
|
|
8277
|
+
description: "Create incidents, page responders, and automate escalations.",
|
|
8278
|
+
category: "Observability"
|
|
8279
|
+
},
|
|
8280
|
+
{
|
|
8281
|
+
id: "app-gitlab",
|
|
8282
|
+
name: "GitLab",
|
|
8283
|
+
description: "Manage merge requests, issues, pipelines, and repositories.",
|
|
8284
|
+
category: "Development"
|
|
8285
|
+
},
|
|
8286
|
+
{
|
|
8287
|
+
id: "app-bitbucket",
|
|
8288
|
+
name: "Bitbucket",
|
|
8289
|
+
description: "Automate pull requests, branches, and repository workflows.",
|
|
8290
|
+
category: "Development"
|
|
8291
|
+
},
|
|
8292
|
+
{
|
|
8293
|
+
id: "app-vercel",
|
|
8294
|
+
name: "Vercel",
|
|
8295
|
+
description: "Track deployments, manage projects, and react to build events.",
|
|
8296
|
+
category: "Development"
|
|
8297
|
+
},
|
|
8298
|
+
{
|
|
8299
|
+
id: "app-netlify",
|
|
8300
|
+
name: "Netlify",
|
|
8301
|
+
description: "Automate deploys, forms, sites, and build notifications.",
|
|
8302
|
+
category: "Development"
|
|
8303
|
+
},
|
|
8304
|
+
{
|
|
8305
|
+
id: "app-supabase",
|
|
8306
|
+
name: "Supabase",
|
|
8307
|
+
description: "Query databases, manage auth, and automate backend workflows.",
|
|
8308
|
+
category: "Data"
|
|
8309
|
+
},
|
|
8310
|
+
{
|
|
8311
|
+
id: "app-postgres",
|
|
8312
|
+
name: "Postgres",
|
|
8313
|
+
description: "Run SQL queries and sync structured data from Postgres.",
|
|
8314
|
+
category: "Data"
|
|
8315
|
+
},
|
|
8316
|
+
{
|
|
8317
|
+
id: "app-snowflake",
|
|
8318
|
+
name: "Snowflake",
|
|
8319
|
+
description: "Query warehouse data and automate analytics workflows.",
|
|
8320
|
+
category: "Data"
|
|
8321
|
+
},
|
|
8322
|
+
{
|
|
8323
|
+
id: "app-databricks",
|
|
8324
|
+
name: "Databricks",
|
|
8325
|
+
description: "Run jobs, query lakehouse data, and coordinate pipelines.",
|
|
8326
|
+
category: "Data"
|
|
8327
|
+
},
|
|
8328
|
+
{
|
|
8329
|
+
id: "app-segment",
|
|
8330
|
+
name: "Segment",
|
|
8331
|
+
description: "Route customer events and enrich downstream automations.",
|
|
8332
|
+
category: "Data"
|
|
8333
|
+
},
|
|
8334
|
+
{
|
|
8335
|
+
id: "app-twilio",
|
|
8336
|
+
name: "Twilio",
|
|
8337
|
+
description: "Send SMS, manage calls, and coordinate customer notifications.",
|
|
8338
|
+
category: "Communication"
|
|
8339
|
+
},
|
|
8340
|
+
{
|
|
8341
|
+
id: "app-zoom",
|
|
8342
|
+
name: "Zoom",
|
|
8343
|
+
description: "Schedule meetings, manage recordings, and notify attendees.",
|
|
8344
|
+
category: "Communication"
|
|
8345
|
+
},
|
|
8346
|
+
{
|
|
8347
|
+
id: "app-loom",
|
|
8348
|
+
name: "Loom",
|
|
8349
|
+
description: "Create video handoffs, summarize recordings, and share updates.",
|
|
8350
|
+
category: "Communication"
|
|
8351
|
+
},
|
|
8352
|
+
{
|
|
8353
|
+
id: "app-miro",
|
|
8354
|
+
name: "Miro",
|
|
8355
|
+
description: "Create boards, sync cards, and coordinate visual planning.",
|
|
8356
|
+
category: "Productivity"
|
|
8357
|
+
},
|
|
8358
|
+
{
|
|
8359
|
+
id: "app-coda",
|
|
8360
|
+
name: "Coda",
|
|
8361
|
+
description: "Update docs, tables, packs, and team operating workflows.",
|
|
8362
|
+
category: "Productivity"
|
|
8363
|
+
},
|
|
8364
|
+
{
|
|
8365
|
+
id: "app-confluence",
|
|
8366
|
+
name: "Confluence",
|
|
8367
|
+
description: "Search knowledge bases and create or update documentation.",
|
|
8368
|
+
category: "Productivity"
|
|
8369
|
+
},
|
|
8370
|
+
{
|
|
8371
|
+
id: "app-aws",
|
|
8372
|
+
name: "AWS",
|
|
8373
|
+
description: "Coordinate cloud resources, events, queues, and infrastructure.",
|
|
8374
|
+
category: "Infrastructure"
|
|
8375
|
+
},
|
|
8376
|
+
{
|
|
8377
|
+
id: "app-google-cloud",
|
|
8378
|
+
name: "Google Cloud",
|
|
8379
|
+
description: "Manage cloud jobs, storage, Pub/Sub, and deployment workflows.",
|
|
8380
|
+
category: "Infrastructure"
|
|
8381
|
+
},
|
|
8382
|
+
{
|
|
8383
|
+
id: "app-azure",
|
|
8384
|
+
name: "Azure",
|
|
8385
|
+
description: "Automate Azure resources, queues, deployments, and identities.",
|
|
8386
|
+
category: "Infrastructure"
|
|
8387
|
+
},
|
|
8388
|
+
{
|
|
8389
|
+
id: "app-cloudflare",
|
|
8390
|
+
name: "Cloudflare",
|
|
8391
|
+
description: "Manage DNS, Workers, Pages, queues, and edge automations.",
|
|
8392
|
+
category: "Infrastructure"
|
|
8393
|
+
},
|
|
8394
|
+
{
|
|
8395
|
+
id: "app-docker",
|
|
8396
|
+
name: "Docker",
|
|
8397
|
+
description: "Coordinate images, registries, builds, and deployment events.",
|
|
8398
|
+
category: "Infrastructure"
|
|
8399
|
+
},
|
|
8400
|
+
{
|
|
8401
|
+
id: "app-kubernetes",
|
|
8402
|
+
name: "Kubernetes",
|
|
8403
|
+
description: "Inspect clusters, trigger jobs, and automate operations.",
|
|
8404
|
+
category: "Infrastructure"
|
|
8405
|
+
},
|
|
8406
|
+
{
|
|
8407
|
+
id: "app-algolia",
|
|
8408
|
+
name: "Algolia",
|
|
8409
|
+
description: "Sync search indexes and automate content discovery workflows.",
|
|
8410
|
+
category: "Data"
|
|
8411
|
+
},
|
|
8412
|
+
{
|
|
8413
|
+
id: "app-elasticsearch",
|
|
8414
|
+
name: "Elasticsearch",
|
|
8415
|
+
description: "Query search clusters and automate log or document workflows.",
|
|
8416
|
+
category: "Data"
|
|
8417
|
+
},
|
|
8418
|
+
{
|
|
8419
|
+
id: "app-redis",
|
|
8420
|
+
name: "Redis",
|
|
8421
|
+
description: "Read cache data, coordinate queues, and manage realtime state.",
|
|
8422
|
+
category: "Data"
|
|
8423
|
+
},
|
|
8424
|
+
{
|
|
8425
|
+
id: "app-pinecone",
|
|
8426
|
+
name: "Pinecone",
|
|
8427
|
+
description: "Manage vector indexes and power retrieval workflows.",
|
|
8428
|
+
category: "AI"
|
|
8429
|
+
},
|
|
8430
|
+
{
|
|
8431
|
+
id: "app-plaid",
|
|
8432
|
+
name: "Plaid",
|
|
8433
|
+
description: "Connect financial accounts and automate banking data flows.",
|
|
8434
|
+
category: "Finance"
|
|
8435
|
+
},
|
|
8436
|
+
{
|
|
8437
|
+
id: "app-brex",
|
|
8438
|
+
name: "Brex",
|
|
8439
|
+
description: "Sync expenses, cards, reimbursements, and finance approvals.",
|
|
8440
|
+
category: "Finance"
|
|
8441
|
+
},
|
|
8442
|
+
{
|
|
8443
|
+
id: "app-mercury",
|
|
8444
|
+
name: "Mercury",
|
|
8445
|
+
description: "Automate banking workflows, transactions, and treasury tasks.",
|
|
8446
|
+
category: "Finance"
|
|
8447
|
+
},
|
|
8448
|
+
{
|
|
8449
|
+
id: "app-elevenlabs",
|
|
8450
|
+
name: "ElevenLabs",
|
|
8451
|
+
description: "Generate speech, transcribe audio, and automate voice agents.",
|
|
8452
|
+
category: "AI"
|
|
8453
|
+
},
|
|
8454
|
+
{
|
|
8455
|
+
id: "app-perplexity",
|
|
8456
|
+
name: "Perplexity",
|
|
8457
|
+
description: "Search the web with citations and grounded AI answers.",
|
|
8458
|
+
category: "AI"
|
|
8459
|
+
},
|
|
8460
|
+
{
|
|
8461
|
+
id: "app-gemini",
|
|
8462
|
+
name: "Gemini",
|
|
8463
|
+
description: "Use Google AI models for generation, analysis, and reasoning.",
|
|
8464
|
+
category: "AI"
|
|
8465
|
+
},
|
|
8466
|
+
{
|
|
8467
|
+
id: "app-polymarket",
|
|
8468
|
+
name: "Polymarket",
|
|
8469
|
+
description: "Read market data and automate prediction-market workflows.",
|
|
8470
|
+
category: "Finance"
|
|
8471
|
+
},
|
|
8472
|
+
{
|
|
8473
|
+
id: "app-blacksmith",
|
|
8474
|
+
name: "Blacksmith",
|
|
8475
|
+
description: "Automate CI builds, runners, and developer infrastructure.",
|
|
8476
|
+
category: "Development"
|
|
8477
|
+
},
|
|
8478
|
+
{
|
|
8479
|
+
id: "app-deel",
|
|
8480
|
+
name: "Deel",
|
|
8481
|
+
description: "Sync employee, contractor, payroll, and HR workflows.",
|
|
8482
|
+
category: "HR"
|
|
8483
|
+
},
|
|
8484
|
+
{
|
|
8485
|
+
id: "app-doordash",
|
|
8486
|
+
name: "DoorDash",
|
|
8487
|
+
description: "Coordinate delivery, merchant, and logistics workflows.",
|
|
8488
|
+
category: "Commerce"
|
|
8489
|
+
},
|
|
8490
|
+
{
|
|
8491
|
+
id: "app-dub",
|
|
8492
|
+
name: "Dub",
|
|
8493
|
+
description: "Manage short links, attribution, and campaign routing.",
|
|
8494
|
+
category: "Marketing"
|
|
8495
|
+
},
|
|
8496
|
+
{
|
|
8497
|
+
id: "app-exa",
|
|
8498
|
+
name: "Exa",
|
|
8499
|
+
description: "Search the web and retrieve AI-ready research results.",
|
|
8500
|
+
category: "AI"
|
|
8501
|
+
},
|
|
8502
|
+
{
|
|
8503
|
+
id: "app-firecrawl",
|
|
8504
|
+
name: "Firecrawl",
|
|
8505
|
+
description: "Crawl sites, extract structured data, and power research agents.",
|
|
8506
|
+
category: "Search"
|
|
8507
|
+
},
|
|
8508
|
+
{
|
|
8509
|
+
id: "app-granola",
|
|
8510
|
+
name: "Granola",
|
|
8511
|
+
description: "Sync meeting notes, summaries, and follow-up workflows.",
|
|
8512
|
+
category: "Productivity"
|
|
8513
|
+
},
|
|
8514
|
+
{
|
|
8515
|
+
id: "app-gusto",
|
|
8516
|
+
name: "Gusto",
|
|
8517
|
+
description: "Automate payroll, benefits, and HR operations.",
|
|
8518
|
+
category: "HR"
|
|
8519
|
+
},
|
|
8520
|
+
{
|
|
8521
|
+
id: "app-hex",
|
|
8522
|
+
name: "Hex",
|
|
8523
|
+
description: "Run analytics workflows, notebooks, and data apps.",
|
|
8524
|
+
category: "Data"
|
|
8525
|
+
},
|
|
8526
|
+
{
|
|
8527
|
+
id: "app-instacart",
|
|
8528
|
+
name: "Instacart",
|
|
8529
|
+
description: "Coordinate grocery commerce, orders, and fulfillment workflows.",
|
|
8530
|
+
category: "Commerce"
|
|
8531
|
+
},
|
|
8532
|
+
{
|
|
8533
|
+
id: "app-kalshi",
|
|
8534
|
+
name: "Kalshi",
|
|
8535
|
+
description: "Read event markets and automate prediction-market workflows.",
|
|
8536
|
+
category: "Finance"
|
|
8537
|
+
},
|
|
8538
|
+
{
|
|
8539
|
+
id: "app-omni",
|
|
8540
|
+
name: "Omni",
|
|
8541
|
+
description: "Query business intelligence models and automate analytics workflows.",
|
|
8542
|
+
category: "Data"
|
|
8543
|
+
},
|
|
8544
|
+
{
|
|
8545
|
+
id: "app-parallel",
|
|
8546
|
+
name: "Parallel",
|
|
8547
|
+
description: "Run AI research, enrichment, and web task workflows.",
|
|
8548
|
+
category: "AI"
|
|
8549
|
+
},
|
|
8550
|
+
{
|
|
8551
|
+
id: "app-planetscale",
|
|
8552
|
+
name: "PlanetScale",
|
|
8553
|
+
description: "Manage MySQL databases, branches, and deploy requests.",
|
|
8554
|
+
category: "Data"
|
|
8555
|
+
},
|
|
8556
|
+
{
|
|
8557
|
+
id: "app-porter",
|
|
8558
|
+
name: "Porter",
|
|
8559
|
+
description: "Coordinate cloud deployments and application infrastructure.",
|
|
8560
|
+
category: "Development"
|
|
8561
|
+
},
|
|
8562
|
+
{
|
|
8563
|
+
id: "app-puzzle",
|
|
8564
|
+
name: "Puzzle",
|
|
8565
|
+
description: "Automate accounting workflows, books, and finance operations.",
|
|
8566
|
+
category: "Finance"
|
|
8567
|
+
},
|
|
8568
|
+
{
|
|
8569
|
+
id: "app-pylon",
|
|
8570
|
+
name: "Pylon",
|
|
8571
|
+
description: "Manage B2B support conversations and customer workflows.",
|
|
8572
|
+
category: "Support"
|
|
8573
|
+
},
|
|
8574
|
+
{
|
|
8575
|
+
id: "app-ramp",
|
|
8576
|
+
name: "Ramp",
|
|
8577
|
+
description: "Sync spend, expenses, approvals, and finance workflows.",
|
|
8578
|
+
category: "Finance"
|
|
8579
|
+
},
|
|
8580
|
+
{
|
|
8581
|
+
id: "app-reducto",
|
|
8582
|
+
name: "Reducto",
|
|
8583
|
+
description: "Extract structured data from complex documents.",
|
|
8584
|
+
category: "Documents"
|
|
8585
|
+
},
|
|
8586
|
+
{
|
|
8587
|
+
id: "app-resend",
|
|
8588
|
+
name: "Resend",
|
|
8589
|
+
description: "Send product email and react to delivery events.",
|
|
8590
|
+
category: "Marketing"
|
|
8591
|
+
},
|
|
8592
|
+
{
|
|
8593
|
+
id: "app-rippling",
|
|
8594
|
+
name: "Rippling",
|
|
8595
|
+
description: "Automate employee, device, payroll, and HR workflows.",
|
|
8596
|
+
category: "HR"
|
|
8597
|
+
},
|
|
8598
|
+
{
|
|
8599
|
+
id: "app-streak",
|
|
8600
|
+
name: "Streak",
|
|
8601
|
+
description: "Manage Gmail-native CRM pipelines and contact workflows.",
|
|
8602
|
+
category: "CRM"
|
|
8603
|
+
},
|
|
8604
|
+
{
|
|
8605
|
+
id: "app-warp",
|
|
8606
|
+
name: "Warp",
|
|
8607
|
+
description: "Coordinate terminal, developer environment, and AI coding workflows.",
|
|
8608
|
+
category: "Development"
|
|
8609
|
+
},
|
|
8610
|
+
{
|
|
8611
|
+
id: "app-apollo",
|
|
8612
|
+
name: "Apollo",
|
|
8613
|
+
description: "Sync sales intelligence, prospecting, and enrichment workflows.",
|
|
8614
|
+
category: "CRM"
|
|
8615
|
+
},
|
|
8616
|
+
{
|
|
8617
|
+
id: "app-cal-com",
|
|
8618
|
+
name: "Cal.com",
|
|
8619
|
+
description: "Automate scheduling, bookings, availability, and routing workflows.",
|
|
8620
|
+
category: "Productivity"
|
|
8621
|
+
},
|
|
8622
|
+
{
|
|
8623
|
+
id: "app-cerebras",
|
|
8624
|
+
name: "Cerebras",
|
|
8625
|
+
description: "Use fast AI inference for model-powered workflow steps.",
|
|
8626
|
+
category: "AI"
|
|
8627
|
+
},
|
|
8628
|
+
{
|
|
8629
|
+
id: "app-chargebee",
|
|
8630
|
+
name: "Chargebee",
|
|
8631
|
+
description: "Automate subscription billing, customers, invoices, and revenue workflows.",
|
|
8632
|
+
category: "Finance"
|
|
8633
|
+
},
|
|
8634
|
+
{
|
|
8635
|
+
id: "app-deepseek",
|
|
8636
|
+
name: "DeepSeek",
|
|
8637
|
+
description: "Use DeepSeek models for generation, reasoning, and analysis.",
|
|
8638
|
+
category: "AI"
|
|
8639
|
+
},
|
|
8640
|
+
{
|
|
8641
|
+
id: "app-gong",
|
|
8642
|
+
name: "Gong",
|
|
8643
|
+
description: "Sync revenue conversations, account insights, and sales follow-up workflows.",
|
|
8644
|
+
category: "CRM"
|
|
8645
|
+
},
|
|
8646
|
+
{
|
|
8647
|
+
id: "app-google-contacts",
|
|
8648
|
+
name: "Google Contacts",
|
|
8649
|
+
description: "Read and update contact records across Google Workspace.",
|
|
8650
|
+
category: "Productivity"
|
|
8651
|
+
},
|
|
8652
|
+
{
|
|
8653
|
+
id: "app-google-docs",
|
|
8654
|
+
name: "Google Docs",
|
|
8655
|
+
description: "Create, read, and update collaborative documents.",
|
|
8656
|
+
category: "Documents"
|
|
8657
|
+
},
|
|
8658
|
+
{
|
|
8659
|
+
id: "app-google-forms",
|
|
8660
|
+
name: "Google Forms",
|
|
8661
|
+
description: "Capture form responses and turn submissions into automated work.",
|
|
8662
|
+
category: "Forms"
|
|
8663
|
+
},
|
|
8664
|
+
{
|
|
8665
|
+
id: "app-google-meet",
|
|
8666
|
+
name: "Google Meet",
|
|
8667
|
+
description: "Coordinate meetings, recordings, and video collaboration workflows.",
|
|
8668
|
+
category: "Communication"
|
|
8669
|
+
},
|
|
8670
|
+
{
|
|
8671
|
+
id: "app-google-slides",
|
|
8672
|
+
name: "Google Slides",
|
|
8673
|
+
description: "Create and update presentations from workflow outputs.",
|
|
8674
|
+
category: "Documents"
|
|
8675
|
+
},
|
|
8676
|
+
{
|
|
8677
|
+
id: "app-google-tasks",
|
|
8678
|
+
name: "Google Tasks",
|
|
8679
|
+
description: "Create tasks, update lists, and coordinate personal work queues.",
|
|
8680
|
+
category: "Productivity"
|
|
8681
|
+
},
|
|
8682
|
+
{
|
|
8683
|
+
id: "app-greenhouse",
|
|
8684
|
+
name: "Greenhouse",
|
|
8685
|
+
description: "Automate candidate, job, and interview coordination workflows.",
|
|
8686
|
+
category: "HR"
|
|
8687
|
+
},
|
|
8688
|
+
{
|
|
8689
|
+
id: "app-groq",
|
|
8690
|
+
name: "Groq",
|
|
8691
|
+
description: "Use low-latency AI inference in agents and workflows.",
|
|
8692
|
+
category: "AI"
|
|
8693
|
+
},
|
|
8694
|
+
{
|
|
8695
|
+
id: "app-help-scout",
|
|
8696
|
+
name: "Help Scout",
|
|
8697
|
+
description: "Manage customer conversations, mailboxes, and support workflows.",
|
|
8698
|
+
category: "Support"
|
|
8699
|
+
},
|
|
8700
|
+
{
|
|
8701
|
+
id: "app-linkedin",
|
|
8702
|
+
name: "LinkedIn",
|
|
8703
|
+
description: "Coordinate professional network, recruiting, and social workflows.",
|
|
8704
|
+
category: "CRM"
|
|
8705
|
+
},
|
|
8706
|
+
{
|
|
8707
|
+
id: "app-microsoft-excel",
|
|
8708
|
+
name: "Microsoft Excel",
|
|
8709
|
+
description: "Read, update, and append rows in Excel workbooks.",
|
|
8710
|
+
category: "Data"
|
|
8711
|
+
},
|
|
8712
|
+
{
|
|
8713
|
+
id: "app-microsoft-onedrive",
|
|
8714
|
+
name: "Microsoft OneDrive",
|
|
8715
|
+
description: "Find, read, upload, and organize files in OneDrive.",
|
|
8716
|
+
category: "Files"
|
|
8717
|
+
},
|
|
8718
|
+
{
|
|
8719
|
+
id: "app-microsoft-outlook",
|
|
8720
|
+
name: "Microsoft Outlook",
|
|
8721
|
+
description: "Send email, read messages, and coordinate calendar workflows.",
|
|
8722
|
+
category: "Communication"
|
|
8723
|
+
},
|
|
8724
|
+
{
|
|
8725
|
+
id: "app-microsoft-planner",
|
|
8726
|
+
name: "Microsoft Planner",
|
|
8727
|
+
description: "Create tasks, update plans, and coordinate project work.",
|
|
8728
|
+
category: "Project Management"
|
|
8729
|
+
},
|
|
8730
|
+
{
|
|
8731
|
+
id: "app-microsoft-sharepoint",
|
|
8732
|
+
name: "Microsoft SharePoint",
|
|
8733
|
+
description: "Search sites, update lists, and manage shared documents.",
|
|
8734
|
+
category: "Documents"
|
|
8735
|
+
},
|
|
8736
|
+
{
|
|
8737
|
+
id: "app-mistral",
|
|
8738
|
+
name: "Mistral",
|
|
8739
|
+
description: "Use Mistral models for generation, analysis, and AI workflow steps.",
|
|
8740
|
+
category: "AI"
|
|
8741
|
+
},
|
|
8742
|
+
{
|
|
8743
|
+
id: "app-posthog",
|
|
8744
|
+
name: "PostHog",
|
|
8745
|
+
description: "Query product analytics, feature flags, and user behavior signals.",
|
|
8746
|
+
category: "Data"
|
|
8747
|
+
},
|
|
8748
|
+
{
|
|
8749
|
+
id: "app-reddit",
|
|
8750
|
+
name: "Reddit",
|
|
8751
|
+
description: "Monitor communities, posts, and discussion-driven workflows.",
|
|
8752
|
+
category: "Marketing"
|
|
8753
|
+
},
|
|
8754
|
+
{
|
|
8755
|
+
id: "app-square",
|
|
8756
|
+
name: "Square",
|
|
8757
|
+
description: "Automate payments, customers, catalog, and point-of-sale workflows.",
|
|
8758
|
+
category: "Finance"
|
|
8759
|
+
},
|
|
8760
|
+
{
|
|
8761
|
+
id: "app-todoist",
|
|
8762
|
+
name: "Todoist",
|
|
8763
|
+
description: "Create tasks, update projects, and automate personal work queues.",
|
|
8764
|
+
category: "Productivity"
|
|
8765
|
+
},
|
|
8766
|
+
{
|
|
8767
|
+
id: "app-wordpress",
|
|
8768
|
+
name: "WordPress",
|
|
8769
|
+
description: "Publish posts, update pages, and automate site content workflows.",
|
|
8770
|
+
category: "Marketing"
|
|
8771
|
+
},
|
|
8772
|
+
{
|
|
8773
|
+
id: "app-x-twitter",
|
|
8774
|
+
name: "X / Twitter",
|
|
8775
|
+
description: "Monitor posts, publish updates, and coordinate social workflows.",
|
|
8776
|
+
category: "Marketing"
|
|
8777
|
+
},
|
|
8778
|
+
{
|
|
8779
|
+
id: "app-xai",
|
|
8780
|
+
name: "xAI",
|
|
8781
|
+
description: "Use xAI models for generation, analysis, and reasoning steps.",
|
|
8782
|
+
category: "AI"
|
|
8783
|
+
},
|
|
8784
|
+
{
|
|
8785
|
+
id: "app-youtube",
|
|
8786
|
+
name: "YouTube",
|
|
8787
|
+
description: "Manage videos, channels, comments, and creator workflows.",
|
|
8788
|
+
category: "Marketing"
|
|
8789
|
+
}
|
|
8790
|
+
];
|
|
8791
|
+
const GMAIL_SCOPES = [
|
|
8792
|
+
"gmail.readonly",
|
|
8793
|
+
"gmail.send",
|
|
8794
|
+
"profile",
|
|
8795
|
+
"email"
|
|
8796
|
+
];
|
|
8797
|
+
const SLACK_SCOPES = [
|
|
8798
|
+
"channels:history",
|
|
8799
|
+
"channels:read",
|
|
8800
|
+
"chat:write",
|
|
8801
|
+
"commands",
|
|
8802
|
+
"users:read",
|
|
8803
|
+
"groups:read",
|
|
8804
|
+
"im:read",
|
|
8805
|
+
"mpim:read",
|
|
8806
|
+
"reactions:read",
|
|
8807
|
+
"team:read",
|
|
8808
|
+
"files:read",
|
|
8809
|
+
"users.profile:read"
|
|
8810
|
+
];
|
|
8811
|
+
/**
|
|
8812
|
+
* Credential records the signed-in user can see, spanning the three scopes
|
|
8813
|
+
* (organization, project, user) and both connection kinds (oauth, manual) so
|
|
8814
|
+
* the table's pre-built views and the detail page all have data to render.
|
|
8815
|
+
*/
|
|
8816
|
+
const credentialSeed = [
|
|
8817
|
+
{
|
|
8818
|
+
id: "cred-gmail-org-1",
|
|
8819
|
+
appId: "app-gmail",
|
|
8820
|
+
appName: "Gmail",
|
|
8821
|
+
label: "Company Gmail",
|
|
8822
|
+
scope: "organization",
|
|
8823
|
+
isDefault: true,
|
|
8824
|
+
status: "Active",
|
|
8825
|
+
connectionKind: "oauth",
|
|
8826
|
+
createdAt: "2026-02-10T14:00:00Z",
|
|
8827
|
+
lastUsedAt: "2026-04-20T15:44:00Z",
|
|
8828
|
+
lastRefreshedAt: "2026-04-20T15:44:00Z",
|
|
8829
|
+
expiresAt: "2026-05-20T15:44:00Z",
|
|
8830
|
+
grantedScopes: GMAIL_SCOPES,
|
|
8831
|
+
ownerUserId: "org-member-nate",
|
|
8832
|
+
ownerName: "Nate Wells"
|
|
8833
|
+
},
|
|
8834
|
+
{
|
|
8835
|
+
id: "cred-gmail-proj-marketing",
|
|
8836
|
+
appId: "app-gmail",
|
|
8837
|
+
appName: "Gmail",
|
|
8838
|
+
label: "Marketing Gmail",
|
|
8839
|
+
scope: "project",
|
|
8840
|
+
projectId: "project_gtm_engineering",
|
|
8841
|
+
projectName: "GTM Engineering",
|
|
8842
|
+
isDefault: false,
|
|
8843
|
+
status: "Active",
|
|
8844
|
+
connectionKind: "oauth",
|
|
8845
|
+
createdAt: "2026-03-10T09:00:00Z",
|
|
8846
|
+
lastUsedAt: "2026-04-19T11:20:00Z",
|
|
8847
|
+
lastRefreshedAt: "2026-04-19T11:20:00Z",
|
|
8848
|
+
expiresAt: "2026-05-19T11:20:00Z",
|
|
8849
|
+
grantedScopes: GMAIL_SCOPES,
|
|
8850
|
+
ownerUserId: "org-member-nate",
|
|
8851
|
+
ownerName: "Nate Wells"
|
|
8852
|
+
},
|
|
8853
|
+
{
|
|
8854
|
+
id: "cred-gmail-proj-support",
|
|
8855
|
+
appId: "app-gmail",
|
|
8856
|
+
appName: "Gmail",
|
|
8857
|
+
label: "Support Gmail",
|
|
8858
|
+
scope: "project",
|
|
8859
|
+
projectId: "project_gtm_engineering",
|
|
8860
|
+
projectName: "GTM Engineering",
|
|
8861
|
+
isDefault: false,
|
|
8862
|
+
status: "Expired",
|
|
8863
|
+
connectionKind: "oauth",
|
|
8864
|
+
createdAt: "2026-03-15T10:30:00Z",
|
|
8865
|
+
lastUsedAt: "2026-04-18T16:05:00Z",
|
|
8866
|
+
lastRefreshedAt: "2026-04-18T16:05:00Z",
|
|
8867
|
+
expiresAt: "2026-04-18T16:05:00Z",
|
|
8868
|
+
grantedScopes: [
|
|
8869
|
+
"gmail.readonly",
|
|
8870
|
+
"profile",
|
|
8871
|
+
"email"
|
|
8872
|
+
],
|
|
8873
|
+
ownerUserId: "org-member-dallin",
|
|
8874
|
+
ownerName: "Dallin Bentley"
|
|
8875
|
+
},
|
|
8876
|
+
{
|
|
8877
|
+
id: "cred-gmail-user-blake",
|
|
8878
|
+
appId: "app-gmail",
|
|
8879
|
+
appName: "Gmail",
|
|
8880
|
+
label: "Blake's Gmail",
|
|
8881
|
+
scope: "user",
|
|
8882
|
+
isDefault: false,
|
|
8883
|
+
status: "Active",
|
|
8884
|
+
connectionKind: "oauth",
|
|
8885
|
+
createdAt: "2026-03-20T08:15:00Z",
|
|
8886
|
+
lastUsedAt: "2026-04-20T09:18:00Z",
|
|
8887
|
+
lastRefreshedAt: "2026-04-20T09:18:00Z",
|
|
8888
|
+
expiresAt: "2026-05-20T09:18:00Z",
|
|
8889
|
+
grantedScopes: GMAIL_SCOPES,
|
|
8890
|
+
ownerUserId: "user_blake_rouse",
|
|
8891
|
+
ownerName: "Blake Rouse"
|
|
8892
|
+
},
|
|
8893
|
+
{
|
|
8894
|
+
id: "cred-slack-org-1",
|
|
8895
|
+
appId: "app-slack",
|
|
8896
|
+
appName: "Slack",
|
|
8897
|
+
label: "Keystroke Slack",
|
|
8898
|
+
scope: "organization",
|
|
8899
|
+
isDefault: true,
|
|
8900
|
+
status: "Active",
|
|
8901
|
+
connectionKind: "oauth",
|
|
8902
|
+
createdAt: "2026-02-12T11:00:00Z",
|
|
8903
|
+
lastUsedAt: "2026-04-20T14:21:00Z",
|
|
8904
|
+
lastRefreshedAt: "2026-04-20T14:21:00Z",
|
|
8905
|
+
expiresAt: "2026-05-20T14:21:00Z",
|
|
8906
|
+
grantedScopes: SLACK_SCOPES,
|
|
8907
|
+
ownerUserId: "org-member-wells",
|
|
8908
|
+
ownerName: "Wells Riley"
|
|
8909
|
+
},
|
|
8910
|
+
{
|
|
8911
|
+
id: "cred-slack-user-nate",
|
|
8912
|
+
appId: "app-slack",
|
|
8913
|
+
appName: "Slack",
|
|
8914
|
+
label: "Nate's Slack",
|
|
8915
|
+
scope: "user",
|
|
8916
|
+
isDefault: false,
|
|
8917
|
+
status: "Needs Reauth",
|
|
8918
|
+
connectionKind: "oauth",
|
|
8919
|
+
createdAt: "2026-03-22T15:45:00Z",
|
|
8920
|
+
lastUsedAt: "2026-04-20T12:05:00Z",
|
|
8921
|
+
lastRefreshedAt: "2026-04-20T12:05:00Z",
|
|
8922
|
+
expiresAt: "2026-04-20T12:05:00Z",
|
|
8923
|
+
grantedScopes: SLACK_SCOPES,
|
|
8924
|
+
ownerUserId: "org-member-nate",
|
|
8925
|
+
ownerName: "Nate Wells"
|
|
8926
|
+
},
|
|
8927
|
+
{
|
|
8928
|
+
id: "cred-github-org-1",
|
|
8929
|
+
appId: "app-github",
|
|
8930
|
+
appName: "GitHub",
|
|
8931
|
+
label: "Keystroke GitHub",
|
|
8932
|
+
scope: "organization",
|
|
8933
|
+
isDefault: true,
|
|
8934
|
+
status: "Active",
|
|
8935
|
+
connectionKind: "oauth",
|
|
8936
|
+
createdAt: "2026-02-08T09:30:00Z",
|
|
8937
|
+
lastUsedAt: "2026-04-20T13:02:00Z",
|
|
8938
|
+
lastRefreshedAt: "2026-04-20T13:02:00Z",
|
|
8939
|
+
expiresAt: "2026-05-20T13:02:00Z",
|
|
8940
|
+
grantedScopes: [
|
|
8941
|
+
"repo",
|
|
8942
|
+
"read:org",
|
|
8943
|
+
"workflow"
|
|
8944
|
+
],
|
|
8945
|
+
ownerUserId: "org-member-dallin",
|
|
8946
|
+
ownerName: "Dallin Bentley"
|
|
8947
|
+
},
|
|
8948
|
+
{
|
|
8949
|
+
id: "cred-github-proj-personal",
|
|
8950
|
+
appId: "app-github",
|
|
8951
|
+
appName: "GitHub",
|
|
8952
|
+
label: "Personal Repo GitHub",
|
|
8953
|
+
scope: "project",
|
|
8954
|
+
projectId: "project_personal_repo",
|
|
8955
|
+
projectName: "Blake's Project",
|
|
8956
|
+
isDefault: false,
|
|
8957
|
+
status: "Active",
|
|
8958
|
+
connectionKind: "oauth",
|
|
8959
|
+
createdAt: "2026-03-01T16:00:00Z",
|
|
8960
|
+
lastUsedAt: "2026-04-19T19:41:00Z",
|
|
8961
|
+
lastRefreshedAt: "2026-04-19T19:41:00Z",
|
|
8962
|
+
expiresAt: "2026-05-19T19:41:00Z",
|
|
8963
|
+
grantedScopes: ["repo", "workflow"],
|
|
8964
|
+
ownerUserId: "user_blake_rouse",
|
|
8965
|
+
ownerName: "Blake Rouse"
|
|
8966
|
+
},
|
|
8967
|
+
{
|
|
8968
|
+
id: "cred-anthropic-org-1",
|
|
8969
|
+
appId: "app-anthropic",
|
|
8970
|
+
appName: "Anthropic",
|
|
8971
|
+
label: "Anthropic API",
|
|
8972
|
+
scope: "organization",
|
|
8973
|
+
isDefault: true,
|
|
8974
|
+
status: "Active",
|
|
8975
|
+
connectionKind: "manual",
|
|
8976
|
+
createdAt: "2026-02-20T13:00:00Z",
|
|
8977
|
+
lastUsedAt: "2026-04-19T09:40:00Z",
|
|
8978
|
+
lastRefreshedAt: "2026-04-19T09:40:00Z",
|
|
8979
|
+
credentialKeys: ["ANTHROPIC_API_KEY"],
|
|
8980
|
+
ownerUserId: "org-member-nate",
|
|
8981
|
+
ownerName: "Nate Wells"
|
|
8982
|
+
}
|
|
8983
|
+
];
|
|
8984
|
+
const agentSeed = [{
|
|
8985
|
+
id: "agent-support",
|
|
8986
|
+
name: "Support Agent",
|
|
8987
|
+
projectId: "project_personal_repo",
|
|
8988
|
+
updatedAt: "2026-04-20T15:44:00Z",
|
|
8989
|
+
description: "Triage support requests and draft helpful replies.",
|
|
8990
|
+
sourcePath: "src/agents/support-agent.ts",
|
|
8991
|
+
mode: "sandbox",
|
|
8992
|
+
model: "claude-4-sonnet",
|
|
8993
|
+
toolCount: 4,
|
|
8994
|
+
credentialCount: 2,
|
|
8995
|
+
lastRunAt: "2026-04-20T15:44:00Z"
|
|
8996
|
+
}];
|
|
8997
|
+
const workflowSeed = [{
|
|
8998
|
+
id: "workflow-daily-digest",
|
|
8999
|
+
name: "Daily Digest",
|
|
9000
|
+
projectId: "project_personal_repo",
|
|
9001
|
+
updatedAt: "2026-04-20T15:12:00Z",
|
|
9002
|
+
description: "Collect project updates and send a daily summary.",
|
|
9003
|
+
sourcePath: "src/workflows/daily-digest.ts",
|
|
9004
|
+
trigger: "schedule.daily",
|
|
9005
|
+
stepCount: 2,
|
|
9006
|
+
integrationCount: 1,
|
|
9007
|
+
lastRunAt: "2026-04-20T15:12:00Z",
|
|
9008
|
+
runState: "Succeeded"
|
|
9009
|
+
}];
|
|
9010
|
+
const skillSeed = [{
|
|
9011
|
+
id: "skill-attio-sync",
|
|
9012
|
+
name: "Attio Sync",
|
|
9013
|
+
projectId: "project_personal_repo",
|
|
9014
|
+
updatedAt: "2026-04-19T18:05:00Z",
|
|
9015
|
+
description: "Enrich company and contact records from Attio.",
|
|
9016
|
+
sourcePath: ".agents/skills/attio-sync/SKILL.md",
|
|
9017
|
+
category: "CRM",
|
|
9018
|
+
availability: "Private",
|
|
9019
|
+
lastUsedAt: "2026-04-19T18:05:00Z"
|
|
9020
|
+
}];
|
|
9021
|
+
const deploymentSeed = [{
|
|
9022
|
+
id: "deployment-v002",
|
|
9023
|
+
projectId: "project_personal_repo",
|
|
9024
|
+
version: "v0.0.2",
|
|
9025
|
+
commit: "0842e21",
|
|
9026
|
+
commitSha: "0842e21",
|
|
9027
|
+
deployedBy: "Dallin Bentley",
|
|
9028
|
+
deployedByEmail: "dallin@keystroke.ai",
|
|
9029
|
+
createdAt: "2026-04-20T15:44:00Z",
|
|
9030
|
+
active: true,
|
|
9031
|
+
summary: "Added support-agent and daily digest workflow.",
|
|
9032
|
+
changedFiles: 4,
|
|
9033
|
+
lineAdditions: 182,
|
|
9034
|
+
lineDeletions: 24
|
|
9035
|
+
}, {
|
|
9036
|
+
id: "deployment-v001",
|
|
9037
|
+
projectId: "project_personal_repo",
|
|
9038
|
+
version: "v0.0.1",
|
|
9039
|
+
commit: "5aeb762",
|
|
9040
|
+
commitSha: "5aeb762",
|
|
9041
|
+
deployedBy: "Dallin Bentley",
|
|
9042
|
+
deployedByEmail: "dallin@keystroke.ai",
|
|
9043
|
+
createdAt: "2026-04-18T15:44:00Z",
|
|
9044
|
+
active: false,
|
|
9045
|
+
summary: "Initial deployed project snapshot.",
|
|
9046
|
+
changedFiles: 2,
|
|
9047
|
+
lineAdditions: 96,
|
|
9048
|
+
lineDeletions: 0
|
|
9049
|
+
}];
|
|
9050
|
+
const logSeed = [
|
|
9051
|
+
{
|
|
9052
|
+
id: "run-support-agent-001",
|
|
9053
|
+
projectId: "project_personal_repo",
|
|
9054
|
+
projectName: "Blake's Project",
|
|
9055
|
+
resourceKind: "agent",
|
|
9056
|
+
resourceId: "agent-support",
|
|
9057
|
+
resourceName: "Support Agent",
|
|
9058
|
+
status: "success",
|
|
9059
|
+
createdAt: "2026-04-20T15:44:00Z",
|
|
9060
|
+
durationMs: 42e3,
|
|
9061
|
+
trigger: "manual",
|
|
9062
|
+
message: "Drafted three support replies."
|
|
9063
|
+
},
|
|
9064
|
+
{
|
|
9065
|
+
id: "run-daily-digest-001",
|
|
9066
|
+
projectId: "project_personal_repo",
|
|
9067
|
+
projectName: "Blake's Project",
|
|
9068
|
+
resourceKind: "workflow",
|
|
9069
|
+
resourceId: "workflow-daily-digest",
|
|
9070
|
+
resourceName: "Daily Digest",
|
|
9071
|
+
status: "running",
|
|
9072
|
+
createdAt: "2026-04-20T15:12:00Z",
|
|
9073
|
+
durationMs: null,
|
|
9074
|
+
trigger: "schedule.daily",
|
|
9075
|
+
message: "Collecting project updates."
|
|
9076
|
+
},
|
|
9077
|
+
{
|
|
9078
|
+
id: "run-support-agent-000",
|
|
9079
|
+
projectId: "project_personal_repo",
|
|
9080
|
+
projectName: "Blake's Project",
|
|
9081
|
+
resourceKind: "agent",
|
|
9082
|
+
resourceId: "agent-support",
|
|
9083
|
+
resourceName: "Support Agent",
|
|
9084
|
+
status: "failed",
|
|
9085
|
+
createdAt: "2026-04-19T18:22:00Z",
|
|
9086
|
+
durationMs: 12e3,
|
|
9087
|
+
trigger: "slack.message",
|
|
9088
|
+
message: "Credential expired before response could be posted."
|
|
9089
|
+
}
|
|
9090
|
+
];
|
|
9091
|
+
const projectFileSeed = [
|
|
9092
|
+
{
|
|
9093
|
+
id: "file-agents-support-agent",
|
|
9094
|
+
projectId: "project_personal_repo",
|
|
9095
|
+
path: "src/agents/support-agent.ts",
|
|
9096
|
+
language: "typescript",
|
|
9097
|
+
updatedAt: "2026-04-20T15:44:00Z",
|
|
9098
|
+
contents: `import { defineAgent } from "@keystrokehq/agent";
|
|
9099
|
+
|
|
9100
|
+
export const supportAgent = defineAgent({
|
|
9101
|
+
key: "support-agent",
|
|
9102
|
+
name: "Support Agent",
|
|
9103
|
+
model: "claude-4-sonnet",
|
|
9104
|
+
instructions: "Triage support requests and draft helpful replies.",
|
|
9105
|
+
});
|
|
9106
|
+
`
|
|
9107
|
+
},
|
|
9108
|
+
{
|
|
9109
|
+
id: "file-workflows-daily-digest",
|
|
9110
|
+
projectId: "project_personal_repo",
|
|
9111
|
+
path: "src/workflows/daily-digest.ts",
|
|
9112
|
+
language: "typescript",
|
|
9113
|
+
updatedAt: "2026-04-20T15:12:00Z",
|
|
9114
|
+
contents: `import { defineWorkflow } from "@keystrokehq/workflow";
|
|
9115
|
+
|
|
9116
|
+
export const dailyDigest = defineWorkflow({
|
|
9117
|
+
key: "daily-digest",
|
|
9118
|
+
name: "Daily Digest",
|
|
9119
|
+
trigger: "schedule.daily",
|
|
9120
|
+
async run(ctx) {
|
|
9121
|
+
await ctx.step("collect-updates");
|
|
9122
|
+
await ctx.step("send-summary");
|
|
9123
|
+
},
|
|
9124
|
+
});
|
|
9125
|
+
`
|
|
9126
|
+
},
|
|
9127
|
+
{
|
|
9128
|
+
id: "file-skills-attio-sync",
|
|
9129
|
+
projectId: "project_personal_repo",
|
|
9130
|
+
path: ".agents/skills/attio-sync/SKILL.md",
|
|
9131
|
+
language: "markdown",
|
|
9132
|
+
updatedAt: "2026-04-19T18:05:00Z",
|
|
9133
|
+
contents: `# Attio Sync
|
|
9134
|
+
|
|
9135
|
+
Use this skill when a workflow needs to enrich company or person records from Attio.
|
|
9136
|
+
|
|
9137
|
+
## Inputs
|
|
9138
|
+
|
|
9139
|
+
- company domain
|
|
9140
|
+
- contact email
|
|
9141
|
+
- enrichment depth
|
|
9142
|
+
|
|
9143
|
+
## Output
|
|
9144
|
+
|
|
9145
|
+
Normalized CRM metadata ready for downstream workflow steps.
|
|
9146
|
+
`
|
|
9147
|
+
},
|
|
9148
|
+
{
|
|
9149
|
+
id: "file-actions-send-slack",
|
|
9150
|
+
projectId: "project_personal_repo",
|
|
9151
|
+
path: "src/actions/send-slack-message.ts",
|
|
9152
|
+
language: "typescript",
|
|
9153
|
+
updatedAt: "2026-04-18T12:30:00Z",
|
|
9154
|
+
contents: `import { defineAction } from "@keystrokehq/action";
|
|
9155
|
+
|
|
9156
|
+
export const sendSlackMessage = defineAction({
|
|
9157
|
+
key: "send-slack-message",
|
|
9158
|
+
name: "Send Slack message",
|
|
9159
|
+
async run({ channel, text }) {
|
|
9160
|
+
return { channel, text, sent: true };
|
|
9161
|
+
},
|
|
9162
|
+
});
|
|
9163
|
+
`
|
|
9164
|
+
}
|
|
9165
|
+
];
|
|
9166
|
+
const organizationMemberSeed = [
|
|
9167
|
+
{
|
|
9168
|
+
id: "user_blake_rouse",
|
|
9169
|
+
name: "Blake Rouse",
|
|
9170
|
+
email: "blake@keystroke.ai",
|
|
9171
|
+
role: "owner",
|
|
9172
|
+
joinedAt: "2026-01-12T18:00:00Z",
|
|
9173
|
+
lastActiveAt: "2026-05-31T18:00:00Z"
|
|
9174
|
+
},
|
|
9175
|
+
{
|
|
9176
|
+
id: "org-member-nate",
|
|
9177
|
+
name: "Nate Wells",
|
|
9178
|
+
email: "nate@keystroke.ai",
|
|
9179
|
+
role: "admin",
|
|
9180
|
+
joinedAt: "2026-02-03T18:00:00Z",
|
|
9181
|
+
lastActiveAt: "2026-05-31T16:00:00Z"
|
|
9182
|
+
},
|
|
9183
|
+
{
|
|
9184
|
+
id: "org-member-dallin",
|
|
9185
|
+
name: "Dallin Bentley",
|
|
9186
|
+
email: "dallin@keystroke.ai",
|
|
9187
|
+
role: "builder",
|
|
9188
|
+
joinedAt: "2026-03-18T18:00:00Z",
|
|
9189
|
+
lastActiveAt: "2026-05-30T16:00:00Z"
|
|
9190
|
+
},
|
|
9191
|
+
{
|
|
9192
|
+
id: "org-member-wells",
|
|
9193
|
+
name: "Wells Riley",
|
|
9194
|
+
email: "wells@keystroke.ai",
|
|
9195
|
+
role: "builder",
|
|
9196
|
+
joinedAt: "2026-04-09T18:00:00Z",
|
|
9197
|
+
lastActiveAt: "2026-05-20T16:00:00Z"
|
|
9198
|
+
}
|
|
9199
|
+
];
|
|
9200
|
+
const projectMemberSeed = organizationMemberSeed.map((member, index) => ({
|
|
9201
|
+
id: `project-member-${member.id}`,
|
|
9202
|
+
projectId: "project_personal_repo",
|
|
9203
|
+
name: member.name,
|
|
9204
|
+
email: member.email,
|
|
9205
|
+
role: index <= 1 ? "admin" : "editor",
|
|
9206
|
+
avatarUrl: member.avatarUrl,
|
|
9207
|
+
joinedAt: member.joinedAt,
|
|
9208
|
+
lastActiveAt: member.lastActiveAt,
|
|
9209
|
+
isCurrentUser: member.id === "user_blake_rouse"
|
|
9210
|
+
}));
|
|
9211
|
+
const apiKeySeed = [
|
|
9212
|
+
{
|
|
9213
|
+
id: "api-key-local-dev",
|
|
9214
|
+
name: "LOCAL_DEV_BLAKE",
|
|
9215
|
+
keyPreview: "sk-******J7Pt",
|
|
9216
|
+
createdAt: "2026-04-20T15:44:00Z",
|
|
9217
|
+
createdBy: organizationMemberSeed[0],
|
|
9218
|
+
isCreatedByCurrentUser: true
|
|
9219
|
+
},
|
|
9220
|
+
{
|
|
9221
|
+
id: "api-key-ci-deploy",
|
|
9222
|
+
name: "CI deploy",
|
|
9223
|
+
keyPreview: "sk-******TJb7",
|
|
9224
|
+
createdAt: "2026-03-08T15:44:00Z",
|
|
9225
|
+
createdBy: organizationMemberSeed[1],
|
|
9226
|
+
isCreatedByCurrentUser: false
|
|
9227
|
+
},
|
|
9228
|
+
{
|
|
9229
|
+
id: "api-key-partner-webhooks",
|
|
9230
|
+
name: "partner_webhooks",
|
|
9231
|
+
keyPreview: "sk-******9Qzc",
|
|
9232
|
+
createdAt: "2026-02-18T15:44:00Z",
|
|
9233
|
+
createdBy: organizationMemberSeed[2],
|
|
9234
|
+
isCreatedByCurrentUser: false
|
|
9235
|
+
}
|
|
9236
|
+
];
|
|
9237
|
+
const recentResourceSeed = [
|
|
9238
|
+
{
|
|
9239
|
+
id: "recent-project-personal",
|
|
9240
|
+
resourceKind: "project",
|
|
9241
|
+
resourceId: "project_personal_repo",
|
|
9242
|
+
name: "Blake's Project",
|
|
9243
|
+
lastOpenedAt: "2026-05-31T20:15:00Z"
|
|
9244
|
+
},
|
|
9245
|
+
{
|
|
9246
|
+
id: "recent-agent-support",
|
|
9247
|
+
resourceKind: "agent",
|
|
9248
|
+
resourceId: "agent-support",
|
|
9249
|
+
name: "Support Agent",
|
|
9250
|
+
projectId: "project_personal_repo",
|
|
9251
|
+
projectName: "Blake's Project",
|
|
9252
|
+
lastOpenedAt: "2026-05-31T19:42:00Z"
|
|
9253
|
+
},
|
|
9254
|
+
{
|
|
9255
|
+
id: "recent-workflow-digest",
|
|
9256
|
+
resourceKind: "workflow",
|
|
9257
|
+
resourceId: "workflow-daily-digest",
|
|
9258
|
+
name: "Daily Digest",
|
|
9259
|
+
projectId: "project_personal_repo",
|
|
9260
|
+
projectName: "Blake's Project",
|
|
9261
|
+
lastOpenedAt: "2026-05-31T18:30:00Z"
|
|
9262
|
+
}
|
|
9263
|
+
];
|
|
9264
|
+
let credentialRecords = [...credentialSeed];
|
|
9265
|
+
function createAgentsResource() {
|
|
9266
|
+
return {
|
|
9267
|
+
list: mock({
|
|
9268
|
+
domain: "agents",
|
|
9269
|
+
method: "list",
|
|
9270
|
+
plannedEndpoint: "GET /api/agents"
|
|
9271
|
+
}, async () => agentSeed),
|
|
9272
|
+
get: mock({
|
|
9273
|
+
domain: "agents",
|
|
9274
|
+
method: "get",
|
|
9275
|
+
plannedEndpoint: "GET /api/agents/:id"
|
|
9276
|
+
}, async (agentId) => agentSeed.find((agent) => agent.id === agentId) ?? null)
|
|
9277
|
+
};
|
|
9278
|
+
}
|
|
9279
|
+
function createWorkflowsResource() {
|
|
9280
|
+
return {
|
|
9281
|
+
list: mock({
|
|
9282
|
+
domain: "workflows",
|
|
9283
|
+
method: "list",
|
|
9284
|
+
plannedEndpoint: "GET /api/workflows"
|
|
9285
|
+
}, async () => workflowSeed),
|
|
9286
|
+
get: mock({
|
|
9287
|
+
domain: "workflows",
|
|
9288
|
+
method: "get",
|
|
9289
|
+
plannedEndpoint: "GET /api/workflows/:id"
|
|
9290
|
+
}, async (workflowId) => workflowSeed.find((workflow) => workflow.id === workflowId) ?? null)
|
|
9291
|
+
};
|
|
9292
|
+
}
|
|
9293
|
+
function createSkillsResource() {
|
|
9294
|
+
return {
|
|
9295
|
+
list: mock({
|
|
9296
|
+
domain: "skills",
|
|
9297
|
+
method: "list",
|
|
9298
|
+
plannedEndpoint: "GET /api/skills"
|
|
9299
|
+
}, async () => skillSeed),
|
|
9300
|
+
get: mock({
|
|
9301
|
+
domain: "skills",
|
|
9302
|
+
method: "get",
|
|
9303
|
+
plannedEndpoint: "GET /api/skills/:id"
|
|
9304
|
+
}, async (skillId) => skillSeed.find((skill) => skill.id === skillId) ?? null)
|
|
9305
|
+
};
|
|
9306
|
+
}
|
|
9307
|
+
function createAppsResource() {
|
|
9308
|
+
return { listCatalog: mock({
|
|
9309
|
+
domain: "apps",
|
|
9310
|
+
method: "listCatalog",
|
|
9311
|
+
plannedEndpoint: "GET /api/apps"
|
|
9312
|
+
}, async () => appCatalogSeed) };
|
|
9313
|
+
}
|
|
9314
|
+
function createCredentialsResource() {
|
|
9315
|
+
return {
|
|
9316
|
+
list: mock({
|
|
9317
|
+
domain: "credentials",
|
|
9318
|
+
method: "list",
|
|
9319
|
+
plannedEndpoint: "GET /api/credentials"
|
|
9320
|
+
}, async () => credentialRecords),
|
|
9321
|
+
get: mock({
|
|
9322
|
+
domain: "credentials",
|
|
9323
|
+
method: "get",
|
|
9324
|
+
plannedEndpoint: "GET /api/credentials/:id"
|
|
9325
|
+
}, async (credentialId) => credentialRecords.find((credential) => credential.id === credentialId) ?? null),
|
|
9326
|
+
startOAuthConnection: mock({
|
|
9327
|
+
domain: "credentials",
|
|
9328
|
+
method: "startOAuthConnection",
|
|
9329
|
+
plannedEndpoint: "POST /api/credentials/oauth/start"
|
|
9330
|
+
}, async (input) => {
|
|
9331
|
+
await new Promise((resolve) => setTimeout(resolve, 900));
|
|
9332
|
+
return {
|
|
9333
|
+
status: "connected",
|
|
9334
|
+
authorizeUrl: null
|
|
9335
|
+
};
|
|
9336
|
+
}),
|
|
9337
|
+
create: mock({
|
|
9338
|
+
domain: "credentials",
|
|
9339
|
+
method: "create",
|
|
9340
|
+
plannedEndpoint: "POST /api/credentials"
|
|
9341
|
+
}, async (input) => {
|
|
9342
|
+
const app = appCatalogSeed.find((entry) => entry.id === input.appId);
|
|
9343
|
+
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
9344
|
+
const base = {
|
|
9345
|
+
appId: input.appId,
|
|
9346
|
+
appName: app?.name,
|
|
9347
|
+
status: "Active",
|
|
9348
|
+
connectionKind: input.connectionKind,
|
|
9349
|
+
createdAt: now,
|
|
9350
|
+
lastRefreshedAt: now,
|
|
9351
|
+
lastUsedAt: null,
|
|
9352
|
+
isDefault: false,
|
|
9353
|
+
grantedScopes: input.scopes,
|
|
9354
|
+
credentialKeys: input.apiKey ? [`${(app?.name ?? "APP").toUpperCase().replace(/\W+/g, "_")}_API_KEY`] : void 0,
|
|
9355
|
+
ownerUserId: "user_blake_rouse",
|
|
9356
|
+
ownerName: "Blake Rouse"
|
|
9357
|
+
};
|
|
9358
|
+
const created = [
|
|
9359
|
+
...input.projectIds.map((projectId) => ({
|
|
9360
|
+
...base,
|
|
9361
|
+
id: `cred-${input.appId}-${projectId}-${Date.now().toString(36)}`,
|
|
9362
|
+
label: `${app?.name ?? input.appId} project credential`,
|
|
9363
|
+
scope: "project",
|
|
9364
|
+
projectId
|
|
9365
|
+
})),
|
|
9366
|
+
...input.createOrganizationCredential ? [{
|
|
9367
|
+
...base,
|
|
9368
|
+
id: `cred-${input.appId}-org-${Date.now().toString(36)}`,
|
|
9369
|
+
label: `${app?.name ?? input.appId} organization credential`,
|
|
9370
|
+
scope: "organization"
|
|
9371
|
+
}] : [],
|
|
9372
|
+
...input.createUserProvidedCredential ? [{
|
|
9373
|
+
...base,
|
|
9374
|
+
id: `cred-${input.appId}-user-${Date.now().toString(36)}`,
|
|
9375
|
+
label: `${app?.name ?? input.appId} personal credential`,
|
|
9376
|
+
scope: "user"
|
|
9377
|
+
}] : []
|
|
9378
|
+
];
|
|
9379
|
+
credentialRecords = [...created, ...credentialRecords];
|
|
9380
|
+
return created;
|
|
9381
|
+
})
|
|
9382
|
+
};
|
|
9383
|
+
}
|
|
9384
|
+
function createLogsResource() {
|
|
9385
|
+
return { list: mock({
|
|
9386
|
+
domain: "logs",
|
|
9387
|
+
method: "list",
|
|
9388
|
+
plannedEndpoint: "GET /api/logs"
|
|
9389
|
+
}, async () => logSeed) };
|
|
9390
|
+
}
|
|
9391
|
+
function createDeploymentsResource() {
|
|
9392
|
+
return { listForProject: mock({
|
|
9393
|
+
domain: "deployments",
|
|
9394
|
+
method: "listForProject",
|
|
9395
|
+
plannedEndpoint: "GET /api/projects/:id/deployments"
|
|
9396
|
+
}, async (projectId) => {
|
|
9397
|
+
return deploymentSeed.map((deployment) => ({
|
|
9398
|
+
...deployment,
|
|
9399
|
+
projectId
|
|
9400
|
+
}));
|
|
9401
|
+
}) };
|
|
9402
|
+
}
|
|
9403
|
+
function createProjectMetricsResource() {
|
|
9404
|
+
return { list: mock({
|
|
9405
|
+
domain: "projectMetrics",
|
|
9406
|
+
method: "list",
|
|
9407
|
+
plannedEndpoint: "GET /api/projects/metrics"
|
|
9408
|
+
}, async () => ({})) };
|
|
9409
|
+
}
|
|
9410
|
+
function createProjectFilesResource() {
|
|
9411
|
+
return { listForProject: mock({
|
|
9412
|
+
domain: "projectFiles",
|
|
9413
|
+
method: "listForProject",
|
|
9414
|
+
plannedEndpoint: "GET /api/projects/:id/files"
|
|
9415
|
+
}, async (projectId) => projectFileSeed.map((file) => ({
|
|
9416
|
+
...file,
|
|
9417
|
+
projectId
|
|
9418
|
+
}))) };
|
|
9419
|
+
}
|
|
9420
|
+
function createMembersResource() {
|
|
9421
|
+
return {
|
|
9422
|
+
listOrganizationMembers: mock({
|
|
9423
|
+
domain: "members",
|
|
9424
|
+
method: "listOrganizationMembers",
|
|
9425
|
+
plannedEndpoint: "GET /api/members"
|
|
9426
|
+
}, async () => organizationMemberSeed),
|
|
9427
|
+
listForProject: mock({
|
|
9428
|
+
domain: "members",
|
|
9429
|
+
method: "listForProject",
|
|
9430
|
+
plannedEndpoint: "GET /api/projects/:id/members"
|
|
9431
|
+
}, async (projectId) => projectMemberSeed.map((member) => ({
|
|
9432
|
+
...member,
|
|
9433
|
+
projectId
|
|
9434
|
+
})))
|
|
9435
|
+
};
|
|
9436
|
+
}
|
|
9437
|
+
let apiKeyRecords = [...apiKeySeed];
|
|
9438
|
+
function createApiKeysResource() {
|
|
9439
|
+
return {
|
|
9440
|
+
list: mock({
|
|
9441
|
+
domain: "apiKeys",
|
|
9442
|
+
method: "list",
|
|
9443
|
+
plannedEndpoint: "GET /api/api-keys"
|
|
9444
|
+
}, async () => apiKeyRecords),
|
|
9445
|
+
create: mock({
|
|
9446
|
+
domain: "apiKeys",
|
|
9447
|
+
method: "create",
|
|
9448
|
+
plannedEndpoint: "POST /api/api-keys"
|
|
9449
|
+
}, async (input) => {
|
|
9450
|
+
const created = {
|
|
9451
|
+
id: `api-key-${Date.now().toString(36)}`,
|
|
9452
|
+
name: input.name,
|
|
9453
|
+
keyPreview: "sk-******mock",
|
|
9454
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
9455
|
+
createdBy: organizationMemberSeed[0],
|
|
9456
|
+
isCreatedByCurrentUser: true
|
|
9457
|
+
};
|
|
9458
|
+
apiKeyRecords = [created, ...apiKeyRecords];
|
|
9459
|
+
return created;
|
|
9460
|
+
}),
|
|
9461
|
+
revoke: mock({
|
|
9462
|
+
domain: "apiKeys",
|
|
9463
|
+
method: "revoke",
|
|
9464
|
+
plannedEndpoint: "DELETE /api/api-keys/:id"
|
|
9465
|
+
}, async (apiKeyId) => {
|
|
9466
|
+
apiKeyRecords = apiKeyRecords.filter((apiKey) => apiKey.id !== apiKeyId);
|
|
9467
|
+
})
|
|
9468
|
+
};
|
|
9469
|
+
}
|
|
9470
|
+
function createRecentsResource() {
|
|
9471
|
+
return { list: mock({
|
|
9472
|
+
domain: "recents",
|
|
9473
|
+
method: "list",
|
|
9474
|
+
plannedEndpoint: "GET /api/recents"
|
|
9475
|
+
}, async () => recentResourceSeed) };
|
|
9476
|
+
}
|
|
7397
9477
|
function createPlatformClient(options) {
|
|
7398
9478
|
const auth = options.auth ?? { type: "none" };
|
|
7399
9479
|
const base = normalizeBaseUrl(options.baseUrl);
|
|
@@ -7417,6 +9497,18 @@ function createPlatformClient(options) {
|
|
|
7417
9497
|
organizations: createOrganizationsResource(http, { onActiveOrganizationChange: setActiveOrganizationId }),
|
|
7418
9498
|
projects: createProjectsResource(http),
|
|
7419
9499
|
artifacts: createArtifactsResource(http),
|
|
9500
|
+
agents: createAgentsResource(),
|
|
9501
|
+
workflows: createWorkflowsResource(),
|
|
9502
|
+
skills: createSkillsResource(),
|
|
9503
|
+
apps: createAppsResource(),
|
|
9504
|
+
credentials: createCredentialsResource(),
|
|
9505
|
+
logs: createLogsResource(),
|
|
9506
|
+
deployments: createDeploymentsResource(),
|
|
9507
|
+
projectMetrics: createProjectMetricsResource(),
|
|
9508
|
+
projectFiles: createProjectFilesResource(),
|
|
9509
|
+
members: createMembersResource(),
|
|
9510
|
+
apiKeys: createApiKeysResource(),
|
|
9511
|
+
recents: createRecentsResource(),
|
|
7420
9512
|
getActiveOrganizationId: () => activeOrganizationId,
|
|
7421
9513
|
setActiveOrganizationId
|
|
7422
9514
|
};
|
|
@@ -11117,7 +13209,7 @@ async function buildApp(options = {}) {
|
|
|
11117
13209
|
...options,
|
|
11118
13210
|
root
|
|
11119
13211
|
}));
|
|
11120
|
-
const { emitRouteManifest } = await import("./emit-route-manifest-DRcNXHCP-
|
|
13212
|
+
const { emitRouteManifest } = await import("./emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs");
|
|
11121
13213
|
await emitRouteManifest(root);
|
|
11122
13214
|
} finally {
|
|
11123
13215
|
process.chdir(previous);
|