Files
PaperClipAI/packages/teams-catalog/generated/catalog.json
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

540 lines
17 KiB
JSON

{
"schemaVersion": 1,
"packageName": "@paperclipai/teams-catalog",
"packageVersion": "0.1.0",
"generatedAt": "2026-10-08T10:35:56.448Z",
"teams": [
{
"id": "paperclipai:bundled:company-defaults:core-exec-team",
"key": "paperclipai/bundled/company-defaults/core-exec-team",
"kind": "bundled",
"category": "company-defaults",
"slug": "core-exec-team",
"name": "Core Exec Team",
"description": "Default leadership and engineering team for bootstrapping a Paperclip company with a CEO, CTO, QA Engineer, starter project, and a recurring CEO heartbeat review task.",
"path": "catalog/bundled/company-defaults/core-exec-team",
"entrypoint": "TEAM.md",
"schema": "agentcompanies/v1",
"defaultInstall": true,
"recommendedForCompanyTypes": [
"startup",
"software",
"generalist"
],
"tags": [
"default",
"executive",
"engineering",
"qa"
],
"counts": {
"agents": 3,
"projects": 1,
"tasks": 0,
"routines": 1,
"localSkills": 0,
"catalogSkills": 4,
"externalSkillSources": 0
},
"rootAgentSlugs": [
"ceo"
],
"agentSlugs": [
"ceo",
"cto",
"qa"
],
"projectSlugs": [
"first-project"
],
"requiredSkills": [
{
"type": "catalog",
"ref": "github-pr-workflow",
"agentSlugs": [
"cto"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:software-development:github-pr-workflow",
"catalogSkillKey": "paperclipai/bundled/software-development/github-pr-workflow"
},
{
"type": "catalog",
"ref": "issue-triage",
"agentSlugs": [
"ceo"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:paperclip-operations:issue-triage",
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/issue-triage"
},
{
"type": "catalog",
"ref": "qa-acceptance",
"agentSlugs": [
"qa"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:quality:qa-acceptance",
"catalogSkillKey": "paperclipai/bundled/quality/qa-acceptance"
},
{
"type": "catalog",
"ref": "task-planning",
"agentSlugs": [
"ceo",
"cto"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
}
],
"envInputs": [],
"sourceRefs": [],
"files": [
{
"path": "TEAM.md",
"kind": "team",
"sizeBytes": 2014,
"sha256": "e0c38e9af1a5dd1888fb81a72feba75a9ab1be4c78d8ceb658e2e5cd621c5096"
},
{
"path": "agents/ceo/AGENTS.md",
"kind": "agent",
"sizeBytes": 263,
"sha256": "75848c6f794646a93e23bc73b80d31ef0eb8b83c105423eb98ea29e7685d2fd0"
},
{
"path": "agents/cto/AGENTS.md",
"kind": "agent",
"sizeBytes": 279,
"sha256": "d33bfdecdf2edcedde25599c72c383445365c595430109469a3919bf9cb12a3d"
},
{
"path": "agents/qa/AGENTS.md",
"kind": "agent",
"sizeBytes": 215,
"sha256": "8b7fbdd93c0ecebddc1c87fb87d201340bd5f90297015da6cacd1681e7be70b8"
},
{
"path": "projects/first-project/PROJECT.md",
"kind": "project",
"sizeBytes": 364,
"sha256": "1f457ae956da52ff83adc1cf63a3fb84337a4afb25bd43f0d123902d75e871cc"
},
{
"path": "projects/first-project/tasks/first-heartbeat/TASK.md",
"kind": "task",
"sizeBytes": 292,
"sha256": "bdc979cafa43fc9b8f0d6f0e4120c01cecfb899082781a5da88e26fa262f18e4"
}
],
"trustLevel": "markdown_only",
"compatibility": "compatible",
"contentHash": "sha256:9d0416ebc0a81585dc51b73efb25decba9e1e3f3741940fc9fca74f3238f344d"
},
{
"id": "paperclipai:bundled:product:product-design",
"key": "paperclipai/bundled/product/product-design",
"kind": "bundled",
"category": "product",
"slug": "product-design",
"name": "Product Design",
"description": "Bundled product design team with a Principal Product Designer who owns wireframes, design critiques, and UX quality reviews for a product company.",
"path": "catalog/bundled/product/product-design",
"entrypoint": "TEAM.md",
"schema": "agentcompanies/v1",
"defaultInstall": false,
"recommendedForCompanyTypes": [
"software",
"product",
"design"
],
"tags": [
"design",
"ux",
"product"
],
"counts": {
"agents": 1,
"projects": 1,
"tasks": 0,
"routines": 1,
"localSkills": 0,
"catalogSkills": 3,
"externalSkillSources": 0
},
"rootAgentSlugs": [
"ux-designer"
],
"agentSlugs": [
"ux-designer"
],
"projectSlugs": [
"product-design"
],
"requiredSkills": [
{
"type": "catalog",
"ref": "design-critique",
"agentSlugs": [
"ux-designer"
],
"resolved": true,
"catalogSkillId": "paperclipai:optional:product:design-critique",
"catalogSkillKey": "paperclipai/optional/product/design-critique"
},
{
"type": "catalog",
"ref": "task-planning",
"agentSlugs": [
"ux-designer"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
},
{
"type": "catalog",
"ref": "wireframe",
"agentSlugs": [
"ux-designer"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:product:wireframe",
"catalogSkillKey": "paperclipai/bundled/product/wireframe"
}
],
"envInputs": [],
"sourceRefs": [],
"files": [
{
"path": "TEAM.md",
"kind": "team",
"sizeBytes": 2025,
"sha256": "f950f4f77a26afa458ca0696994b51353a6bcfac81471fdc00c05f63950fcac5"
},
{
"path": "agents/ux-designer/AGENTS.md",
"kind": "agent",
"sizeBytes": 306,
"sha256": "301f2c7ed92bdd98036c06530588c77d74c3a3c6a8b9c724a3d35fee1142af6f"
},
{
"path": "projects/product-design/PROJECT.md",
"kind": "project",
"sizeBytes": 353,
"sha256": "4afe346bc5d5958216542d60a06be12983e1e018960cf2709c85c7d578f28420"
},
{
"path": "projects/product-design/tasks/weekly-design-review/TASK.md",
"kind": "task",
"sizeBytes": 313,
"sha256": "d255115eccc5c8b9f576c34fc2fb46a1cbb86ab36a56b980bdab35a952482d8a"
}
],
"trustLevel": "markdown_only",
"compatibility": "compatible",
"contentHash": "sha256:67b041c3adc20583f844fd2415e1c67859a8342b59e46ec32b038b70b7af0108"
},
{
"id": "paperclipai:bundled:software-development:product-engineering",
"key": "paperclipai/bundled/software-development/product-engineering",
"kind": "bundled",
"category": "software-development",
"slug": "product-engineering",
"name": "Product Engineering",
"description": "Bundled engineering team that pairs a CTO with a senior coder and a QA engineer to deliver, review, and verify product changes.",
"path": "catalog/bundled/software-development/product-engineering",
"entrypoint": "TEAM.md",
"schema": "agentcompanies/v1",
"defaultInstall": false,
"recommendedForCompanyTypes": [
"software",
"startup",
"product"
],
"tags": [
"engineering",
"delivery",
"qa",
"code-review"
],
"counts": {
"agents": 3,
"projects": 1,
"tasks": 0,
"routines": 1,
"localSkills": 0,
"catalogSkills": 4,
"externalSkillSources": 0
},
"rootAgentSlugs": [
"cto"
],
"agentSlugs": [
"cto",
"qa",
"senior-coder"
],
"projectSlugs": [
"product-engineering"
],
"requiredSkills": [
{
"type": "catalog",
"ref": "doc-maintenance",
"agentSlugs": [
"cto",
"senior-coder"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:docs:doc-maintenance",
"catalogSkillKey": "paperclipai/bundled/docs/doc-maintenance"
},
{
"type": "catalog",
"ref": "github-pr-workflow",
"agentSlugs": [
"cto",
"senior-coder"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:software-development:github-pr-workflow",
"catalogSkillKey": "paperclipai/bundled/software-development/github-pr-workflow"
},
{
"type": "catalog",
"ref": "qa-acceptance",
"agentSlugs": [
"qa"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:quality:qa-acceptance",
"catalogSkillKey": "paperclipai/bundled/quality/qa-acceptance"
},
{
"type": "catalog",
"ref": "task-planning",
"agentSlugs": [
"cto"
],
"resolved": true,
"catalogSkillId": "paperclipai:bundled:paperclip-operations:task-planning",
"catalogSkillKey": "paperclipai/bundled/paperclip-operations/task-planning"
}
],
"envInputs": [],
"sourceRefs": [],
"files": [
{
"path": "TEAM.md",
"kind": "team",
"sizeBytes": 2583,
"sha256": "7204eeef78a48714dd3f82b82e171a4039adc6325e91a6bdf51a442105ee33b0"
},
{
"path": ".paperclip.yaml",
"kind": "extension",
"sizeBytes": 81,
"sha256": "54babf05ba130ec54a143abf01581d99c0ac2936fd0d929bf0e0edd00e29d861"
},
{
"path": "agents/cto/AGENTS.md",
"kind": "agent",
"sizeBytes": 331,
"sha256": "28849cb94cb506c4437fa4f9fa19dccb3e29b16175a9b99204a006dac721da48"
},
{
"path": "agents/qa/AGENTS.md",
"kind": "agent",
"sizeBytes": 247,
"sha256": "577f585f6db5271cb7335861debe91fc3201fba9e1565e32611e957ddfab8e05"
},
{
"path": "agents/senior-coder/AGENTS.md",
"kind": "agent",
"sizeBytes": 292,
"sha256": "e03e0eef79adc04b4ee558ac920bf2ef0581e9494510b7a12d5f1aea70858f18"
},
{
"path": "projects/product-engineering/PROJECT.md",
"kind": "project",
"sizeBytes": 358,
"sha256": "225d01c5b5b77f5d4dafedc083899c9368c9b079db1d3b7b67cfebd4677fc527"
},
{
"path": "projects/product-engineering/tasks/weekly-engineering-sync/TASK.md",
"kind": "task",
"sizeBytes": 322,
"sha256": "6acf3ed2da3dfa48de163810b4bc9d385dad537fd34037ca881eec713986a2a8"
}
],
"trustLevel": "assets",
"compatibility": "compatible",
"contentHash": "sha256:b9076b17a551b704a97df2e0204cefb83edfda4d36e909889071bb02d251e5ea"
},
{
"id": "paperclipai:optional:communications:speko-company-phone-agent",
"key": "paperclipai/optional/communications/speko-company-phone-agent",
"kind": "optional",
"category": "communications",
"slug": "speko-company-phone-agent",
"name": "Speko Company Phone Agent",
"description": "Optional company voice receptionist for greeting, intake, clarification, delegation, and concise task follow-up through Speko.",
"path": "catalog/optional/communications/speko-company-phone-agent",
"entrypoint": "TEAM.md",
"schema": "agentcompanies/v1",
"defaultInstall": false,
"recommendedForCompanyTypes": [
"agency",
"services",
"software"
],
"tags": [
"speko",
"voice",
"phone",
"intake"
],
"counts": {
"agents": 1,
"projects": 0,
"tasks": 0,
"routines": 0,
"localSkills": 0,
"catalogSkills": 0,
"externalSkillSources": 0
},
"rootAgentSlugs": [
"speko-company-phone-agent"
],
"agentSlugs": [
"speko-company-phone-agent"
],
"projectSlugs": [],
"requiredSkills": [],
"envInputs": [],
"sourceRefs": [],
"files": [
{
"path": "TEAM.md",
"kind": "team",
"sizeBytes": 1097,
"sha256": "04c89ffaf7d8d778b1e18bae7cbea3c5740c359a61c42a139759eaad443b7f76"
},
{
"path": "agents/speko-company-phone-agent/AGENTS.md",
"kind": "agent",
"sizeBytes": 3199,
"sha256": "922d60cfae8a469876390b3434a513f0b3eff09c8263b51c3f222d388417ac1d"
},
{
"path": "LICENSE",
"kind": "other",
"sizeBytes": 1069,
"sha256": "7f8a27f0979bded50e240caa8c8c29f3088ddf87032cb83e5a9732bff91d18b4"
},
{
"path": "README.md",
"kind": "readme",
"sizeBytes": 1417,
"sha256": "445c4b7ec5a201b73123aba1ce5dbb5a52352ed488364eed62a041c30656c7d7"
}
],
"trustLevel": "assets",
"compatibility": "compatible",
"contentHash": "sha256:e723a036948dcb292382fbcb116c68500c2247b004d0a8d8ef818b6725f91215"
},
{
"id": "paperclipai:optional:content:content-machine",
"key": "paperclipai/optional/content/content-machine",
"kind": "optional",
"category": "content",
"slug": "content-machine",
"name": "Content Machine",
"description": "Optional content operations team with a lead agent, a recurring review task, and a vendored local content planning skill.",
"path": "catalog/optional/content/content-machine",
"entrypoint": "TEAM.md",
"schema": "agentcompanies/v1",
"defaultInstall": false,
"recommendedForCompanyTypes": [
"agency",
"marketing"
],
"tags": [
"content",
"marketing",
"routines"
],
"counts": {
"agents": 1,
"projects": 1,
"tasks": 0,
"routines": 1,
"localSkills": 1,
"catalogSkills": 0,
"externalSkillSources": 0
},
"rootAgentSlugs": [
"content-lead"
],
"agentSlugs": [
"content-lead"
],
"projectSlugs": [
"content-operations"
],
"requiredSkills": [
{
"type": "local",
"ref": "content-calendar",
"agentSlugs": [
"content-lead"
],
"resolved": true,
"localPath": "skills/content-calendar/SKILL.md"
}
],
"envInputs": [],
"sourceRefs": [],
"files": [
{
"path": "TEAM.md",
"kind": "team",
"sizeBytes": 1032,
"sha256": "f7c272c8b0c183fc840d49eb4851b7cdd1a30a5aa8d6415d215110f3238f6f13"
},
{
"path": "agents/content-lead/AGENTS.md",
"kind": "agent",
"sizeBytes": 251,
"sha256": "6fc2071ff463b6981780d5b40b2c0784cb119900062f8dc40ed372e7b8415bf7"
},
{
"path": "projects/content-operations/PROJECT.md",
"kind": "project",
"sizeBytes": 338,
"sha256": "1471f61cb0b3ffbb9c639a99d2d370f08217a0c63f97b3e24dbbd47861110206"
},
{
"path": "projects/content-operations/tasks/weekly-content-review/TASK.md",
"kind": "task",
"sizeBytes": 236,
"sha256": "3777de716334f2c3f24176f0fe121584ce9c53a7f59e1fca942a2f57995cef77"
},
{
"path": "skills/content-calendar/SKILL.md",
"kind": "skill",
"sizeBytes": 340,
"sha256": "aa62a332fc3149d6c0d58ca589c6b3910a373d542f16f749ec68ef2f3d7f29e9"
}
],
"trustLevel": "markdown_only",
"compatibility": "compatible",
"contentHash": "sha256:06822cec5f2b6910cb37ba0ebd5e04ed5c7e34f77225564ddddc2470779cdaa6"
}
]
}