tavus-cli 0.10.0__tar.gz → 0.10.2__tar.gz

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 (117) hide show
  1. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/deploy-cloudflare-worker.yml +28 -0
  2. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/pr-reviews.yml +4 -1
  3. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/pypi-cli.yml +27 -0
  4. tavus_cli-0.10.2/.release-please-manifest.json +3 -0
  5. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/CHANGELOG.md +15 -0
  6. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/PKG-INFO +1 -1
  7. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/packages/tavus/pyproject.toml +2 -2
  8. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/packages/tavus-mcp/pyproject.toml +2 -2
  9. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/pyproject.toml +1 -1
  10. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/__init__.py +1 -1
  11. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/builder_guidance.json +2 -2
  12. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/carrier_builder.py +2 -0
  13. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/server.py +20 -0
  14. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_build_and_verify.py +59 -0
  15. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/uv.lock +1 -1
  16. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/package-lock.json +2 -2
  17. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/package.json +1 -1
  18. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/src/tavus.ts +23 -0
  19. tavus_cli-0.10.2/workers/tavus-mcp/src/version.ts +1 -0
  20. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/test/parity.test.ts +0 -1
  21. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/test/tavus.test.ts +32 -0
  22. tavus_cli-0.10.0/.release-please-manifest.json +0 -3
  23. tavus_cli-0.10.0/workers/tavus-mcp/src/version.ts +0 -1
  24. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.agents/plugins/marketplace.json +0 -0
  25. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.env.example +0 -0
  26. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/ci.yml +0 -0
  27. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/tail-cloudflare-worker.yml +0 -0
  28. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.github/workflows/validate-staging-deployment.yml +0 -0
  29. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/.gitignore +0 -0
  30. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/AGENTS.md +0 -0
  31. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/PROMPT.md +0 -0
  32. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/README.md +0 -0
  33. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/builder-guidance.md +0 -0
  34. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/chatgpt-plugin.md +0 -0
  35. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/gemini-enterprise/README.md +0 -0
  36. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/gemini-enterprise/listing.md +0 -0
  37. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/gemini-enterprise/test-queries.md +0 -0
  38. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/docs/usage-observability.md +0 -0
  39. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/packages/tavus/README.md +0 -0
  40. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/packages/tavus-mcp/README.md +0 -0
  41. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/plugins/tavus-pal/assets/icon-dark.svg +0 -0
  42. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/plugins/tavus-pal/assets/icon.svg +0 -0
  43. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/plugins/tavus-pal/mcp.json +0 -0
  44. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/plugins/tavus-pal/plugin.json +0 -0
  45. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/release-please-config.json +0 -0
  46. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/scripts/__init__.py +0 -0
  47. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/scripts/build_chatgpt_plugin.py +0 -0
  48. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/scripts/check_release_versions.py +0 -0
  49. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/SKILL.md +0 -0
  50. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/agents/openai.yaml +0 -0
  51. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/references/build-and-verify.md +0 -0
  52. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/references/builder-workflow.md +0 -0
  53. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/references/chat-mode.md +0 -0
  54. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/skills/tavus-agentic-pals/references/examples.md +0 -0
  55. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/builder_guidance.py +0 -0
  56. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/cli/__init__.py +0 -0
  57. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/cli/main.py +0 -0
  58. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/__init__.py +0 -0
  59. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/auth/__init__.py +0 -0
  60. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/auth/keyring_store.py +0 -0
  61. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/auth/oauth.py +0 -0
  62. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/auth/session.py +0 -0
  63. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/client/__init__.py +0 -0
  64. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/client/http.py +0 -0
  65. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/daily_transport.py +0 -0
  66. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/env.py +0 -0
  67. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/errors.py +0 -0
  68. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/pal_urls.py +0 -0
  69. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/patch.py +0 -0
  70. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/__init__.py +0 -0
  71. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/build_and_verify.py +0 -0
  72. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/capabilities.py +0 -0
  73. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/deployments.py +0 -0
  74. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/knowledge.py +0 -0
  75. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/options.py +0 -0
  76. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/quickstart.py +0 -0
  77. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/scaffold_embed.py +0 -0
  78. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/templates.py +0 -0
  79. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/recipes/tool_reuse.py +0 -0
  80. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/__init__.py +0 -0
  81. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/deployment.py +0 -0
  82. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/file_manifest.py +0 -0
  83. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/guardrail.py +0 -0
  84. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/objective.py +0 -0
  85. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/pal.py +0 -0
  86. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/pronunciation.py +0 -0
  87. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/src/tavus_mcp/sdk/schemas/tool.py +0 -0
  88. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/conftest.py +0 -0
  89. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/integration/test_cli.py +0 -0
  90. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/integration/test_client.py +0 -0
  91. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/integration/test_mcp_server.py +0 -0
  92. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/integration/test_oauth.py +0 -0
  93. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_auth.py +0 -0
  94. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_builder.py +0 -0
  95. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_capabilities.py +0 -0
  96. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_daily_transport.py +0 -0
  97. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_deployments.py +0 -0
  98. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_env.py +0 -0
  99. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_guardrail_schema.py +0 -0
  100. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_objective_schema.py +0 -0
  101. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_pal_schema.py +0 -0
  102. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_patch.py +0 -0
  103. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_pronunciation_schema.py +0 -0
  104. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_release_versions.py +0 -0
  105. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_scaffold_embed.py +0 -0
  106. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_tool_reuse.py +0 -0
  107. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/tests/unit/test_tool_schema.py +0 -0
  108. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/.dev.vars.example +0 -0
  109. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/src/index.ts +0 -0
  110. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/src/oauth-grant.ts +0 -0
  111. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/src/oauth-session.ts +0 -0
  112. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/src/oauth.ts +0 -0
  113. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/test/builder-guidance.test.ts +0 -0
  114. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/test/oauth-session.test.ts +0 -0
  115. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/test/worker-runtime.ts +0 -0
  116. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/tsconfig.json +0 -0
  117. {tavus_cli-0.10.0 → tavus_cli-0.10.2}/workers/tavus-mcp/wrangler.jsonc +0 -0
@@ -100,3 +100,31 @@ jobs:
100
100
  with:
101
101
  slack-bot-token: ${{ secrets.CVI_BOT_SLACK_TOKEN }}
102
102
  github-token: ${{ secrets.GITHUB_TOKEN }}
103
+
104
+ notify-pr-environment:
105
+ name: Update PR Slack deployment reactions
106
+ needs: [deploy]
107
+ runs-on: ubuntu-latest
108
+ timeout-minutes: 10
109
+ continue-on-error: true
110
+ concurrency:
111
+ group: mango-${{ github.repository }}-${{ github.sha }}
112
+ queue: max
113
+ cancel-in-progress: false
114
+ permissions:
115
+ contents: read
116
+ pull-requests: read
117
+ deployments: read
118
+ steps:
119
+ - name: Update PR Slack messages
120
+ uses: Tavus-Engineering/pr-changelog-action/deploy@main
121
+ with:
122
+ slack-bot-token: ${{ secrets.CVI_BOT_SLACK_TOKEN }}
123
+ slack-channel-id: C0AGPSMKQ3Z
124
+ github-token: ${{ secrets.GITHUB_TOKEN }}
125
+ repo: ${{ github.repository }}
126
+ environment: ${{ github.event_name == 'workflow_dispatch' && inputs.environment == 'test' && 'dev' || 'stg' }}
127
+ deploy-sha: ${{ github.sha }}
128
+ run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
129
+ deployment-environment: ${{ github.event_name == 'workflow_dispatch' && inputs.environment || 'stg' }}
130
+ resolve-mode: range
@@ -2,7 +2,10 @@ name: PR Review Notifications
2
2
 
3
3
  on:
4
4
  pull_request:
5
- types: [opened, ready_for_review, closed]
5
+ types: [opened, ready_for_review]
6
+ # Closed PRs may still have conflicts; execute only this trusted action, never PR code.
7
+ pull_request_target:
8
+ types: [closed]
6
9
 
7
10
  permissions:
8
11
  pull-requests: write
@@ -380,3 +380,30 @@ jobs:
380
380
  with:
381
381
  slack-bot-token: ${{ secrets.CVI_BOT_SLACK_TOKEN }}
382
382
  github-token: ${{ secrets.GITHUB_TOKEN }}
383
+
384
+ notify-pr-prod:
385
+ name: Update PR Slack deployment reactions
386
+ needs: [preflight, production]
387
+ runs-on: ubuntu-latest
388
+ timeout-minutes: 10
389
+ continue-on-error: true
390
+ concurrency:
391
+ group: mango-${{ github.repository }}-${{ github.sha }}
392
+ queue: max
393
+ cancel-in-progress: false
394
+ permissions:
395
+ contents: read
396
+ pull-requests: read
397
+ deployments: read
398
+ steps:
399
+ - name: Update PR Slack messages
400
+ uses: Tavus-Engineering/pr-changelog-action/deploy@main
401
+ with:
402
+ slack-bot-token: ${{ secrets.CVI_BOT_SLACK_TOKEN }}
403
+ slack-channel-id: C0AGPSMKQ3Z
404
+ github-token: ${{ secrets.GITHUB_TOKEN }}
405
+ repo: ${{ github.repository }}
406
+ environment: prod
407
+ deploy-sha: ${{ needs.preflight.outputs.release_sha }}
408
+ run-url: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}
409
+ resolve-mode: range
@@ -0,0 +1,3 @@
1
+ {
2
+ ".": "0.10.2"
3
+ }
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.2](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.10.1...v0.10.2) (2026-10-16)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * resume PAL Builder history across MCP sessions ([#76](https://github.com/Tavus-Engineering/tavus-mcp/issues/76)) ([b8e0263](https://github.com/Tavus-Engineering/tavus-mcp/commit/b8e0263caecf4d4c33957bdbe9019234a668f1a9))
9
+
10
+ ## [0.10.1](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.10.0...v0.10.1) (2026-10-15)
11
+
12
+
13
+ ### Bug Fixes
14
+
15
+ * **ci:** keep PR Slack reactions aligned with deployments ([3f353af](https://github.com/Tavus-Engineering/tavus-mcp/commit/3f353af2b1816e0df41ca4126da92ff03b469d83))
16
+ * **ci:** retain every queued PR Slack notification ([a6cfa0c](https://github.com/Tavus-Engineering/tavus-mcp/commit/a6cfa0cbf68664c203507373ea59e915c26a777e))
17
+
3
18
  ## [0.10.0](https://github.com/Tavus-Engineering/tavus-mcp/compare/v0.9.3...v0.10.0) (2026-10-14)
4
19
 
5
20
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: tavus-cli
3
- Version: 0.10.0
3
+ Version: 0.10.2
4
4
  Summary: Tavus CLI and MCP server for agentic PAL creation and editing.
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: fastmcp>=2.0.0
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "tavus"
3
- version = "0.10.0" # x-release-please-version
3
+ version = "0.10.2" # x-release-please-version
4
4
  description = "Official alias for tavus-cli, the Tavus CLI and MCP server."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  dependencies = [
8
- "tavus-cli==0.10.0", # x-release-please-version
8
+ "tavus-cli==0.10.2", # x-release-please-version
9
9
  ]
10
10
 
11
11
  [project.urls]
@@ -1,11 +1,11 @@
1
1
  [project]
2
2
  name = "tavus-mcp"
3
- version = "0.10.0" # x-release-please-version
3
+ version = "0.10.2" # x-release-please-version
4
4
  description = "Official alias for tavus-cli, which provides the tavus-mcp MCP server."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
7
7
  dependencies = [
8
- "tavus-cli==0.10.0", # x-release-please-version
8
+ "tavus-cli==0.10.2", # x-release-please-version
9
9
  ]
10
10
 
11
11
  [project.urls]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "tavus-cli"
3
- version = "0.10.0"
3
+ version = "0.10.2"
4
4
  description = "Tavus CLI and MCP server for agentic PAL creation and editing."
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.11"
@@ -1,4 +1,4 @@
1
1
  """Tavus CLI and MCP server package."""
2
2
 
3
3
  __all__ = ["__version__"]
4
- __version__ = "0.10.0" # x-release-please-version
4
+ __version__ = "0.10.2" # x-release-please-version
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "instructions": [
3
- "Build a new PAL with tavus_pal_build_and_verify. It runs the PAL Maker pipeline that Charlie uses, then publishes and tests the PAL. Use tavus_pal_create or tavus_quickstart only when the creator hands over a finished system prompt and asks to skip the build.",
4
- "For an existing PAL, read tavus_pal_capabilities_list first and preserve unrelated settings and attachments. Configure built-ins with tavus_pal_capability_attach, tavus_pal_capability_patch, and tavus_pal_capability_detach.",
3
+ "Build new PALs with tavus_pal_build_and_verify, which runs Charlie’s PAL Maker pipeline, publishes, and tests. Use tavus_pal_create or tavus_quickstart only for a finished system prompt when the creator asks to skip the build.",
4
+ "For existing PALs, read tavus_pal_builder_history and tavus_pal_capabilities_list first; preserve prior decisions and unrelated settings. Use tavus_pal_capability_attach, tavus_pal_capability_patch, and tavus_pal_capability_detach for built-ins.",
5
5
  "Magic Canvas (magic_canvas) shows scorecards, running scores, charts, quizzes, forms, contact capture, text, and links during a call. A request to show a training scorecard means enabling Magic Canvas, not creating a tool such as record_training_scorecard. The PAL's own model drives the canvas; a saved tool or API response cannot draw on it. Model-generated quiz questions, scores, dice rolls, and random picks need no custom tool. Saving results to a backend is a separate step; recording data does not display it.",
6
6
  "When the creator asks for on-screen interaction, attach magic_canvas with the needed magic_canvas_components and magic_canvas_usage_guidance in the same call: text and/or chart for a scorecard, input for forms, question for quizzes. Put one or two lines of when-to-show choreography in magic_canvas_usage_guidance, not in the system prompt. On attach, omitted components are disabled. If the use case only suggests a canvas, offer it once; a decline stays declined. Without a backend, say collection works on screen and delivery can be connected later; do not create a placeholder delivery tool.",
7
7
  "Magic Canvas calendar collects date and time preferences and books nothing. Scheduling needs the creator's real HTTPS calendly.com booking link in scheduling_url, not a placeholder or scheduling_embed. Image and map output are not available.",
@@ -125,6 +125,7 @@ async def run_carrier_build(
125
125
  if not conversation_id:
126
126
  raise TavusError("RQH did not return a headless Charlie conversation_id.")
127
127
  runtime["conversation_id"] = conversation_id
128
+ runtime["builder_history_context"] = str((created or {}).get("builder_history_context") or "")
128
129
  conversation_url = str((created or {}).get("conversation_url") or "")
129
130
  if not conversation_url:
130
131
  details = await client.conversations.get(conversation_id)
@@ -763,6 +764,7 @@ async def build_carrier_context(
763
764
  return "\n\n".join(
764
765
  part
765
766
  for part in (
767
+ str(runtime.get("builder_history_context") or ""),
766
768
  "## Live builder resources\n\nThese are the creator's current libraries.",
767
769
  _format_faces(faces),
768
770
  _format_tools(tools),
@@ -80,6 +80,7 @@ _READ_ONLY_TOOL_NAMES = {
80
80
  "tavus_builder_list",
81
81
  "tavus_builder_get",
82
82
  "tavus_builder_chat_history",
83
+ "tavus_pal_builder_history",
83
84
  }
84
85
 
85
86
  _DESTRUCTIVE_TOOL_NAMES = {
@@ -1535,6 +1536,21 @@ async def tavus_builder_delete(builder_id: str) -> Any:
1535
1536
  return await client.builders.delete(builder_id)
1536
1537
 
1537
1538
 
1539
+ @mcp.tool()
1540
+ async def tavus_pal_builder_history(pal_id: str, limit: int = 40) -> Any:
1541
+ """Read the saved creator/Charlie conversation shown in PAL Maker's Text tab.
1542
+ Read this before resuming work on an existing PAL. Resolves its live or draft
1543
+ ID to the same builder session; a directly created PAL may have no history.
1544
+ This is build history, not conversations people have with the finished PAL.
1545
+ Save new build exchanges with tavus_builder_append_messages using the returned
1546
+ builder_id, unless tavus_pal_build_and_verify already saved those messages.
1547
+ """
1548
+ async with TavusClient.from_env(surface="mcp") as client:
1549
+ return await client.request(
1550
+ "GET", "/builder/history", params={"persona_id": pal_id, "limit": limit}
1551
+ )
1552
+
1553
+
1538
1554
  @mcp.tool()
1539
1555
  async def tavus_builder_chat_history(builder_id: str, limit: int = 50) -> Any:
1540
1556
  async with TavusClient.from_env(surface="mcp") as client:
@@ -1545,6 +1561,10 @@ async def tavus_builder_chat_history(builder_id: str, limit: int = 50) -> Any:
1545
1561
  async def tavus_builder_append_messages(
1546
1562
  builder_id: str, messages: list[dict[str, str]]
1547
1563
  ) -> Any:
1564
+ """Save actual new creator/assistant build dialogue to PAL Maker's Text tab.
1565
+ Do not resend history, invent dialogue, or include the finished PAL's replies.
1566
+ tavus_pal_build_and_verify already saves the exchanges it receives.
1567
+ """
1548
1568
  async with TavusClient.from_env(surface="mcp") as client:
1549
1569
  return await client.builders.append_messages(builder_id, messages)
1550
1570
 
@@ -418,6 +418,65 @@ async def test_build_uses_headless_carrier_and_pal_maker_model(
418
418
  assert smoke_create_body == {"persona_id": "p1", "chat": True}
419
419
 
420
420
 
421
+ @pytest.mark.asyncio
422
+ @respx.mock
423
+ async def test_resumed_carrier_keeps_saved_history_after_tool_context_update(
424
+ clean_env: Path,
425
+ monkeypatch: pytest.MonkeyPatch,
426
+ ) -> None:
427
+ """A context refresh must not erase decisions restored by RQH at call start."""
428
+ _write_env(clean_env)
429
+ routes = _register_build_routes()
430
+ prior = "<prior_build_conversation>CREATOR: No Memory.</prior_build_conversation>"
431
+ routes["headless_create"].mock(
432
+ return_value=Response(
433
+ 200,
434
+ json={
435
+ "conversation_id": "c_builder",
436
+ "conversation_url": "https://tavus.daily.co/c_builder",
437
+ "builder_history_context": prior,
438
+ },
439
+ )
440
+ )
441
+ session = FakeSession(
442
+ "c_builder",
443
+ turns=[
444
+ {
445
+ "text": "Updating the greeting.",
446
+ "tool_calls": [
447
+ {
448
+ "name": "draft_pal",
449
+ "tool_call_id": "call_greeting",
450
+ "arguments": json.dumps({"greeting_brief": "Ask about deliveries."}),
451
+ }
452
+ ],
453
+ },
454
+ {"text": "The greeting is updated.", "tool_calls": []},
455
+ ],
456
+ )
457
+
458
+ async def open_session(*_args: Any, **_kwargs: Any) -> FakeSession:
459
+ return session
460
+
461
+ monkeypatch.setattr(daily_transport, "open_conversation_session", open_session)
462
+ async with await _make_client() as client:
463
+ await carrier_builder.run_carrier_build(
464
+ client,
465
+ builder_id="b1",
466
+ pal_id="p1",
467
+ prompt="Change the greeting.",
468
+ max_rounds=1,
469
+ answers=None,
470
+ answer_provider=None,
471
+ on_builder_reply=None,
472
+ transcript=[],
473
+ )
474
+ assert session.contexts
475
+ assert all(context.count(prior) == 1 for context in session.contexts)
476
+ assert "<current_persona_state>" in session.contexts[-1]
477
+ assert session.closed
478
+
479
+
421
480
  def test_map_draft_briefs_merges_facts_into_personality() -> None:
422
481
  assert map_draft_briefs(
423
482
  {
@@ -1303,7 +1303,7 @@ wheels = [
1303
1303
 
1304
1304
  [[package]]
1305
1305
  name = "tavus-cli"
1306
- version = "0.10.0"
1306
+ version = "0.10.2"
1307
1307
  source = { editable = "." }
1308
1308
  dependencies = [
1309
1309
  { name = "fastmcp" },
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@tavus/tavus-mcp-worker",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@tavus/tavus-mcp-worker",
9
- "version": "0.10.0",
9
+ "version": "0.10.2",
10
10
  "dependencies": {
11
11
  "@modelcontextprotocol/sdk": "^1.29.0",
12
12
  "agents": "^0.12.2",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tavus/tavus-mcp-worker",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "private": true,
5
5
  "type": "module",
6
6
  "scripts": {
@@ -613,6 +613,29 @@ export function createTavusMcpServer(
613
613
  ),
614
614
  );
615
615
 
616
+ server.tool(
617
+ "tavus_pal_builder_history",
618
+ "Read the saved creator/Charlie conversation shown in PAL Maker's Text tab before resuming work on an existing PAL. Resolves a live or draft PAL ID to its builder session. A directly created PAL may have no builder history. This is build history, not conversations people have with the finished PAL. Save new build exchanges with tavus_builder_append_messages using the returned builder_id, unless tavus_pal_build_and_verify already saved them.",
619
+ { pal_id: z.string().min(1), limit: z.number().int().min(1).max(100).default(40) },
620
+ { title: "Read PAL build history", readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false },
621
+ async ({ pal_id, limit }) => toolResult(
622
+ await client.getPath("builder/history", { persona_id: pal_id, limit: String(limit) }),
623
+ ),
624
+ );
625
+
626
+ server.tool(
627
+ "tavus_builder_append_messages",
628
+ "Save new creator and assistant messages to the builder conversation shown in PAL Maker's Text tab. Use the builder_id returned by tavus_pal_builder_history or tavus_pal_build_and_verify. Save only the actual build conversation, not PAL test replies or invented dialogue; do not resend history or exchanges already saved by tavus_pal_build_and_verify.",
629
+ {
630
+ builder_id: z.string().min(1),
631
+ messages: z.array(z.object({ role: z.enum(["user", "assistant"]), content: z.string().min(1) })).min(1),
632
+ },
633
+ writeAnnotations("Save build conversation", { destructiveHint: false, openWorldHint: false }),
634
+ async ({ builder_id, messages }) => toolResult(
635
+ await client.post(`builder/${builder_id}/append-messages`, { messages }),
636
+ ),
637
+ );
638
+
616
639
  server.tool(
617
640
  "tavus_pal_create",
618
641
  "Create a PAL directly from supplied configuration and return its PAL Maker editor URL. This low-level operation does not draft or verify the PAL through the guided PAL Maker pipeline; for a new PAL, use tavus_pal_build_and_verify unless the creator hands over a finished system prompt and asks to skip the build. Full-pipeline PALs default to tavus-gemma-4 unless layers.llm.model is supplied. Tools are first-class records referenced by top-level tool_ids; inline layers.llm.tools configuration is unsupported.",
@@ -0,0 +1 @@
1
+ export const VERSION = "0.10.2"; // x-release-please-version
@@ -11,7 +11,6 @@ const LOCAL_ONLY_TOOLS = [
11
11
  "tavus_pal_knowledge_upload",
12
12
  // Low-level legacy Builder routes remain local-only. Both surfaces expose
13
13
  // tavus_pal_build_and_verify through the supported headless Charlie contract.
14
- "tavus_builder_append_messages",
15
14
  "tavus_builder_chat_history",
16
15
  "tavus_builder_create",
17
16
  "tavus_builder_delete",
@@ -72,6 +72,38 @@ function registeredTools(
72
72
  }
73
73
 
74
74
  describe("Cloudflare Tavus MCP helpers", () => {
75
+ it("reads RQH builder history across MCP sessions and saves creator turns there", async () => {
76
+ const history = [{ role: "assistant", content: "Would you like Memory?" }];
77
+ vi.stubGlobal("fetch", vi.fn(async (input: string | URL | Request, init?: RequestInit) => {
78
+ const url = new URL(String(input));
79
+ if (url.pathname === "/v2/builder/history") {
80
+ expect(url.searchParams.get("persona_id")).toBe("p_live");
81
+ return Response.json({ builder_id: "b1", persona_id: "p_draft", messages: history });
82
+ }
83
+ if (url.pathname === "/v2/builder/b1/append-messages" && init?.method === "POST") {
84
+ history.push(...JSON.parse(String(init.body)).messages);
85
+ return Response.json(history);
86
+ }
87
+ throw new Error(`Unexpected request ${url.pathname}`);
88
+ }));
89
+ try {
90
+ const first = registeredTools(createTavusMcpServer({ TAVUS_API_KEY: "secret" }));
91
+ const before = await first.tavus_pal_builder_history.handler({ pal_id: "p_live", limit: 40 });
92
+ expect(JSON.parse(before.content[0].text).messages).toEqual(history);
93
+ await first.tavus_builder_append_messages.handler({
94
+ builder_id: "b1", messages: [{ role: "user", content: "No, keep it stateless." }],
95
+ });
96
+ const reopened = registeredTools(createTavusMcpServer({ TAVUS_API_KEY: "secret" }));
97
+ const after = await reopened.tavus_pal_builder_history.handler({ pal_id: "p_live", limit: 40 });
98
+ expect(JSON.parse(after.content[0].text).messages).toEqual([
99
+ { role: "assistant", content: "Would you like Memory?" },
100
+ { role: "user", content: "No, keep it stateless." },
101
+ ]);
102
+ } finally {
103
+ vi.unstubAllGlobals();
104
+ }
105
+ });
106
+
75
107
  it("publishes annotations for every hosted tool", () => {
76
108
  const server = createTavusMcpServer({ TAVUS_API_KEY: "secret" });
77
109
  const tools = registeredTools(server);
@@ -1,3 +0,0 @@
1
- {
2
- ".": "0.10.0"
3
- }
@@ -1 +0,0 @@
1
- export const VERSION = "0.10.0"; // x-release-please-version
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes