Files
PaperClipAI/packages/shared/src/app-definitions.generated.ts
T
DottaandPaperclip 22d05644f4 feat(ui): add Speko voice setup, task calls, and Storybook coverage (#15728)
Runtime #15727 is merged. This PR adds the UI. Qualification follows in
#15729.

## Thinking Path

> - Paperclip manages agent work through tasks and governed connections.
> - Chat connections already bind external conversations to those tasks.
> - Speko handles voice and telephony, while the selected Paperclip
agent does the work.
> - A call needs durable session authority, ordered follow-ups, and safe
result delivery.
> - This PR adds the Speko setup and call controls to the existing Apps
and task UI.
> - This PR depends on #15727. The qualification suite follows
separately. Speko stays experimental.

## Linked Issues or Issue Description

**Problem or motivation**

Phone and browser voice conversations cannot use the chat connection
task lifecycle. A separate voice runtime is needed to preserve task
authority, retries, and reply history.

**Proposed solution**

Add company-scoped voice sessions, signed callbacks, durable replies,
inbound intake, and an agent-facing outbound-call tool. Reuse existing
tasks, queues, secrets, and publications.

**Roadmap alignment**

This extends the experimental chat connector entry points under Agent
Chat and Connected Apps. The project owner requested this feature.

Refs #11418 for the original provider catalog proposal. This
implementation uses the newer chat connection infrastructure rather than
an MCP catalog-only integration. Refs #15721 for remote OpenCode
startup.

## What Changed

- Add the Speko Apps catalog entry, provider artwork, and browser SDK.
- Reuse existing agents in setup. Keep the optional Company Phone Agent
in the catalog, with connection instructions available to any assigned
agent.
- Add task voice controls, transcripts, phone callbacks, inbound-line
settings, and call Activity entries.
- Surface retryable connection and incoming-task inventory failures,
preserve active call controls and cached tasks, restore keyboard focus
after recovery, and bound notification polling so a stuck request cannot
hide later results.
- Put Save & exit and Connect Speko in the credential step’s shared
footer.
- Add deterministic production-component Storybook fixtures for setup,
lifecycle, failures, permissions, and phone surfaces.
- Include voice components in the design guide. Stories never request a
real microphone or place calls.

## Verification

- All 27 focused UI/controller regressions, UI typecheck, token gates,
and 28 map/catalog structural tests pass. The shared connection cache
test covers pause/resume invalidation during the 30-second fresh period.
- Storybook builds 157 Speko production-component stories. The complete
prior 156-story set passed all 624 checks on UI source 249cbc616a. After
the final cache repair, all 152 affected page/launcher checks passed
across both themes, 390/1200 widths and reduced motion. Real microphone
access and external provider requests are blocked.
- Source annotations follow the current generated-catalog contract. No
generated catalog or lockfile is included. Three inherited
GitHub-heading tests passed after master reconciliation.
- Latest-head CI and Greptile review must pass before merge. Local
fixture success does not establish provider or spoken-playback
acceptance.
- The separate integrated browser run passed two journeys and failed
browser answer retrieval. Real browser/telephone playback and timing
acceptance remain outstanding. See the dated qualification report and
E01–E16 runbook. Speko stays experimental.

## Risks

- Voice sessions add migrations and provider-dependent lifecycle
behavior. Migrations preserve existing chat and AI transports.
- Callback origins must be reachable HTTPS. Provider keys and signing
secrets remain vaulted.
- Unverified callers receive task-scoped low-trust authority. Caller ID
does not grant private task access.
- Outbound telephony incurs provider charges. Provider acceptance is not
proof that the caller heard an answer.
- Keep the feature behind the existing experimental chat setting until
the real browser, inbound, outbound, and delayed-result acceptance
matrix passes.

## Model Used

OpenAI Codex, GPT-6, with tool use and code execution. The exact serving
model ID and context window are not exposed in this session.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [ ] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-13 16:26:38 -05:00

106 lines
7.9 KiB
TypeScript

import a0 from "./app-definitions/agentmail.json" with { type: "json" };
import a1 from "./app-definitions/zapier.json" with { type: "json" };
import a2 from "./app-definitions/arcade.json" with { type: "json" };
import a3 from "./app-definitions/executor.json" with { type: "json" };
import a4 from "./app-definitions/railway.json" with { type: "json" };
import a5 from "./app-definitions/github.json" with { type: "json" };
import a6 from "./app-definitions/github-code-review-bot.json" with { type: "json" };
import a7 from "./app-definitions/slack.json" with { type: "json" };
import a8 from "./app-definitions/microsoft-teams.json" with { type: "json" };
import a9 from "./app-definitions/imessage-photon.json" with { type: "json" };
import a10 from "./app-definitions/telegram.json" with { type: "json" };
import a11 from "./app-definitions/discord.json" with { type: "json" };
import a12 from "./app-definitions/notion.json" with { type: "json" };
import a13 from "./app-definitions/posthog.json" with { type: "json" };
import a14 from "./app-definitions/linear.json" with { type: "json" };
import a15 from "./app-definitions/context7.json" with { type: "json" };
import a16 from "./app-definitions/shopify.json" with { type: "json" };
import a17 from "./app-definitions/composio.json" with { type: "json" };
import a18 from "./app-definitions/oauth-generic.json" with { type: "json" };
import a19 from "./app-definitions/api-key-generic.json" with { type: "json" };
import a20 from "./app-definitions/sentry.json" with { type: "json" };
import a21 from "./app-definitions/vercel.json" with { type: "json" };
import a22 from "./app-definitions/enterpret.json" with { type: "json" };
import a23 from "./app-definitions/anthropic.json" with { type: "json" };
import a24 from "./app-definitions/browser-use-cloud.json" with { type: "json" };
import a25 from "./app-definitions/cognee.json" with { type: "json" };
import a26 from "./app-definitions/jira.json" with { type: "json" };
import a27 from "./app-definitions/airtable.json" with { type: "json" };
import a28 from "./app-definitions/beehiiv.json" with { type: "json" };
import a29 from "./app-definitions/bitly.json" with { type: "json" };
import a30 from "./app-definitions/candid.json" with { type: "json" };
import a31 from "./app-definitions/cloudflare.json" with { type: "json" };
import a32 from "./app-definitions/cloudinary.json" with { type: "json" };
import a33 from "./app-definitions/coda.json" with { type: "json" };
import a34 from "./app-definitions/hugging-face.json" with { type: "json" };
import a35 from "./app-definitions/kernel.json" with { type: "json" };
import a36 from "./app-definitions/local-falcon.json" with { type: "json" };
import a37 from "./app-definitions/make.json" with { type: "json" };
import a38 from "./app-definitions/manufact.json" with { type: "json" };
import a39 from "./app-definitions/miro.json" with { type: "json" };
import a40 from "./app-definitions/netlify.json" with { type: "json" };
import a41 from "./app-definitions/oreilly.json" with { type: "json" };
import a42 from "./app-definitions/planetscale.json" with { type: "json" };
import a43 from "./app-definitions/resend.json" with { type: "json" };
import a44 from "./app-definitions/ticktick.json" with { type: "json" };
import a45 from "./app-definitions/todoist.json" with { type: "json" };
import a46 from "./app-definitions/webflow.json" with { type: "json" };
import a47 from "./app-definitions/wix.json" with { type: "json" };
import a48 from "./app-definitions/brex.json" with { type: "json" };
import a49 from "./app-definitions/clickhouse.json" with { type: "json" };
import a50 from "./app-definitions/egnyte.json" with { type: "json" };
import a51 from "./app-definitions/embat.json" with { type: "json" };
import a52 from "./app-definitions/mixpanel.json" with { type: "json" };
import a53 from "./app-definitions/postman.json" with { type: "json" };
import a54 from "./app-definitions/razorpay.json" with { type: "json" };
import a55 from "./app-definitions/sanity.json" with { type: "json" };
import a56 from "./app-definitions/stripe.json" with { type: "json" };
import a57 from "./app-definitions/supabase.json" with { type: "json" };
import a58 from "./app-definitions/ticket-tailor.json" with { type: "json" };
import a59 from "./app-definitions/asana.json" with { type: "json" };
import a60 from "./app-definitions/box.json" with { type: "json" };
import a61 from "./app-definitions/mem0.json" with { type: "json" };
import a62 from "./app-definitions/pagerduty.json" with { type: "json" };
import a63 from "./app-definitions/similarweb.json" with { type: "json" };
import a64 from "./app-definitions/xero.json" with { type: "json" };
import a65 from "./app-definitions/youcom.json" with { type: "json" };
import a66 from "./app-definitions/fireflies.json" with { type: "json" };
import a67 from "./app-definitions/zep.json" with { type: "json" };
import a68 from "./app-definitions/supermemory.json" with { type: "json" };
import a69 from "./app-definitions/honcho.json" with { type: "json" };
import a70 from "./app-definitions/neon.json" with { type: "json" };
import a71 from "./app-definitions/superagent.json" with { type: "json" };
import a72 from "./app-definitions/telem.json" with { type: "json" };
import a73 from "./app-definitions/gauge.json" with { type: "json" };
import a74 from "./app-definitions/tavily.json" with { type: "json" };
import a75 from "./app-definitions/calendly.json" with { type: "json" };
import a76 from "./app-definitions/exa.json" with { type: "json" };
import a77 from "./app-definitions/firecrawl.json" with { type: "json" };
import a78 from "./app-definitions/parallel-search.json" with { type: "json" };
import a79 from "./app-definitions/windsor-ai.json" with { type: "json" };
import a80 from "./app-definitions/gsc-wizard.json" with { type: "json" };
import a81 from "./app-definitions/clickup.json" with { type: "json" };
import a82 from "./app-definitions/klaviyo.json" with { type: "json" };
import a83 from "./app-definitions/gmail.json" with { type: "json" };
import a84 from "./app-definitions/google-drive.json" with { type: "json" };
import a85 from "./app-definitions/google-docs.json" with { type: "json" };
import a86 from "./app-definitions/google-sheets.json" with { type: "json" };
import a87 from "./app-definitions/google-slides.json" with { type: "json" };
import a88 from "./app-definitions/google-calendar.json" with { type: "json" };
import a89 from "./app-definitions/google-chat.json" with { type: "json" };
import a90 from "./app-definitions/google-people.json" with { type: "json" };
import a91 from "./app-definitions/google-workspace-search.json" with { type: "json" };
import a92 from "./app-definitions/openai.json" with { type: "json" };
import a93 from "./app-definitions/openrouter.json" with { type: "json" };
import a94 from "./app-definitions/xai.json" with { type: "json" };
import a95 from "./app-definitions/google.json" with { type: "json" };
import a96 from "./app-definitions/bedrock.json" with { type: "json" };
import a97 from "./app-definitions/responses-api.json" with { type: "json" };
import a98 from "./app-definitions/messages-api.json" with { type: "json" };
import a99 from "./app-definitions/chat-completions-api.json" with { type: "json" };
import a100 from "./app-definitions/local.json" with { type: "json" };
import a101 from "./app-definitions/monday.json" with { type: "json" };
import a102 from "./app-definitions/speko.json" with { type: "json" };
import type { AppDefinition } from "./types/app-definition.js";
export const APP_DEFINITIONS=[a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93,a94,a95,a96,a97,a98,a99,a100,a101,a102] as AppDefinition[];