@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.
Files changed (42) hide show
  1. package/dist/{cat-TSFMZVYS-COyQw_zT.mjs → cat-TSFMZVYS-BfwZOafs.mjs} +2 -2
  2. package/dist/{cat-TSFMZVYS-COyQw_zT.mjs.map → cat-TSFMZVYS-BfwZOafs.mjs.map} +1 -1
  3. package/dist/{cut-OKARJCCV-DAC5beNE.mjs → cut-OKARJCCV-Cm3OStWG.mjs} +2 -2
  4. package/dist/{cut-OKARJCCV-DAC5beNE.mjs.map → cut-OKARJCCV-Cm3OStWG.mjs.map} +1 -1
  5. package/dist/{dist-CnoekdhF-nc3ePIKw.mjs → dist-CXHSlVhd-CTQzOALD.mjs} +620 -52
  6. package/dist/dist-CXHSlVhd-CTQzOALD.mjs.map +1 -0
  7. package/dist/{du-572XNP42-ClFDz1ub.mjs → du-572XNP42-DeJ11TW7.mjs} +2 -2
  8. package/dist/{du-572XNP42-ClFDz1ub.mjs.map → du-572XNP42-DeJ11TW7.mjs.map} +1 -1
  9. package/dist/{emit-route-manifest-DRcNXHCP-CqaK0qtn.mjs → emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs} +194 -16
  10. package/dist/{emit-route-manifest-DRcNXHCP-CqaK0qtn.mjs.map → emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs.map} +1 -1
  11. package/dist/index.mjs +2152 -60
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/{jq-4XLYLOS5-BWKcXbpD.mjs → jq-4XLYLOS5-DrYXLsYH.mjs} +2 -2
  14. package/dist/{jq-4XLYLOS5-BWKcXbpD.mjs.map → jq-4XLYLOS5-DrYXLsYH.mjs.map} +1 -1
  15. package/dist/{ls-ZJGQER7M-DjEDom2D.mjs → ls-ZJGQER7M-C_1bAeGq.mjs} +2 -2
  16. package/dist/{ls-ZJGQER7M-DjEDom2D.mjs.map → ls-ZJGQER7M-C_1bAeGq.mjs.map} +1 -1
  17. package/dist/{mistral-nX_EdAQA-BcnqjD2e.mjs → mistral-B75PpahY-Bd3ZQ07v.mjs} +3 -3
  18. package/dist/{mistral-nX_EdAQA-BcnqjD2e.mjs.map → mistral-B75PpahY-Bd3ZQ07v.mjs.map} +1 -1
  19. package/dist/skills-bundle/_AGENTS.md +2 -0
  20. package/dist/skills-bundle/skills/cli/SKILL.md +1 -1
  21. package/dist/skills-bundle/skills/cli/references/api-targets.md +4 -4
  22. package/dist/{sort-SW2YEO5B-BGiKfkqv.mjs → sort-SW2YEO5B-D08jaQ5v.mjs} +2 -2
  23. package/dist/{sort-SW2YEO5B-BGiKfkqv.mjs.map → sort-SW2YEO5B-D08jaQ5v.mjs.map} +1 -1
  24. package/dist/templates/hello-world/package.json +1 -1
  25. package/dist/{tree-YLD52CNT-B616RO-w.mjs → tree-YLD52CNT-DiHyiFBi.mjs} +2 -2
  26. package/dist/{tree-YLD52CNT-B616RO-w.mjs.map → tree-YLD52CNT-DiHyiFBi.mjs.map} +1 -1
  27. package/dist/{uniq-XSIZR6PB-ByjUQvSp.mjs → uniq-XSIZR6PB-BA-vRB1O.mjs} +2 -2
  28. package/dist/{uniq-XSIZR6PB-ByjUQvSp.mjs.map → uniq-XSIZR6PB-BA-vRB1O.mjs.map} +1 -1
  29. package/dist/{wc-LF7NU4LA-C9tSAYz9.mjs → wc-LF7NU4LA-BWoItyXd.mjs} +2 -2
  30. package/dist/{wc-LF7NU4LA-C9tSAYz9.mjs.map → wc-LF7NU4LA-BWoItyXd.mjs.map} +1 -1
  31. package/dist/{xan-Y6WF3IRG-FxihFV4-.mjs → xan-Y6WF3IRG-BilR2MsH.mjs} +2 -2
  32. package/dist/{xan-Y6WF3IRG-FxihFV4-.mjs.map → xan-Y6WF3IRG-BilR2MsH.mjs.map} +1 -1
  33. package/package.json +18 -18
  34. package/dist/dist-CnoekdhF-nc3ePIKw.mjs.map +0 -1
  35. package/dist/skills-bundle/index.cjs +0 -46
  36. package/dist/skills-bundle/index.cjs.map +0 -1
  37. package/dist/skills-bundle/index.d.cts +0 -12
  38. package/dist/skills-bundle/index.d.cts.map +0 -1
  39. package/dist/skills-bundle/index.d.mts +0 -12
  40. package/dist/skills-bundle/index.d.mts.map +0 -1
  41. package/dist/skills-bundle/index.mjs +0 -40
  42. 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
- /** URL segment reserved for global (non-org) routes — cannot be used as an org slug. */
6232
- const RESERVED_ORGANIZATION_SLUGS = new Set([
6233
- "api",
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
- "signup"
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
- 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").refine((slug) => !RESERVED_ORGANIZATION_SLUGS.has(slug), "This slug is reserved");
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
- constructor(message, status, body) {
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-CqaK0qtn.mjs");
13212
+ const { emitRouteManifest } = await import("./emit-route-manifest-DRcNXHCP-CSOVo0UZ.mjs");
11121
13213
  await emitRouteManifest(root);
11122
13214
  } finally {
11123
13215
  process.chdir(previous);