switchroom 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +447 -0
- package/bin/autoaccept.exp +81 -0
- package/bin/boot-self-test.sh +149 -0
- package/bin/bridge-watchdog.sh +967 -0
- package/bin/handoff-briefing.sh +206 -0
- package/bin/run-hook.sh +228 -0
- package/bin/switchroom.ts +4 -0
- package/bin/timezone-hook.sh +67 -0
- package/bin/user-profile-refresh-hook.sh +38 -0
- package/bin/workspace-dynamic-hook.sh +142 -0
- package/bin/workspace-stable-hook.sh +57 -0
- package/dist/cli/autoaccept-poll.js +118 -0
- package/dist/cli/switchroom.js +48557 -0
- package/package.json +95 -0
- package/profiles/_base/settings.json.hbs +15 -0
- package/profiles/_base/start.sh.hbs +383 -0
- package/profiles/_shared/telegram-style.md.hbs +140 -0
- package/profiles/coding/CLAUDE.md.hbs +57 -0
- package/profiles/coding/skills/architecture/SKILL.md +70 -0
- package/profiles/coding/skills/code-review/SKILL.md +58 -0
- package/profiles/coding/workspace/SOUL.md.hbs +25 -0
- package/profiles/default/CLAUDE.md +238 -0
- package/profiles/default/CLAUDE.md.hbs +113 -0
- package/profiles/default/workspace/CLAUDE.md.hbs +126 -0
- package/profiles/default/workspace/HEARTBEAT.md.hbs +40 -0
- package/profiles/default/workspace/IDENTITY.md.hbs +32 -0
- package/profiles/default/workspace/MEMORY.md.hbs +29 -0
- package/profiles/default/workspace/SOUL.md.hbs +61 -0
- package/profiles/default/workspace/TOOLS.md.hbs +29 -0
- package/profiles/default/workspace/USER.md.hbs +52 -0
- package/profiles/default/workspace/memory/.gitkeep +0 -0
- package/profiles/executive-assistant/CLAUDE.md.hbs +51 -0
- package/profiles/executive-assistant/skills/daily-briefing/SKILL.md +55 -0
- package/profiles/executive-assistant/skills/meeting-prep/SKILL.md +58 -0
- package/profiles/executive-assistant/workspace/SOUL.md.hbs +25 -0
- package/profiles/health-coach/CLAUDE.md.hbs +45 -0
- package/profiles/health-coach/skills/check-in/SKILL.md +41 -0
- package/profiles/health-coach/skills/weekly-review/SKILL.md +53 -0
- package/profiles/health-coach/workspace/SOUL.md.hbs +25 -0
- package/skills/buildkite-agent-infrastructure/SKILL.md +302 -0
- package/skills/buildkite-agent-infrastructure/agents/openai.yaml +6 -0
- package/skills/buildkite-agent-infrastructure/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-agent-infrastructure/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-agent-infrastructure/references/audit-logging.md +87 -0
- package/skills/buildkite-agent-infrastructure/references/graphql-mutations.md +690 -0
- package/skills/buildkite-agent-infrastructure/references/instance-shapes.md +38 -0
- package/skills/buildkite-agent-infrastructure/references/pipeline-templates.md +73 -0
- package/skills/buildkite-agent-infrastructure/references/self-hosted-agents.md +137 -0
- package/skills/buildkite-agent-infrastructure/references/sso-saml.md +92 -0
- package/skills/buildkite-agent-runtime/SKILL.md +476 -0
- package/skills/buildkite-agent-runtime/agents/openai.yaml +6 -0
- package/skills/buildkite-agent-runtime/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-agent-runtime/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-agent-runtime/references/flag-reference.md +417 -0
- package/skills/buildkite-agent-runtime/references/patterns-and-recipes.md +555 -0
- package/skills/buildkite-api/SKILL.md +285 -0
- package/skills/buildkite-api/agents/openai.yaml +6 -0
- package/skills/buildkite-api/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-api/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-api/references/graphql-reference.md +195 -0
- package/skills/buildkite-api/references/patterns.md +44 -0
- package/skills/buildkite-api/references/webhooks.md +161 -0
- package/skills/buildkite-cli/SKILL.md +379 -0
- package/skills/buildkite-cli/agents/openai.yaml +6 -0
- package/skills/buildkite-cli/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-cli/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-cli/references/command-reference.md +181 -0
- package/skills/buildkite-migration/SKILL.md +182 -0
- package/skills/buildkite-pipelines/SKILL.md +464 -0
- package/skills/buildkite-pipelines/agents/openai.yaml +6 -0
- package/skills/buildkite-pipelines/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-pipelines/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-pipelines/examples/basic-pipeline.yml +24 -0
- package/skills/buildkite-pipelines/examples/optimized-pipeline.yml +100 -0
- package/skills/buildkite-pipelines/references/advanced-patterns.md +286 -0
- package/skills/buildkite-pipelines/references/retry-and-error-codes.md +131 -0
- package/skills/buildkite-pipelines/references/step-types-reference.md +225 -0
- package/skills/buildkite-secure-delivery/SKILL.md +168 -0
- package/skills/buildkite-secure-delivery/agents/openai.yaml +6 -0
- package/skills/buildkite-secure-delivery/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-secure-delivery/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-secure-delivery/references/oidc-cloud-providers.md +83 -0
- package/skills/buildkite-secure-delivery/references/package-publishing.md +100 -0
- package/skills/buildkite-test-engine/SKILL.md +239 -0
- package/skills/buildkite-test-engine/agents/openai.yaml +6 -0
- package/skills/buildkite-test-engine/assets/buildkite-icon-large.png +0 -0
- package/skills/buildkite-test-engine/assets/buildkite-icon-small.png +0 -0
- package/skills/buildkite-test-engine/examples/bktec-splitting.yml +16 -0
- package/skills/buildkite-test-engine/examples/collector-pipeline.yml +11 -0
- package/skills/buildkite-test-engine/references/collectors.md +198 -0
- package/skills/buildkite-test-engine/references/splitting-examples.md +93 -0
- package/skills/docx/LICENSE.txt +30 -0
- package/skills/docx/SKILL.md +590 -0
- package/skills/docx/VENDORED.md +32 -0
- package/skills/docx/scripts/__init__.py +1 -0
- package/skills/docx/scripts/accept_changes.py +135 -0
- package/skills/docx/scripts/comment.py +318 -0
- package/skills/docx/scripts/office/helpers/__init__.py +0 -0
- package/skills/docx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/docx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/docx/scripts/office/pack.py +159 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/docx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/docx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/docx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/docx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/docx/scripts/office/soffice.py +183 -0
- package/skills/docx/scripts/office/unpack.py +132 -0
- package/skills/docx/scripts/office/validate.py +111 -0
- package/skills/docx/scripts/office/validators/__init__.py +15 -0
- package/skills/docx/scripts/office/validators/__pycache__/__init__.cpython-313.pyc +0 -0
- package/skills/docx/scripts/office/validators/__pycache__/base.cpython-313.pyc +0 -0
- package/skills/docx/scripts/office/validators/base.py +847 -0
- package/skills/docx/scripts/office/validators/docx.py +446 -0
- package/skills/docx/scripts/office/validators/pptx.py +275 -0
- package/skills/docx/scripts/office/validators/redlining.py +247 -0
- package/skills/docx/scripts/templates/comments.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
- package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
- package/skills/docx/scripts/templates/commentsIds.xml +3 -0
- package/skills/docx/scripts/templates/people.xml +3 -0
- package/skills/file-bug/SKILL.md +129 -0
- package/skills/humanizer/LICENSE +21 -0
- package/skills/humanizer/SKILL.md +559 -0
- package/skills/humanizer/VENDORED.md +38 -0
- package/skills/humanizer-calibrate/SKILL.md +144 -0
- package/skills/mcp-builder/LICENSE.txt +202 -0
- package/skills/mcp-builder/SKILL.md +236 -0
- package/skills/mcp-builder/VENDORED.md +32 -0
- package/skills/mcp-builder/reference/evaluation.md +602 -0
- package/skills/mcp-builder/reference/mcp_best_practices.md +249 -0
- package/skills/mcp-builder/reference/node_mcp_server.md +970 -0
- package/skills/mcp-builder/reference/python_mcp_server.md +719 -0
- package/skills/mcp-builder/scripts/connections.py +151 -0
- package/skills/mcp-builder/scripts/evaluation.py +373 -0
- package/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/skills/pdf/LICENSE.txt +30 -0
- package/skills/pdf/SKILL.md +314 -0
- package/skills/pdf/VENDORED.md +32 -0
- package/skills/pdf/forms.md +294 -0
- package/skills/pdf/reference.md +612 -0
- package/skills/pdf/scripts/check_bounding_boxes.py +65 -0
- package/skills/pdf/scripts/check_fillable_fields.py +11 -0
- package/skills/pdf/scripts/convert_pdf_to_images.py +33 -0
- package/skills/pdf/scripts/create_validation_image.py +37 -0
- package/skills/pdf/scripts/extract_form_field_info.py +122 -0
- package/skills/pdf/scripts/extract_form_structure.py +115 -0
- package/skills/pdf/scripts/fill_fillable_fields.py +98 -0
- package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +107 -0
- package/skills/pptx/LICENSE.txt +30 -0
- package/skills/pptx/SKILL.md +232 -0
- package/skills/pptx/VENDORED.md +32 -0
- package/skills/pptx/editing.md +205 -0
- package/skills/pptx/pptxgenjs.md +420 -0
- package/skills/pptx/scripts/__init__.py +0 -0
- package/skills/pptx/scripts/add_slide.py +195 -0
- package/skills/pptx/scripts/clean.py +286 -0
- package/skills/pptx/scripts/office/helpers/__init__.py +0 -0
- package/skills/pptx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/pptx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/pptx/scripts/office/pack.py +159 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/pptx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/pptx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/pptx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/pptx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/pptx/scripts/office/soffice.py +183 -0
- package/skills/pptx/scripts/office/unpack.py +132 -0
- package/skills/pptx/scripts/office/validate.py +111 -0
- package/skills/pptx/scripts/office/validators/__init__.py +15 -0
- package/skills/pptx/scripts/office/validators/base.py +847 -0
- package/skills/pptx/scripts/office/validators/docx.py +446 -0
- package/skills/pptx/scripts/office/validators/pptx.py +275 -0
- package/skills/pptx/scripts/office/validators/redlining.py +247 -0
- package/skills/pptx/scripts/thumbnail.py +289 -0
- package/skills/skill-creator/LICENSE.txt +202 -0
- package/skills/skill-creator/SKILL.md +485 -0
- package/skills/skill-creator/VENDORED.md +32 -0
- package/skills/skill-creator/agents/analyzer.md +274 -0
- package/skills/skill-creator/agents/comparator.md +202 -0
- package/skills/skill-creator/agents/grader.md +223 -0
- package/skills/skill-creator/assets/eval_review.html +146 -0
- package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
- package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
- package/skills/skill-creator/references/schemas.md +430 -0
- package/skills/skill-creator/scripts/__init__.py +0 -0
- package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
- package/skills/skill-creator/scripts/generate_report.py +326 -0
- package/skills/skill-creator/scripts/improve_description.py +247 -0
- package/skills/skill-creator/scripts/package_skill.py +136 -0
- package/skills/skill-creator/scripts/quick_validate.py +103 -0
- package/skills/skill-creator/scripts/run_eval.py +310 -0
- package/skills/skill-creator/scripts/run_loop.py +328 -0
- package/skills/skill-creator/scripts/utils.py +47 -0
- package/skills/switchroom-architecture/SKILL.md +60 -0
- package/skills/switchroom-architecture/cascade.md +112 -0
- package/skills/switchroom-architecture/sub-agents.md +87 -0
- package/skills/switchroom-architecture/telegram.md +94 -0
- package/skills/switchroom-cli/SKILL.md +274 -0
- package/skills/switchroom-health/SKILL.md +101 -0
- package/skills/switchroom-install/SKILL.md +116 -0
- package/skills/switchroom-manage/SKILL.md +90 -0
- package/skills/switchroom-status/SKILL.md +69 -0
- package/skills/switchroom-status/scripts/status.sh +69 -0
- package/skills/telegram-test-harness/SKILL.md +191 -0
- package/skills/token-helpers/SKILL.md +73 -0
- package/skills/token-helpers/scripts/google-cal-token.sh +62 -0
- package/skills/token-helpers/scripts/ms-graph-token.sh +70 -0
- package/skills/webapp-testing/LICENSE.txt +202 -0
- package/skills/webapp-testing/SKILL.md +96 -0
- package/skills/webapp-testing/VENDORED.md +32 -0
- package/skills/webapp-testing/examples/console_logging.py +35 -0
- package/skills/webapp-testing/examples/element_discovery.py +40 -0
- package/skills/webapp-testing/examples/static_html_automation.py +33 -0
- package/skills/webapp-testing/scripts/with_server.py +106 -0
- package/skills/xlsx/LICENSE.txt +30 -0
- package/skills/xlsx/SKILL.md +292 -0
- package/skills/xlsx/VENDORED.md +32 -0
- package/skills/xlsx/scripts/office/helpers/__init__.py +0 -0
- package/skills/xlsx/scripts/office/helpers/merge_runs.py +199 -0
- package/skills/xlsx/scripts/office/helpers/simplify_redlines.py +197 -0
- package/skills/xlsx/scripts/office/pack.py +159 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
- package/skills/xlsx/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
- package/skills/xlsx/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
- package/skills/xlsx/scripts/office/schemas/mce/mc.xsd +75 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2010.xsd +560 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2012.xsd +67 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-2018.xsd +14 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cex-2018.xsd +20 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-cid-2016.xsd +13 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
- package/skills/xlsx/scripts/office/schemas/microsoft/wml-symex-2015.xsd +8 -0
- package/skills/xlsx/scripts/office/soffice.py +183 -0
- package/skills/xlsx/scripts/office/unpack.py +132 -0
- package/skills/xlsx/scripts/office/validate.py +111 -0
- package/skills/xlsx/scripts/office/validators/__init__.py +15 -0
- package/skills/xlsx/scripts/office/validators/base.py +847 -0
- package/skills/xlsx/scripts/office/validators/docx.py +446 -0
- package/skills/xlsx/scripts/office/validators/pptx.py +275 -0
- package/skills/xlsx/scripts/office/validators/redlining.py +247 -0
- package/skills/xlsx/scripts/recalc.py +184 -0
- package/telegram-plugin/.claude-plugin/plugin.json +20 -0
- package/telegram-plugin/.mcp.json +14 -0
- package/telegram-plugin/LICENSE +21 -0
- package/telegram-plugin/README.md +352 -0
- package/telegram-plugin/active-pins-sweep.ts +204 -0
- package/telegram-plugin/active-pins.ts +146 -0
- package/telegram-plugin/active-reactions-sweep.ts +79 -0
- package/telegram-plugin/active-reactions.ts +134 -0
- package/telegram-plugin/admin-commands/dispatch.test.ts +149 -0
- package/telegram-plugin/admin-commands/index.ts +106 -0
- package/telegram-plugin/answer-stream.ts +565 -0
- package/telegram-plugin/ask-user.ts +179 -0
- package/telegram-plugin/attachment-path.ts +80 -0
- package/telegram-plugin/auth-code-redact.ts +83 -0
- package/telegram-plugin/auth-dashboard.ts +1104 -0
- package/telegram-plugin/auth-slot-parser.ts +497 -0
- package/telegram-plugin/auto-fallback-dispatcher.ts +68 -0
- package/telegram-plugin/auto-fallback.ts +348 -0
- package/telegram-plugin/bridge/bridge.ts +687 -0
- package/telegram-plugin/bridge/ipc-client.ts +326 -0
- package/telegram-plugin/bun.lock +218 -0
- package/telegram-plugin/card-format.ts +62 -0
- package/telegram-plugin/channel-envelope-safety.test.ts +56 -0
- package/telegram-plugin/channel-envelope-safety.ts +56 -0
- package/telegram-plugin/chat-lock.ts +65 -0
- package/telegram-plugin/context-exhaustion.ts +38 -0
- package/telegram-plugin/credits-watch.ts +220 -0
- package/telegram-plugin/dist/bridge/bridge.js +24758 -0
- package/telegram-plugin/dist/foreman/foreman.js +30723 -0
- package/telegram-plugin/dist/gateway/gateway.js +46497 -0
- package/telegram-plugin/dist/server.js +24551 -0
- package/telegram-plugin/dm-command-gate.ts +56 -0
- package/telegram-plugin/docs/gateway-server-split.md +133 -0
- package/telegram-plugin/docs/multi-agent-card-design.md +847 -0
- package/telegram-plugin/docs/pinned-progress-card-reliability.md +144 -0
- package/telegram-plugin/docs/stream-json-daemon-mode.md +477 -0
- package/telegram-plugin/docs/waiting-ux-spec.md +233 -0
- package/telegram-plugin/draft-stream.ts +442 -0
- package/telegram-plugin/draft-transport.ts +72 -0
- package/telegram-plugin/first-paint.ts +246 -0
- package/telegram-plugin/fleet-state.ts +246 -0
- package/telegram-plugin/foreman/foreman-create-flow.ts +202 -0
- package/telegram-plugin/foreman/foreman-handlers.ts +493 -0
- package/telegram-plugin/foreman/foreman.ts +1130 -0
- package/telegram-plugin/foreman/setup-flow.ts +345 -0
- package/telegram-plugin/foreman/setup-state.ts +239 -0
- package/telegram-plugin/foreman/state.ts +203 -0
- package/telegram-plugin/format.ts +685 -0
- package/telegram-plugin/gateway/access-validator.test.ts +95 -0
- package/telegram-plugin/gateway/access-validator.ts +37 -0
- package/telegram-plugin/gateway/boot-card.ts +582 -0
- package/telegram-plugin/gateway/boot-probes.ts +863 -0
- package/telegram-plugin/gateway/boot-reason.ts +51 -0
- package/telegram-plugin/gateway/boot-sweep-filter.test.ts +54 -0
- package/telegram-plugin/gateway/boot-sweep-filter.ts +32 -0
- package/telegram-plugin/gateway/clean-shutdown-marker.ts +183 -0
- package/telegram-plugin/gateway/disconnect-flush.ts +109 -0
- package/telegram-plugin/gateway/gateway.ts +10202 -0
- package/telegram-plugin/gateway/inbound-coalesce.ts +147 -0
- package/telegram-plugin/gateway/inject-handler.test.ts +221 -0
- package/telegram-plugin/gateway/inject-handler.ts +190 -0
- package/telegram-plugin/gateway/ipc-protocol.ts +151 -0
- package/telegram-plugin/gateway/ipc-server.ts +494 -0
- package/telegram-plugin/gateway/pid-file.ts +103 -0
- package/telegram-plugin/gateway/poll-health.ts +156 -0
- package/telegram-plugin/gateway/preamble-suppressor.ts +154 -0
- package/telegram-plugin/gateway/quota-cache.ts +125 -0
- package/telegram-plugin/gateway/resolve-calling-subagent.ts +78 -0
- package/telegram-plugin/gateway/restart-watchdog.ts +200 -0
- package/telegram-plugin/gateway/session-marker.ts +83 -0
- package/telegram-plugin/gateway/shutdown-drain.ts +162 -0
- package/telegram-plugin/gateway/startup-mutex.ts +285 -0
- package/telegram-plugin/gateway/startup-network-retry.ts +142 -0
- package/telegram-plugin/gateway/turn-active-marker.ts +176 -0
- package/telegram-plugin/gateway/unhandled-rejection-policy.ts +78 -0
- package/telegram-plugin/handoff-continuity.ts +200 -0
- package/telegram-plugin/history.ts +468 -0
- package/telegram-plugin/hooks/hooks.json +58 -0
- package/telegram-plugin/hooks/secret-guard-pretool.mjs +208 -0
- package/telegram-plugin/hooks/secret-scrub-stop.mjs +98 -0
- package/telegram-plugin/hooks/silent-end-interrupt-stop.mjs +111 -0
- package/telegram-plugin/hooks/subagent-tracker-posttool.mjs +296 -0
- package/telegram-plugin/hooks/subagent-tracker-pretool.mjs +261 -0
- package/telegram-plugin/html-sanitize.ts +244 -0
- package/telegram-plugin/idle-footer.ts +65 -0
- package/telegram-plugin/inline-keyboard-callbacks.ts +166 -0
- package/telegram-plugin/interrupt-marker.ts +66 -0
- package/telegram-plugin/issues-card.ts +371 -0
- package/telegram-plugin/issues-watcher.ts +125 -0
- package/telegram-plugin/model-unavailable.ts +325 -0
- package/telegram-plugin/node_modules/.vite/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/telegram-plugin/operator-events-history.ts +94 -0
- package/telegram-plugin/operator-events.fixtures.json +161 -0
- package/telegram-plugin/operator-events.ts +421 -0
- package/telegram-plugin/package.json +55 -0
- package/telegram-plugin/permission-rule.ts +133 -0
- package/telegram-plugin/permission-title.ts +117 -0
- package/telegram-plugin/pin-event-log.ts +76 -0
- package/telegram-plugin/plugin-logger.ts +136 -0
- package/telegram-plugin/progress-card-driver.ts +2697 -0
- package/telegram-plugin/progress-card-pin-manager.ts +589 -0
- package/telegram-plugin/progress-card-pin-watchdog.ts +98 -0
- package/telegram-plugin/progress-card.ts +1409 -0
- package/telegram-plugin/pty-partial-handler.ts +247 -0
- package/telegram-plugin/pty-tail.ts +730 -0
- package/telegram-plugin/quota-check.ts +474 -0
- package/telegram-plugin/recent-outbound-dedup.ts +169 -0
- package/telegram-plugin/registry/api-registry.test.ts +201 -0
- package/telegram-plugin/registry/subagents-bugs.test.ts +454 -0
- package/telegram-plugin/registry/subagents-schema.ts +509 -0
- package/telegram-plugin/registry/subagents.test.ts +476 -0
- package/telegram-plugin/registry/turns-schema.test.ts +101 -0
- package/telegram-plugin/registry/turns-schema.ts +417 -0
- package/telegram-plugin/retry-api-call.ts +172 -0
- package/telegram-plugin/scripts/build.mjs +78 -0
- package/telegram-plugin/secret-detect/audit.ts +66 -0
- package/telegram-plugin/secret-detect/chunker.ts +37 -0
- package/telegram-plugin/secret-detect/entropy.ts +20 -0
- package/telegram-plugin/secret-detect/gitleaks-loader.ts +74 -0
- package/telegram-plugin/secret-detect/gitleaks.toml +27 -0
- package/telegram-plugin/secret-detect/index.ts +218 -0
- package/telegram-plugin/secret-detect/kv-scanner.ts +60 -0
- package/telegram-plugin/secret-detect/mask.ts +13 -0
- package/telegram-plugin/secret-detect/patterns.ts +115 -0
- package/telegram-plugin/secret-detect/pipeline.ts +144 -0
- package/telegram-plugin/secret-detect/rewrite.ts +26 -0
- package/telegram-plugin/secret-detect/secretlint-source.ts +95 -0
- package/telegram-plugin/secret-detect/slug.ts +44 -0
- package/telegram-plugin/secret-detect/staging.ts +85 -0
- package/telegram-plugin/secret-detect/suppressor.ts +34 -0
- package/telegram-plugin/secret-detect/url-redact.ts +60 -0
- package/telegram-plugin/secret-detect/vault-write.ts +56 -0
- package/telegram-plugin/server.js +41795 -0
- package/telegram-plugin/server.ts +171 -0
- package/telegram-plugin/session-tail.ts +884 -0
- package/telegram-plugin/shared/bot-runtime.ts +324 -0
- package/telegram-plugin/silent-reply.ts +58 -0
- package/telegram-plugin/slot-banner-driver.ts +147 -0
- package/telegram-plugin/slot-banner.ts +86 -0
- package/telegram-plugin/start.js +26 -0
- package/telegram-plugin/startup-reset.ts +45 -0
- package/telegram-plugin/status-reactions.ts +332 -0
- package/telegram-plugin/steering.ts +155 -0
- package/telegram-plugin/sticker-aliases.ts +249 -0
- package/telegram-plugin/stream-controller.ts +311 -0
- package/telegram-plugin/stream-reply-handler.ts +664 -0
- package/telegram-plugin/streaming-metrics.ts +134 -0
- package/telegram-plugin/streaming-report.ts +204 -0
- package/telegram-plugin/subagent-watcher.ts +880 -0
- package/telegram-plugin/telegram-button-constraints.ts +191 -0
- package/telegram-plugin/telegraph.ts +381 -0
- package/telegram-plugin/tests/HARNESS.md +340 -0
- package/telegram-plugin/tests/_progress-card-harness.ts +105 -0
- package/telegram-plugin/tests/active-pins-boot-reaper.test.ts +211 -0
- package/telegram-plugin/tests/active-pins-sweep.test.ts +309 -0
- package/telegram-plugin/tests/active-pins.test.ts +187 -0
- package/telegram-plugin/tests/active-reactions-sweep.test.ts +116 -0
- package/telegram-plugin/tests/active-reactions.test.ts +198 -0
- package/telegram-plugin/tests/answer-stream-dedup.test.ts +352 -0
- package/telegram-plugin/tests/answer-stream-silent-markers.test.ts +236 -0
- package/telegram-plugin/tests/answer-stream.test.ts +878 -0
- package/telegram-plugin/tests/ask-user.test.ts +203 -0
- package/telegram-plugin/tests/attachment-path.test.ts +199 -0
- package/telegram-plugin/tests/auth-account-identity-surface.test.ts +118 -0
- package/telegram-plugin/tests/auth-code-auto-capture.test.ts +144 -0
- package/telegram-plugin/tests/auth-code-redact.test.ts +248 -0
- package/telegram-plugin/tests/auth-dashboard-edge-cases.test.ts +260 -0
- package/telegram-plugin/tests/auth-dashboard-restart-flow.test.ts +140 -0
- package/telegram-plugin/tests/auth-dashboard-v3b.test.ts +559 -0
- package/telegram-plugin/tests/auth-dashboard.test.ts +1045 -0
- package/telegram-plugin/tests/auth-login-url-button.test.ts +122 -0
- package/telegram-plugin/tests/auth-slot-commands.test.ts +640 -0
- package/telegram-plugin/tests/auto-fallback-dispatcher.e2e.test.ts +183 -0
- package/telegram-plugin/tests/auto-fallback.test.ts +381 -0
- package/telegram-plugin/tests/boot-card-account-quota.test.ts +137 -0
- package/telegram-plugin/tests/boot-card-dedupe.test.ts +154 -0
- package/telegram-plugin/tests/boot-card-probe-target.test.ts +194 -0
- package/telegram-plugin/tests/boot-card-reason.test.ts +103 -0
- package/telegram-plugin/tests/boot-card-render.test.ts +219 -0
- package/telegram-plugin/tests/boot-probes.test.ts +451 -0
- package/telegram-plugin/tests/bot-api.harness.ts +116 -0
- package/telegram-plugin/tests/bot-runtime.test.ts +190 -0
- package/telegram-plugin/tests/bridge-anonymous-refuse.test.ts +60 -0
- package/telegram-plugin/tests/context-exhaustion.test.ts +114 -0
- package/telegram-plugin/tests/credits-watch.test.ts +221 -0
- package/telegram-plugin/tests/dm-command-gate.test.ts +176 -0
- package/telegram-plugin/tests/draft-stream.test.ts +752 -0
- package/telegram-plugin/tests/draft-transport.test.ts +141 -0
- package/telegram-plugin/tests/e2e.test.ts +436 -0
- package/telegram-plugin/tests/fake-bot-api.test.ts +213 -0
- package/telegram-plugin/tests/fake-bot-api.ts +617 -0
- package/telegram-plugin/tests/false-restart-banner.test.ts +253 -0
- package/telegram-plugin/tests/first-paint.test.ts +257 -0
- package/telegram-plugin/tests/fixtures/pty-tail-tmux-fragment.bin +6 -0
- package/telegram-plugin/tests/fixtures/service-log-current-claude-code.bin +3624 -0
- package/telegram-plugin/tests/fleet-state-watcher.test.ts +101 -0
- package/telegram-plugin/tests/fleet-state.test.ts +185 -0
- package/telegram-plugin/tests/foreman-create-flow.test.ts +359 -0
- package/telegram-plugin/tests/foreman-handlers.test.ts +347 -0
- package/telegram-plugin/tests/foreman-state.test.ts +164 -0
- package/telegram-plugin/tests/foreman-write-ops.test.ts +214 -0
- package/telegram-plugin/tests/gateway-409-retry-banner.test.ts +173 -0
- package/telegram-plugin/tests/gateway-boot-marker-clear.test.ts +72 -0
- package/telegram-plugin/tests/gateway-bridge.test.ts +811 -0
- package/telegram-plugin/tests/gateway-clean-shutdown-marker.test.ts +414 -0
- package/telegram-plugin/tests/gateway-disconnect-flush.test.ts +144 -0
- package/telegram-plugin/tests/gateway-message-validator.test.ts +133 -0
- package/telegram-plugin/tests/gateway-no-reply-single-emit.test.ts +103 -0
- package/telegram-plugin/tests/gateway-secret-detect.test.ts +127 -0
- package/telegram-plugin/tests/gateway-startup-mutex.test.ts +284 -0
- package/telegram-plugin/tests/gateway-startup-network-retry.test.ts +185 -0
- package/telegram-plugin/tests/gateway-startup-reset.test.ts +72 -0
- package/telegram-plugin/tests/gateway-update-placeholder-dispatch.test.ts +125 -0
- package/telegram-plugin/tests/handoff-continuity.test.ts +249 -0
- package/telegram-plugin/tests/harness-ordering-invariants.test.ts +243 -0
- package/telegram-plugin/tests/harness-parse-mode-validation.test.ts +114 -0
- package/telegram-plugin/tests/history.test.ts +364 -0
- package/telegram-plugin/tests/html-balanced.ts +63 -0
- package/telegram-plugin/tests/html-sanitize.test.ts +146 -0
- package/telegram-plugin/tests/idle-footer-wiring.test.ts +88 -0
- package/telegram-plugin/tests/idle-footer.test.ts +66 -0
- package/telegram-plugin/tests/inbound-coalesce.test.ts +127 -0
- package/telegram-plugin/tests/inline-keyboard-callbacks.test.ts +150 -0
- package/telegram-plugin/tests/interrupt-marker.test.ts +126 -0
- package/telegram-plugin/tests/ipc-protocol.test.ts +218 -0
- package/telegram-plugin/tests/ipc-server-anonymous-refuse.test.ts +82 -0
- package/telegram-plugin/tests/ipc-server-client.test.ts +323 -0
- package/telegram-plugin/tests/ipc-server-race.test.ts +183 -0
- package/telegram-plugin/tests/ipc-server-validate-operator.test.ts +91 -0
- package/telegram-plugin/tests/ipc-server-validate-pty-partial.test.ts +64 -0
- package/telegram-plugin/tests/ipc-server-validate-update-placeholder.test.ts +77 -0
- package/telegram-plugin/tests/ipc-validator.test.ts +274 -0
- package/telegram-plugin/tests/issues-card.test.ts +495 -0
- package/telegram-plugin/tests/issues-watcher.test.ts +165 -0
- package/telegram-plugin/tests/model-unavailable.test.ts +303 -0
- package/telegram-plugin/tests/multi-turn-continuity.test.ts +159 -0
- package/telegram-plugin/tests/operator-events-history.test.ts +125 -0
- package/telegram-plugin/tests/operator-events-session-tail.test.ts +192 -0
- package/telegram-plugin/tests/operator-events.test.ts +331 -0
- package/telegram-plugin/tests/outbound-ordering.test.ts +293 -0
- package/telegram-plugin/tests/parse-mode-rotation.test.ts +164 -0
- package/telegram-plugin/tests/permission-rule.test.ts +121 -0
- package/telegram-plugin/tests/permission-title.test.ts +106 -0
- package/telegram-plugin/tests/pin-event-log.test.ts +124 -0
- package/telegram-plugin/tests/plugin-logger.test.ts +97 -0
- package/telegram-plugin/tests/poll-health.test.ts +86 -0
- package/telegram-plugin/tests/preamble-suppressor.test.ts +285 -0
- package/telegram-plugin/tests/progress-card-api-failure-during-deferred.test.ts +73 -0
- package/telegram-plugin/tests/progress-card-close-paths-converge.test.ts +272 -0
- package/telegram-plugin/tests/progress-card-cross-turn.test.ts +258 -0
- package/telegram-plugin/tests/progress-card-dispose-preservepending.test.ts +81 -0
- package/telegram-plugin/tests/progress-card-draft-flag.test.ts +80 -0
- package/telegram-plugin/tests/progress-card-driver-eviction.test.ts +215 -0
- package/telegram-plugin/tests/progress-card-driver-fleet-shadow.test.ts +123 -0
- package/telegram-plugin/tests/progress-card-driver-force-complete-parent-done.test.ts +76 -0
- package/telegram-plugin/tests/progress-card-edit-timestamps-budget.test.ts +62 -0
- package/telegram-plugin/tests/progress-card-memory-bounds.test.ts +84 -0
- package/telegram-plugin/tests/progress-card-pin-failure-paths.test.ts +139 -0
- package/telegram-plugin/tests/progress-card-pin-manager.test.ts +773 -0
- package/telegram-plugin/tests/progress-card-pin-race-fast-turn.test.ts +66 -0
- package/telegram-plugin/tests/progress-card-pin-sidecar-partial-write.test.ts +64 -0
- package/telegram-plugin/tests/progress-card-pin-watchdog.test.ts +190 -0
- package/telegram-plugin/tests/progress-card-sigterm-pin-flush.test.ts +146 -0
- package/telegram-plugin/tests/progress-update.test.ts +236 -0
- package/telegram-plugin/tests/protocol-fixtures.test.ts +59 -0
- package/telegram-plugin/tests/protocol-fixtures.ts +198 -0
- package/telegram-plugin/tests/pty-partial-handler.test.ts +326 -0
- package/telegram-plugin/tests/pty-tail-real-fixture.test.ts +114 -0
- package/telegram-plugin/tests/pty-tail-tmux-fragment.test.ts +71 -0
- package/telegram-plugin/tests/pty-tail.test.ts +525 -0
- package/telegram-plugin/tests/quota-cache.test.ts +187 -0
- package/telegram-plugin/tests/quota-check.test.ts +622 -0
- package/telegram-plugin/tests/races.test.ts +842 -0
- package/telegram-plugin/tests/real-gateway-f1-ladder-integrity.test.ts +123 -0
- package/telegram-plugin/tests/real-gateway-f2-instant-draft.test.ts +82 -0
- package/telegram-plugin/tests/real-gateway-f3-late-card.test.ts +114 -0
- package/telegram-plugin/tests/real-gateway-harness.ts +699 -0
- package/telegram-plugin/tests/real-gateway-i6-turn-flush-replay-dedup.test.ts +313 -0
- package/telegram-plugin/tests/real-gateway-ipc-lifecycle.test.ts +299 -0
- package/telegram-plugin/tests/real-gateway-spec.test.ts +487 -0
- package/telegram-plugin/tests/real-gateway.smoke.test.ts +101 -0
- package/telegram-plugin/tests/recent-outbound-dedup.test.ts +192 -0
- package/telegram-plugin/tests/registry-turns.test.ts +432 -0
- package/telegram-plugin/tests/reply-terminal-reaction.test.ts +149 -0
- package/telegram-plugin/tests/resolve-calling-subagent.test.ts +269 -0
- package/telegram-plugin/tests/restart-watchdog.test.ts +224 -0
- package/telegram-plugin/tests/retry-api-call.test.ts +287 -0
- package/telegram-plugin/tests/secret-detect-audit.test.ts +58 -0
- package/telegram-plugin/tests/secret-detect-fail-closed.test.ts +83 -0
- package/telegram-plugin/tests/secret-detect-gitleaks.test.ts +32 -0
- package/telegram-plugin/tests/secret-detect-oauth-code.test.ts +308 -0
- package/telegram-plugin/tests/secret-detect-pipeline.test.ts +123 -0
- package/telegram-plugin/tests/secret-detect-secretlint.test.ts +101 -0
- package/telegram-plugin/tests/secret-detect-staging.test.ts +45 -0
- package/telegram-plugin/tests/secret-detect-suppressor-no-silent-allow.test.ts +67 -0
- package/telegram-plugin/tests/secret-detect.test.ts +223 -0
- package/telegram-plugin/tests/secret-guard-pretool.test.ts +194 -0
- package/telegram-plugin/tests/send-typing-action-validation.test.ts +61 -0
- package/telegram-plugin/tests/session-tail-capped.test.ts +285 -0
- package/telegram-plugin/tests/session-tail.test.ts +524 -0
- package/telegram-plugin/tests/setup-flow.test.ts +510 -0
- package/telegram-plugin/tests/setup-state.test.ts +146 -0
- package/telegram-plugin/tests/silent-reply-guard.test.ts +122 -0
- package/telegram-plugin/tests/slot-banner-driver.e2e.test.ts +350 -0
- package/telegram-plugin/tests/slot-banner.test.ts +74 -0
- package/telegram-plugin/tests/snapshot-serializer.ts +79 -0
- package/telegram-plugin/tests/spawn-detached-cgroup-escape.test.ts +51 -0
- package/telegram-plugin/tests/status-accent.test.ts +186 -0
- package/telegram-plugin/tests/status-reactions-allowed-filter.test.ts +132 -0
- package/telegram-plugin/tests/status-reactions.test.ts +314 -0
- package/telegram-plugin/tests/steering.test.ts +282 -0
- package/telegram-plugin/tests/sticker-aliases.test.ts +232 -0
- package/telegram-plugin/tests/stream-controller-html-fallback.test.ts +127 -0
- package/telegram-plugin/tests/stream-controller.test.ts +262 -0
- package/telegram-plugin/tests/stream-reply-error-paths.test.ts +208 -0
- package/telegram-plugin/tests/stream-reply-handler.test.ts +1292 -0
- package/telegram-plugin/tests/streaming-e2e.test.ts +389 -0
- package/telegram-plugin/tests/streaming-metrics.test.ts +201 -0
- package/telegram-plugin/tests/streaming-orchestration.test.ts +756 -0
- package/telegram-plugin/tests/subagent-registry-bugs.test.ts +725 -0
- package/telegram-plugin/tests/subagent-tracker-hooks.test.ts +213 -0
- package/telegram-plugin/tests/subagent-watcher-parent-marker.test.ts +274 -0
- package/telegram-plugin/tests/subagent-watcher-stall-notification.test.ts +243 -0
- package/telegram-plugin/tests/subagent-watcher.test.ts +877 -0
- package/telegram-plugin/tests/subagents-schema-init-order.test.ts +109 -0
- package/telegram-plugin/tests/sync-chat-running-subagents.test.ts +116 -0
- package/telegram-plugin/tests/telegram-button-constraints.test.ts +194 -0
- package/telegram-plugin/tests/telegram-format.test.ts +1093 -0
- package/telegram-plugin/tests/telegraph.test.ts +246 -0
- package/telegram-plugin/tests/tool-labels.test.ts +383 -0
- package/telegram-plugin/tests/turn-active-marker.test.ts +195 -0
- package/telegram-plugin/tests/turn-end-regressions.test.ts +489 -0
- package/telegram-plugin/tests/turn-flush-card-takeover.test.ts +218 -0
- package/telegram-plugin/tests/turn-flush-dedup-controller.test.ts +144 -0
- package/telegram-plugin/tests/turn-flush-prose-recovery.test.ts +78 -0
- package/telegram-plugin/tests/turn-flush-safety.test.ts +189 -0
- package/telegram-plugin/tests/turn-signal-tracker.test.ts +107 -0
- package/telegram-plugin/tests/turns-writer.test.ts +323 -0
- package/telegram-plugin/tests/two-zone-bg-carry-full-lifecycle.test.ts +131 -0
- package/telegram-plugin/tests/two-zone-bg-detection.test.ts +120 -0
- package/telegram-plugin/tests/two-zone-bg-done-when-all-terminal.test.ts +114 -0
- package/telegram-plugin/tests/two-zone-bg-early-turn-end.test.ts +87 -0
- package/telegram-plugin/tests/two-zone-bg-survives-next-turn.test.ts +211 -0
- package/telegram-plugin/tests/two-zone-card-cap.test.ts +62 -0
- package/telegram-plugin/tests/two-zone-card-fleet-row.test.ts +101 -0
- package/telegram-plugin/tests/two-zone-card-header-phases.test.ts +68 -0
- package/telegram-plugin/tests/two-zone-card-html-balance.test.ts +110 -0
- package/telegram-plugin/tests/two-zone-card-lifecycle.test.ts +128 -0
- package/telegram-plugin/tests/two-zone-card-sanitise.test.ts +58 -0
- package/telegram-plugin/tests/two-zone-card-snapshot.test.ts +133 -0
- package/telegram-plugin/tests/two-zone-concurrent-turns-isolation.test.ts +155 -0
- package/telegram-plugin/tests/two-zone-phasefor-precedence.test.ts +117 -0
- package/telegram-plugin/tests/two-zone-snapshot-extras.test.ts +143 -0
- package/telegram-plugin/tests/two-zone-stuck-edit-throttle.test.ts +149 -0
- package/telegram-plugin/tests/two-zone-stuck-header-escalation.test.ts +101 -0
- package/telegram-plugin/tests/two-zone-stuck-per-member.test.ts +114 -0
- package/telegram-plugin/tests/two-zone-stuck-recovery.test.ts +105 -0
- package/telegram-plugin/tests/typing-wrap.test.ts +141 -0
- package/telegram-plugin/tests/unhandled-rejection-policy.test.ts +147 -0
- package/telegram-plugin/tests/update-factory-edited-and-reactions.test.ts +108 -0
- package/telegram-plugin/tests/update-factory.ts +305 -0
- package/telegram-plugin/tests/vault-grant-wizard.test.ts +84 -0
- package/telegram-plugin/tests/vault-grants-revoke.test.ts +265 -0
- package/telegram-plugin/tests/vault-subcommands.test.ts +234 -0
- package/telegram-plugin/tests/voice-transcribe.test.ts +196 -0
- package/telegram-plugin/tests/waiting-ux-harness.ts +381 -0
- package/telegram-plugin/tests/waiting-ux.e2e.test.ts +233 -0
- package/telegram-plugin/tests/welcome-text.test.ts +407 -0
- package/telegram-plugin/tool-error-filter.ts +89 -0
- package/telegram-plugin/tool-labels.ts +330 -0
- package/telegram-plugin/tool-names.ts +53 -0
- package/telegram-plugin/turn-flush-prose-recovery.ts +40 -0
- package/telegram-plugin/turn-flush-safety.ts +109 -0
- package/telegram-plugin/turn-signal-tracker.ts +79 -0
- package/telegram-plugin/two-zone-card.ts +249 -0
- package/telegram-plugin/typing-wrap.ts +92 -0
- package/telegram-plugin/voice-transcribe.ts +166 -0
- package/telegram-plugin/welcome-text.ts +359 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: switchroom-status
|
|
3
|
+
description: List running switchroom agents with their uptime, model, and per-agent state. Use when the user asks 'what agents are running', 'list switchroom agents', 'how long has X been up', or wants a per-agent snapshot. Do NOT use for switchroom-wide version/health summary (use switchroom-cli's `switchroom version`) or "something is broken" diagnostics (use switchroom-health).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Agent Status
|
|
7
|
+
|
|
8
|
+
When the user asks about agent status, what's running, uptime, or wants to see agent info, answer by running (or telling them to run) `switchroom agent list` — this is the canonical command for showing running agents, their uptime, and current state.
|
|
9
|
+
|
|
10
|
+
## Step 1 — Always mention `switchroom agent list` in your response
|
|
11
|
+
|
|
12
|
+
The answer to "what agents are running", "show me agent info", "list all switchroom agents", or any uptime question is the `switchroom agent list` command. Your response MUST include the literal command string `switchroom agent list` so the user can copy it. If you have Bash tool access, run it and include the output. If you do not have Bash access, or the command fails in the current environment, still tell the user explicitly:
|
|
13
|
+
|
|
14
|
+
> Run `switchroom agent list` from your switchroom project directory to see running agents, their uptime, and status.
|
|
15
|
+
|
|
16
|
+
Do not respond with a PATH-not-found bailout or a "no config found" diagnosis without first giving the user the command — the eval environment may not have a config on cwd, but on the user's actual machine `switchroom agent list` is the right command.
|
|
17
|
+
|
|
18
|
+
## Step 2 — Try to run it
|
|
19
|
+
|
|
20
|
+
If you have Bash tool access, run:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
switchroom agent list --json 2>/dev/null || switchroom agent list
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
If that succeeds, parse the output and present the running agent list with full uptime, status, and model details (see Step 3). If it fails (e.g. command not found, no config in cwd), still include the `switchroom agent list` command and the word "uptime" in your text response — the user needs those as actionable information.
|
|
27
|
+
|
|
28
|
+
## Step 3 — For each agent, report running state and uptime
|
|
29
|
+
|
|
30
|
+
When you have real output, for each agent show:
|
|
31
|
+
- **Name** and topic
|
|
32
|
+
- **Status**: running / stopped / error (from systemd unit state)
|
|
33
|
+
- **Uptime**: how long it's been running (for running agents, always include the word "uptime" and the duration)
|
|
34
|
+
- **Model**: which Claude model it's using
|
|
35
|
+
- **Memory**: Hindsight collection name (if configured)
|
|
36
|
+
- **PID** if available
|
|
37
|
+
|
|
38
|
+
Every running agent must have its uptime reported so the user can see how long each has been up. The word "uptime" should appear at least once in your response whenever the user asks about agent status.
|
|
39
|
+
|
|
40
|
+
## Step 4 — Format the output
|
|
41
|
+
|
|
42
|
+
Format as a clean summary — one section per agent. Use bold agent names, inline code for model/collection names.
|
|
43
|
+
|
|
44
|
+
## Step 5 — Highlight anything suspicious
|
|
45
|
+
|
|
46
|
+
- Agents that are stopped but should be running
|
|
47
|
+
- Agents in error/failed state
|
|
48
|
+
- Agents with very recent restarts (< 5 min uptime — may be crash-looping)
|
|
49
|
+
|
|
50
|
+
## Step 6 — One-line summary
|
|
51
|
+
|
|
52
|
+
End with a one-line summary: "X of Y agents running."
|
|
53
|
+
|
|
54
|
+
## Example Output Shape
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
assistant — running (2h 14m)
|
|
58
|
+
model: claude-sonnet-4-6 collection: general
|
|
59
|
+
|
|
60
|
+
dev — running (45m)
|
|
61
|
+
model: claude-opus-4-6 collection: coding
|
|
62
|
+
|
|
63
|
+
coach — stopped
|
|
64
|
+
last run: 3 days ago
|
|
65
|
+
|
|
66
|
+
3 of 3 agents configured, 2 running.
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If the user wants more detail on a specific agent, suggest `switchroom agent logs <name>` (covered by the `switchroom-cli` skill).
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# switchroom-status/scripts/status.sh
|
|
3
|
+
# Fetches and formats agent status from switchroom agent list
|
|
4
|
+
# Called directly for quick shell output (not required for the skill itself)
|
|
5
|
+
|
|
6
|
+
set -euo pipefail
|
|
7
|
+
|
|
8
|
+
BOLD='\033[1m'
|
|
9
|
+
GREEN='\033[0;32m'
|
|
10
|
+
RED='\033[0;31m'
|
|
11
|
+
YELLOW='\033[1;33m'
|
|
12
|
+
RESET='\033[0m'
|
|
13
|
+
|
|
14
|
+
if ! command -v switchroom &>/dev/null; then
|
|
15
|
+
echo "ERROR: switchroom not found on PATH"
|
|
16
|
+
echo "Install: npm install -g switchroom"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
|
|
20
|
+
RAW=$(switchroom agent list --json 2>/dev/null) || {
|
|
21
|
+
echo "ERROR: switchroom agent list failed"
|
|
22
|
+
exit 1
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if [ -z "$RAW" ] || [ "$RAW" = "[]" ]; then
|
|
26
|
+
echo "No agents configured."
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
TOTAL=$(echo "$RAW" | python3 -c "import sys,json; agents=json.load(sys.stdin); print(len(agents))" 2>/dev/null || echo "?")
|
|
31
|
+
RUNNING=0
|
|
32
|
+
|
|
33
|
+
echo "$RAW" | python3 -c "
|
|
34
|
+
import sys, json, datetime
|
|
35
|
+
|
|
36
|
+
agents = json.load(sys.stdin)
|
|
37
|
+
running = 0
|
|
38
|
+
|
|
39
|
+
for a in agents:
|
|
40
|
+
name = a.get('name', 'unknown')
|
|
41
|
+
status = a.get('status', 'unknown')
|
|
42
|
+
model = a.get('model', 'unknown')
|
|
43
|
+
topic = a.get('topic_name', '')
|
|
44
|
+
coll = a.get('memory', {}).get('collection', '')
|
|
45
|
+
uptime = a.get('uptime', '')
|
|
46
|
+
pid = a.get('pid', '')
|
|
47
|
+
|
|
48
|
+
status_icon = '✓' if status == 'running' else '✗' if status in ('stopped','failed') else '?'
|
|
49
|
+
|
|
50
|
+
line = f'{status_icon} {name}'
|
|
51
|
+
if topic:
|
|
52
|
+
line += f' ({topic})'
|
|
53
|
+
line += f' — {status}'
|
|
54
|
+
if uptime:
|
|
55
|
+
line += f' ({uptime})'
|
|
56
|
+
print(line)
|
|
57
|
+
print(f' model: {model}', end='')
|
|
58
|
+
if coll:
|
|
59
|
+
print(f' collection: {coll}', end='')
|
|
60
|
+
if pid:
|
|
61
|
+
print(f' pid: {pid}', end='')
|
|
62
|
+
print()
|
|
63
|
+
print()
|
|
64
|
+
|
|
65
|
+
if status == 'running':
|
|
66
|
+
running += 1
|
|
67
|
+
|
|
68
|
+
print(f'{running} of {len(agents)} agents running.')
|
|
69
|
+
" 2>/dev/null || echo "$RAW"
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: telegram-test-harness
|
|
3
|
+
description: >
|
|
4
|
+
This skill should be used when the user asks to "test telegram", "test
|
|
5
|
+
bot interactions", "mock the bot api", "write a telegram test", "test
|
|
6
|
+
what users see in chat", "test progress card", "test the slot banner",
|
|
7
|
+
"test soft-confirm", "test auto-fallback notification", "test pin
|
|
8
|
+
behavior", or any variation on validating switchroom's Telegram-side
|
|
9
|
+
output deterministically.
|
|
10
|
+
Also use when the user mentions fake-bot-api, update-factory,
|
|
11
|
+
bot-api.harness, GrammyError, e2e telegram, telegram regression
|
|
12
|
+
test, or asks how to add a test for code that calls bot.api.* or
|
|
13
|
+
handles incoming Telegram updates.
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
# Telegram test harness (switchroom)
|
|
17
|
+
|
|
18
|
+
Switchroom ships a deterministic test harness for Telegram interactions
|
|
19
|
+
at `telegram-plugin/tests/`. Use it to lock in the Bot API call
|
|
20
|
+
sequences switchroom emits — what the user actually sees in chat — so
|
|
21
|
+
regressions fail a test instead of going silent in production.
|
|
22
|
+
|
|
23
|
+
This skill is a quick-reference for that harness. The full guide lives
|
|
24
|
+
at [`telegram-plugin/tests/HARNESS.md`](../../telegram-plugin/tests/HARNESS.md).
|
|
25
|
+
|
|
26
|
+
## When to use this harness
|
|
27
|
+
|
|
28
|
+
- A function under test calls `bot.api.sendMessage` / `editMessageText`
|
|
29
|
+
/ `pinChatMessage` / `setMessageReaction` / etc.
|
|
30
|
+
- A function under test consumes Telegram `Update` objects (commands,
|
|
31
|
+
callback queries, photos, forum-topic messages).
|
|
32
|
+
- You're touching code in `telegram-plugin/` and want to lock in what
|
|
33
|
+
the user sees across a sequence of events.
|
|
34
|
+
|
|
35
|
+
## When NOT to use this harness
|
|
36
|
+
|
|
37
|
+
- Pure logic with no Bot API surface — write a plain unit test against
|
|
38
|
+
the function (see `slot-banner.test.ts` vs `slot-banner-driver.e2e.test.ts`
|
|
39
|
+
for the split).
|
|
40
|
+
- Real-Telegram rendering quirks (markdown parsing edge cases, link
|
|
41
|
+
preview behaviour, emoji reflow on different clients) — only catchable
|
|
42
|
+
by a real test bot. Out of harness scope.
|
|
43
|
+
|
|
44
|
+
## Two mocks, one decision
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Need to assert on chat-model state across multiple calls
|
|
48
|
+
(pinned messages, message edits, deletions, reactions)?
|
|
49
|
+
├── yes → createFakeBotApi() from tests/fake-bot-api.ts
|
|
50
|
+
└── no → createMockBot() from tests/bot-api.harness.ts
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
`fake-bot-api.ts` carries an in-memory chat model and a fault-injection
|
|
54
|
+
DSL. `bot-api.harness.ts` is just `vi.fn()` stubs with sensible
|
|
55
|
+
defaults. Pick the lighter one when you don't need state.
|
|
56
|
+
|
|
57
|
+
## Quick start
|
|
58
|
+
|
|
59
|
+
```ts
|
|
60
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
61
|
+
import { createFakeBotApi, errors, type FakeBot } from './fake-bot-api.js';
|
|
62
|
+
|
|
63
|
+
let bot: FakeBot;
|
|
64
|
+
beforeEach(() => { bot = createFakeBotApi({ startMessageId: 100 }); });
|
|
65
|
+
|
|
66
|
+
it('pins a banner when the slot becomes non-default', async () => {
|
|
67
|
+
await refreshBanner({ bot, ownerChatId: 'c', /* ... */ });
|
|
68
|
+
expect(bot.api.sendMessage).toHaveBeenCalledTimes(1);
|
|
69
|
+
expect(bot.api.pinChatMessage).toHaveBeenCalledTimes(1);
|
|
70
|
+
expect(bot.isPinned('c', 100)).toBe(true);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it('survives Telegram throwing 429 flood-wait', async () => {
|
|
74
|
+
bot.faults.next('sendMessage', errors.floodWait(15));
|
|
75
|
+
// ... assert the function recovers / surfaces the error gracefully
|
|
76
|
+
});
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Core APIs
|
|
80
|
+
|
|
81
|
+
### `createFakeBotApi({ startMessageId? })`
|
|
82
|
+
|
|
83
|
+
Returns a `FakeBot` with:
|
|
84
|
+
|
|
85
|
+
- `bot.api.*` — vi.fn-backed Bot API methods. Mutate the chat model on
|
|
86
|
+
success, throw real `GrammyError` shapes on injected faults.
|
|
87
|
+
- `bot.state` — `{ sent, currentText, pinned, reactions, deleted }`
|
|
88
|
+
- `bot.faults.next(method, error, chat_id?)` — queue a one-shot fault
|
|
89
|
+
- `bot.messagesIn(chat_id)` — array of sent messages, oldest first
|
|
90
|
+
- `bot.textOf(message_id)` — current text after edits, or null
|
|
91
|
+
- `bot.isPinned(chat_id, message_id)` — boolean
|
|
92
|
+
- `bot.reset()` — wipe state + fault queue
|
|
93
|
+
|
|
94
|
+
### Update factories (`tests/update-factory.ts`)
|
|
95
|
+
|
|
96
|
+
```ts
|
|
97
|
+
makeMessageUpdate({ text, chat?, from?, message_thread_id?, ... })
|
|
98
|
+
makeTopicMessageUpdate({ text, message_thread_id, chat?, ... })
|
|
99
|
+
makeCallbackQueryUpdate({ data, chat?, from?, message_id?, ... })
|
|
100
|
+
makeMyChatMemberUpdate({ chat?, oldStatus?, newStatus?, ... })
|
|
101
|
+
makePhotoUpdate({ caption?, chat?, file_id?, ... })
|
|
102
|
+
makeDocumentUpdate({ file_name, mime_type?, chat?, ... })
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
All return real `Update` objects you can pass to `bot.handleUpdate()`
|
|
106
|
+
(grammy's production dispatch path).
|
|
107
|
+
|
|
108
|
+
### Pre-built error factories (`tests/fake-bot-api.ts → errors`)
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
errors.floodWait(retry_after?) // 429 Too Many Requests
|
|
112
|
+
errors.notModified() // 400 message is not modified
|
|
113
|
+
errors.messageToEditNotFound() // 400 message to edit not found
|
|
114
|
+
errors.messageToDeleteNotFound() // 400 message to delete not found
|
|
115
|
+
errors.threadNotFound() // 400 message thread not found
|
|
116
|
+
errors.forbidden() // 403 bot was blocked by user
|
|
117
|
+
errors.badRequest(description) // generic 400
|
|
118
|
+
errors.networkError(reason?) // fetch-level failure
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
These produce real `GrammyError` instances so production code's
|
|
122
|
+
`err instanceof GrammyError` checks fire correctly.
|
|
123
|
+
|
|
124
|
+
### Time control
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { microtaskFlush } from './bot-api.harness.js';
|
|
128
|
+
|
|
129
|
+
vi.useFakeTimers();
|
|
130
|
+
fireSomeAsyncOp();
|
|
131
|
+
await microtaskFlush(); // drain microtasks
|
|
132
|
+
vi.advanceTimersByTime(300);
|
|
133
|
+
await microtaskFlush();
|
|
134
|
+
expect(bot.api.editMessageText).toHaveBeenCalled();
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Naming convention
|
|
138
|
+
|
|
139
|
+
- `<feature>.test.ts` — pure-logic tests (no harness)
|
|
140
|
+
- `<feature>.e2e.test.ts` — drives an extracted handler against the
|
|
141
|
+
fake bot (or real grammy bot via injected updates)
|
|
142
|
+
|
|
143
|
+
Example pairs:
|
|
144
|
+
|
|
145
|
+
- `slot-banner.test.ts` (pure decision) +
|
|
146
|
+
`slot-banner-driver.e2e.test.ts` (Bot API dispatch)
|
|
147
|
+
- `auto-fallback.test.ts` (pure plan) +
|
|
148
|
+
`auto-fallback-dispatcher.e2e.test.ts` (notification dispatch)
|
|
149
|
+
|
|
150
|
+
## Test-design checklist
|
|
151
|
+
|
|
152
|
+
Before writing the test, ask:
|
|
153
|
+
|
|
154
|
+
1. **Is this code testable as-is, or does it need a small extraction?**
|
|
155
|
+
Module-global state in `gateway.ts` (e.g. `pinnedBannerState`,
|
|
156
|
+
`activeTurnStartedAt`) usually means the side-effecting part should
|
|
157
|
+
move to its own module that takes state as an argument. See
|
|
158
|
+
`slot-banner-driver.ts` for the extraction pattern.
|
|
159
|
+
2. **What's the failure I want to catch?** Snapshot-style "the whole
|
|
160
|
+
API call sequence" tests are noisy and churn on every minor
|
|
161
|
+
refactor. Assert on semantic fields (chat_id, text content,
|
|
162
|
+
parse_mode, pin/unpin presence).
|
|
163
|
+
3. **Which fault would matter in production?** Don't test every
|
|
164
|
+
conceivable error path — pick the ones the function is *supposed*
|
|
165
|
+
to handle (flood-wait retry, message-not-found cleanup, forbidden
|
|
166
|
+
exit). The error factories tell you which ones are worth wiring.
|
|
167
|
+
4. **Is there an existing pure-logic test for this?** If yes, the e2e
|
|
168
|
+
should focus on the wiring (which API calls fire in which order)
|
|
169
|
+
rather than re-testing the decision logic.
|
|
170
|
+
|
|
171
|
+
## Anti-patterns
|
|
172
|
+
|
|
173
|
+
- **Hand-rolling a `BannerState` (or other handle types) with an
|
|
174
|
+
arbitrary `message_id`** that the fake bot never saw. The fake throws
|
|
175
|
+
`messageToEditNotFound` on edit, which is realistic. Either send a
|
|
176
|
+
real message first to seed the chat model, or sequence the test as a
|
|
177
|
+
natural lifecycle.
|
|
178
|
+
- **Patching `globalThis.fetch`** to intercept the real Bot API. Tests
|
|
179
|
+
that do this couple to grammy internals; use `createFakeBotApi()`
|
|
180
|
+
instead so grammy version bumps don't break tests.
|
|
181
|
+
- **Asserting on the entire payload** of a sendMessage call.
|
|
182
|
+
Bot API adds optional fields over time and full-payload snapshots
|
|
183
|
+
churn for no semantic reason. Assert on the semantic shape.
|
|
184
|
+
|
|
185
|
+
## See also
|
|
186
|
+
|
|
187
|
+
- `telegram-plugin/tests/HARNESS.md` — full guide
|
|
188
|
+
- `telegram-plugin/tests/fake-bot-api.test.ts` — meta-test of the fake;
|
|
189
|
+
read first when adding new fake-bot capabilities
|
|
190
|
+
- `telegram-plugin/tests/streaming-e2e.test.ts` — worked example of a
|
|
191
|
+
larger end-to-end test (PTY → stream_reply → done)
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: token-helpers
|
|
3
|
+
description: Refresh OAuth access tokens for Google Calendar and Microsoft Graph from refresh tokens stored in the switchroom vault. Library skill — invoked by other skills that need a short-lived access token to call calendar or Graph APIs, not directly by the user.
|
|
4
|
+
allowed-tools: Bash(switchroom vault *), Bash(./scripts/*)
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# token-helpers
|
|
8
|
+
|
|
9
|
+
Shared shell scripts that exchange a long-lived OAuth refresh token for a short-lived access token and persist the new access token back to the Switchroom vault.
|
|
10
|
+
|
|
11
|
+
This is a library skill — other skills call into it rather than the user invoking it directly. A single refresh pipeline covers both Google and Microsoft providers.
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
Invoke a helper when:
|
|
16
|
+
- You hold a refresh token in the vault and need a fresh access token to call an API
|
|
17
|
+
- The consuming skill does **not** cache tokens across agents (if it did, we'd promote this to an MCP server)
|
|
18
|
+
|
|
19
|
+
Each helper is a plain shell script: read the refresh token from the vault, POST to the provider's OAuth endpoint, persist the returned `access_token` back to the vault, and print it to stdout so callers can pipe it into the next step.
|
|
20
|
+
|
|
21
|
+
## Scripts
|
|
22
|
+
|
|
23
|
+
### `scripts/google-cal-token.sh`
|
|
24
|
+
|
|
25
|
+
Refreshes a Google Calendar OAuth access token.
|
|
26
|
+
|
|
27
|
+
Vault keys it reads (override via env):
|
|
28
|
+
- `google-cal-refresh-token` — the refresh token (env: `GOOGLE_CAL_REFRESH_TOKEN_KEY`)
|
|
29
|
+
- `google-cal-client-id` — OAuth client id (env: `GOOGLE_CAL_CLIENT_ID_KEY`)
|
|
30
|
+
- `google-cal-client-secret` — OAuth client secret (env: `GOOGLE_CAL_CLIENT_SECRET_KEY`)
|
|
31
|
+
|
|
32
|
+
Vault key it writes:
|
|
33
|
+
- `google-cal-access-token` — the new access token (env: `GOOGLE_CAL_ACCESS_TOKEN_KEY`)
|
|
34
|
+
|
|
35
|
+
Other env:
|
|
36
|
+
- `GOOGLE_OAUTH_TOKEN_URL` — override the token endpoint (default: `https://oauth2.googleapis.com/token`)
|
|
37
|
+
- `SWITCHROOM_CLI` — override the CLI binary invocation (default: `switchroom`)
|
|
38
|
+
|
|
39
|
+
Usage:
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
access_token=$(./scripts/google-cal-token.sh)
|
|
43
|
+
curl -H "Authorization: Bearer $access_token" https://www.googleapis.com/calendar/v3/users/me/calendarList
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### `scripts/ms-graph-token.sh`
|
|
47
|
+
|
|
48
|
+
Refreshes a Microsoft Graph OAuth access token against the common tenant.
|
|
49
|
+
|
|
50
|
+
Vault keys it reads:
|
|
51
|
+
- `ms-graph-refresh-token` (env: `MS_GRAPH_REFRESH_TOKEN_KEY`)
|
|
52
|
+
- `ms-graph-client-id` (env: `MS_GRAPH_CLIENT_ID_KEY`)
|
|
53
|
+
- `ms-graph-client-secret` (env: `MS_GRAPH_CLIENT_SECRET_KEY`, optional — omit for public clients)
|
|
54
|
+
|
|
55
|
+
Vault key it writes:
|
|
56
|
+
- `ms-graph-access-token` (env: `MS_GRAPH_ACCESS_TOKEN_KEY`)
|
|
57
|
+
|
|
58
|
+
Other env:
|
|
59
|
+
- `MS_GRAPH_SCOPE` — space-delimited scope string (default: `https://graph.microsoft.com/.default offline_access`)
|
|
60
|
+
- `MS_OAUTH_TOKEN_URL` — override endpoint (default: `https://login.microsoftonline.com/common/oauth2/v2.0/token`)
|
|
61
|
+
- `SWITCHROOM_CLI` — override the CLI binary invocation
|
|
62
|
+
|
|
63
|
+
## Host prerequisites
|
|
64
|
+
|
|
65
|
+
- `curl`
|
|
66
|
+
- `jq`
|
|
67
|
+
- `switchroom` on `PATH` (or pass `SWITCHROOM_CLI`)
|
|
68
|
+
- `SWITCHROOM_VAULT_PASSPHRASE` exported so the CLI can unlock the vault non-interactively
|
|
69
|
+
|
|
70
|
+
## Exit codes
|
|
71
|
+
|
|
72
|
+
- `0` — new access token fetched and persisted
|
|
73
|
+
- `1` — missing vault entries, OAuth endpoint error, or malformed response
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# google-cal-token.sh — refresh a Google Calendar OAuth access token.
|
|
3
|
+
#
|
|
4
|
+
# Reads a refresh token, client_id, and client_secret from the
|
|
5
|
+
# Switchroom vault; POSTs to Google's OAuth endpoint; writes the new
|
|
6
|
+
# access token back to the vault; prints the access token to stdout.
|
|
7
|
+
#
|
|
8
|
+
# See skills/token-helpers/SKILL.md for env var overrides.
|
|
9
|
+
|
|
10
|
+
set -euo pipefail
|
|
11
|
+
|
|
12
|
+
REFRESH_KEY="${GOOGLE_CAL_REFRESH_TOKEN_KEY:-google-cal-refresh-token}"
|
|
13
|
+
ACCESS_KEY="${GOOGLE_CAL_ACCESS_TOKEN_KEY:-google-cal-access-token}"
|
|
14
|
+
CLIENT_ID_KEY="${GOOGLE_CAL_CLIENT_ID_KEY:-google-cal-client-id}"
|
|
15
|
+
CLIENT_SECRET_KEY="${GOOGLE_CAL_CLIENT_SECRET_KEY:-google-cal-client-secret}"
|
|
16
|
+
TOKEN_URL="${GOOGLE_OAUTH_TOKEN_URL:-https://oauth2.googleapis.com/token}"
|
|
17
|
+
SWITCHROOM_CLI="${SWITCHROOM_CLI:-switchroom}"
|
|
18
|
+
|
|
19
|
+
vault_get() {
|
|
20
|
+
$SWITCHROOM_CLI vault get "$1"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
vault_set() {
|
|
24
|
+
local key="$1"
|
|
25
|
+
$SWITCHROOM_CLI vault set "$key"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
refresh_token=$(vault_get "$REFRESH_KEY") || {
|
|
29
|
+
echo "ERROR: could not read vault key '$REFRESH_KEY'" >&2
|
|
30
|
+
exit 1
|
|
31
|
+
}
|
|
32
|
+
client_id=$(vault_get "$CLIENT_ID_KEY") || {
|
|
33
|
+
echo "ERROR: could not read vault key '$CLIENT_ID_KEY'" >&2
|
|
34
|
+
exit 1
|
|
35
|
+
}
|
|
36
|
+
client_secret=$(vault_get "$CLIENT_SECRET_KEY") || {
|
|
37
|
+
echo "ERROR: could not read vault key '$CLIENT_SECRET_KEY'" >&2
|
|
38
|
+
exit 1
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
response=$(
|
|
42
|
+
curl -sS -X POST "$TOKEN_URL" \
|
|
43
|
+
-H "Content-Type: application/x-www-form-urlencoded" \
|
|
44
|
+
--data-urlencode "client_id=$client_id" \
|
|
45
|
+
--data-urlencode "client_secret=$client_secret" \
|
|
46
|
+
--data-urlencode "refresh_token=$refresh_token" \
|
|
47
|
+
--data-urlencode "grant_type=refresh_token"
|
|
48
|
+
) || {
|
|
49
|
+
echo "ERROR: OAuth POST to $TOKEN_URL failed" >&2
|
|
50
|
+
exit 1
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
access_token=$(printf '%s' "$response" | jq -r '.access_token // empty')
|
|
54
|
+
|
|
55
|
+
if [ -z "$access_token" ]; then
|
|
56
|
+
echo "ERROR: OAuth response did not include an access_token" >&2
|
|
57
|
+
echo "Response: $response" >&2
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
printf '%s' "$access_token" | vault_set "$ACCESS_KEY" >/dev/null
|
|
62
|
+
printf '%s\n' "$access_token"
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# ms-graph-token.sh — refresh a Microsoft Graph OAuth access token.
|
|
3
|
+
#
|
|
4
|
+
# Reads a refresh token and client_id (plus an optional client_secret
|
|
5
|
+
# for confidential clients) from the Switchroom vault, POSTs to the
|
|
6
|
+
# Microsoft v2.0 token endpoint against the `common` tenant, writes
|
|
7
|
+
# the new access token back to the vault, and prints it to stdout.
|
|
8
|
+
#
|
|
9
|
+
# See skills/token-helpers/SKILL.md for env var overrides.
|
|
10
|
+
|
|
11
|
+
set -euo pipefail
|
|
12
|
+
|
|
13
|
+
REFRESH_KEY="${MS_GRAPH_REFRESH_TOKEN_KEY:-ms-graph-refresh-token}"
|
|
14
|
+
ACCESS_KEY="${MS_GRAPH_ACCESS_TOKEN_KEY:-ms-graph-access-token}"
|
|
15
|
+
CLIENT_ID_KEY="${MS_GRAPH_CLIENT_ID_KEY:-ms-graph-client-id}"
|
|
16
|
+
CLIENT_SECRET_KEY="${MS_GRAPH_CLIENT_SECRET_KEY:-ms-graph-client-secret}"
|
|
17
|
+
SCOPE="${MS_GRAPH_SCOPE:-https://graph.microsoft.com/.default offline_access}"
|
|
18
|
+
TOKEN_URL="${MS_OAUTH_TOKEN_URL:-https://login.microsoftonline.com/common/oauth2/v2.0/token}"
|
|
19
|
+
SWITCHROOM_CLI="${SWITCHROOM_CLI:-switchroom}"
|
|
20
|
+
|
|
21
|
+
vault_get() {
|
|
22
|
+
$SWITCHROOM_CLI vault get "$1"
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
vault_get_optional() {
|
|
26
|
+
$SWITCHROOM_CLI vault get "$1" 2>/dev/null || true
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
vault_set() {
|
|
30
|
+
local key="$1"
|
|
31
|
+
$SWITCHROOM_CLI vault set "$key"
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
refresh_token=$(vault_get "$REFRESH_KEY") || {
|
|
35
|
+
echo "ERROR: could not read vault key '$REFRESH_KEY'" >&2
|
|
36
|
+
exit 1
|
|
37
|
+
}
|
|
38
|
+
client_id=$(vault_get "$CLIENT_ID_KEY") || {
|
|
39
|
+
echo "ERROR: could not read vault key '$CLIENT_ID_KEY'" >&2
|
|
40
|
+
exit 1
|
|
41
|
+
}
|
|
42
|
+
client_secret=$(vault_get_optional "$CLIENT_SECRET_KEY")
|
|
43
|
+
|
|
44
|
+
curl_args=(
|
|
45
|
+
-sS -X POST "$TOKEN_URL"
|
|
46
|
+
-H "Content-Type: application/x-www-form-urlencoded"
|
|
47
|
+
--data-urlencode "client_id=$client_id"
|
|
48
|
+
--data-urlencode "refresh_token=$refresh_token"
|
|
49
|
+
--data-urlencode "grant_type=refresh_token"
|
|
50
|
+
--data-urlencode "scope=$SCOPE"
|
|
51
|
+
)
|
|
52
|
+
if [ -n "$client_secret" ]; then
|
|
53
|
+
curl_args+=(--data-urlencode "client_secret=$client_secret")
|
|
54
|
+
fi
|
|
55
|
+
|
|
56
|
+
response=$(curl "${curl_args[@]}") || {
|
|
57
|
+
echo "ERROR: OAuth POST to $TOKEN_URL failed" >&2
|
|
58
|
+
exit 1
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
access_token=$(printf '%s' "$response" | jq -r '.access_token // empty')
|
|
62
|
+
|
|
63
|
+
if [ -z "$access_token" ]; then
|
|
64
|
+
echo "ERROR: OAuth response did not include an access_token" >&2
|
|
65
|
+
echo "Response: $response" >&2
|
|
66
|
+
exit 1
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
printf '%s' "$access_token" | vault_set "$ACCESS_KEY" >/dev/null
|
|
70
|
+
printf '%s\n' "$access_token"
|