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,206 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# handoff-briefing.sh — Assemble a context briefing for fresh-session handoff.
|
|
3
|
+
#
|
|
4
|
+
# Invoked by start.sh in 'handoff' mode instead of writing a .handoff-briefing.md
|
|
5
|
+
# from the previous session (which relies on the Stop hook summarizer). This
|
|
6
|
+
# script assembles a lighter-weight briefing from three sources:
|
|
7
|
+
#
|
|
8
|
+
# 1. Last 20 Telegram messages from the plugin SQLite history DB
|
|
9
|
+
# ($TELEGRAM_STATE_DIR/history.db). Requires python3 + sqlite3 stdlib.
|
|
10
|
+
#
|
|
11
|
+
# 2. Hindsight recall results for "what was happening recently?"
|
|
12
|
+
# via $HINDSIGHT_API_URL/v1/default/banks/$HINDSIGHT_BANK_ID/memories/recall
|
|
13
|
+
# Requires curl + jq. Skipped gracefully if Hindsight is unreachable.
|
|
14
|
+
#
|
|
15
|
+
# 3. Today's daily memory from $WORKSPACE_DIR/memory/YYYY-MM-DD.md
|
|
16
|
+
# Skipped if missing.
|
|
17
|
+
#
|
|
18
|
+
# Output is written to $AGENT_DIR/.handoff-briefing.md (or stdout if
|
|
19
|
+
# HANDOFF_BRIEFING_STDOUT=1 is set). start.sh injects this into
|
|
20
|
+
# --append-system-prompt.
|
|
21
|
+
#
|
|
22
|
+
# Graceful degradation: each source is attempted independently. Failure of
|
|
23
|
+
# any single source produces empty output for that section rather than
|
|
24
|
+
# crashing the whole briefing. A completely empty briefing (all sources
|
|
25
|
+
# missing) writes nothing so start.sh skips the --append-system-prompt arg.
|
|
26
|
+
#
|
|
27
|
+
# Prerequisites:
|
|
28
|
+
# - python3 (stdlib sqlite3) — for Telegram history DB
|
|
29
|
+
# - curl, jq — for Hindsight recall (optional)
|
|
30
|
+
# - TELEGRAM_STATE_DIR — points to the plugin state dir containing history.db
|
|
31
|
+
# - HINDSIGHT_API_URL — base URL for Hindsight (optional)
|
|
32
|
+
# - HINDSIGHT_BANK_ID — bank/collection name (optional)
|
|
33
|
+
# - WORKSPACE_DIR or AGENT_DIR — to locate memory/YYYY-MM-DD.md
|
|
34
|
+
# - AGENT_DIR — output destination (if HANDOFF_BRIEFING_STDOUT!=1)
|
|
35
|
+
#
|
|
36
|
+
# Usage:
|
|
37
|
+
# handoff-briefing.sh [--stdout]
|
|
38
|
+
#
|
|
39
|
+
# The --stdout flag overrides HANDOFF_BRIEFING_STDOUT=1.
|
|
40
|
+
|
|
41
|
+
set -u
|
|
42
|
+
|
|
43
|
+
# ── Configuration ──────────────────────────────────────────────────────────────
|
|
44
|
+
TELEGRAM_STATE="${TELEGRAM_STATE_DIR:-}"
|
|
45
|
+
HINDSIGHT_URL="${HINDSIGHT_API_URL:-}"
|
|
46
|
+
HINDSIGHT_BANK="${HINDSIGHT_BANK_ID:-}"
|
|
47
|
+
AGENT_DIR="${AGENT_DIR:-}"
|
|
48
|
+
WORKSPACE_DIR="${WORKSPACE_DIR:-$AGENT_DIR}"
|
|
49
|
+
MAX_MESSAGES="${HANDOFF_BRIEFING_MAX_MESSAGES:-20}"
|
|
50
|
+
HINDSIGHT_TIMEOUT="${HANDOFF_BRIEFING_HINDSIGHT_TIMEOUT:-4}"
|
|
51
|
+
|
|
52
|
+
# Determine output mode
|
|
53
|
+
STDOUT_MODE=0
|
|
54
|
+
if [ "${HANDOFF_BRIEFING_STDOUT:-}" = "1" ] || [ "${1:-}" = "--stdout" ]; then
|
|
55
|
+
STDOUT_MODE=1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
# ── Source 1: Recent Telegram messages ─────────────────────────────────────────
|
|
59
|
+
TELEGRAM_SECTION=""
|
|
60
|
+
if [ -n "$TELEGRAM_STATE" ] && [ -d "$TELEGRAM_STATE" ]; then
|
|
61
|
+
HISTORY_DB="$TELEGRAM_STATE/history.db"
|
|
62
|
+
if [ -f "$HISTORY_DB" ] && command -v python3 >/dev/null 2>&1; then
|
|
63
|
+
# Use python3's stdlib sqlite3 — no bun:sqlite, no extra deps.
|
|
64
|
+
# Query the most recent $MAX_MESSAGES rows ordered by ts DESC, then
|
|
65
|
+
# reverse for chronological display. We skip system messages (role NULL).
|
|
66
|
+
TELEGRAM_ROWS=$(python3 - "$HISTORY_DB" "$MAX_MESSAGES" 2>/dev/null <<'PYEOF'
|
|
67
|
+
import sys, sqlite3, datetime
|
|
68
|
+
|
|
69
|
+
db_path = sys.argv[1]
|
|
70
|
+
limit = int(sys.argv[2])
|
|
71
|
+
|
|
72
|
+
try:
|
|
73
|
+
conn = sqlite3.connect(db_path)
|
|
74
|
+
conn.row_factory = sqlite3.Row
|
|
75
|
+
cur = conn.cursor()
|
|
76
|
+
# Fetch most recent rows; reverse for chronological output.
|
|
77
|
+
cur.execute(
|
|
78
|
+
"""
|
|
79
|
+
SELECT role, user, ts, text
|
|
80
|
+
FROM messages
|
|
81
|
+
WHERE role IN ('user', 'assistant')
|
|
82
|
+
ORDER BY ts DESC
|
|
83
|
+
LIMIT ?
|
|
84
|
+
""",
|
|
85
|
+
(limit,),
|
|
86
|
+
)
|
|
87
|
+
rows = list(reversed(cur.fetchall()))
|
|
88
|
+
conn.close()
|
|
89
|
+
for row in rows:
|
|
90
|
+
ts_str = datetime.datetime.fromtimestamp(row["ts"]).strftime("%Y-%m-%d %H:%M")
|
|
91
|
+
role = row["role"]
|
|
92
|
+
label = row["user"] if role == "user" and row["user"] else role
|
|
93
|
+
# Truncate long messages to keep the briefing concise
|
|
94
|
+
text = row["text"] or ""
|
|
95
|
+
if len(text) > 600:
|
|
96
|
+
text = text[:600] + "… [truncated]"
|
|
97
|
+
# Escape any literal backslash to keep the shell echo safe
|
|
98
|
+
text = text.replace("\\", "\\\\")
|
|
99
|
+
print(f"[{ts_str}] {label}: {text}")
|
|
100
|
+
except Exception as e:
|
|
101
|
+
sys.stderr.write(f"handoff-briefing: sqlite query failed: {e}\n")
|
|
102
|
+
sys.exit(0)
|
|
103
|
+
PYEOF
|
|
104
|
+
)
|
|
105
|
+
if [ -n "$TELEGRAM_ROWS" ]; then
|
|
106
|
+
TELEGRAM_SECTION="## Recent conversation (last $MAX_MESSAGES messages)
|
|
107
|
+
|
|
108
|
+
$TELEGRAM_ROWS"
|
|
109
|
+
fi
|
|
110
|
+
fi
|
|
111
|
+
fi
|
|
112
|
+
|
|
113
|
+
# ── Source 2: Hindsight recall ──────────────────────────────────────────────────
|
|
114
|
+
HINDSIGHT_SECTION=""
|
|
115
|
+
if [ -n "$HINDSIGHT_URL" ] && [ -n "$HINDSIGHT_BANK" ] && command -v curl >/dev/null 2>&1 && command -v jq >/dev/null 2>&1; then
|
|
116
|
+
RECALL_QUERY="what was happening recently in our conversation?"
|
|
117
|
+
RECALL_RESPONSE=$(curl -sf -m "$HINDSIGHT_TIMEOUT" -X POST \
|
|
118
|
+
-H "Content-Type: application/json" \
|
|
119
|
+
-d "$(jq -n --arg q "$RECALL_QUERY" --argjson m 800 '{query: $q, max_tokens: $m}')" \
|
|
120
|
+
"${HINDSIGHT_URL%/}/v1/default/banks/${HINDSIGHT_BANK}/memories/recall" 2>/dev/null)
|
|
121
|
+
if [ -n "$RECALL_RESPONSE" ]; then
|
|
122
|
+
RECALL_TEXT=$(printf '%s' "$RECALL_RESPONSE" | jq -r '
|
|
123
|
+
if .results == null or (.results | length) == 0 then
|
|
124
|
+
empty
|
|
125
|
+
else
|
|
126
|
+
(.results | map("- " + (.text // "(no text)") + (if .timestamp then " (" + .timestamp + ")" else "" end)) | join("\n"))
|
|
127
|
+
end
|
|
128
|
+
' 2>/dev/null)
|
|
129
|
+
if [ -n "$RECALL_TEXT" ]; then
|
|
130
|
+
HINDSIGHT_SECTION="## Hindsight recall (recent context)
|
|
131
|
+
|
|
132
|
+
$RECALL_TEXT"
|
|
133
|
+
fi
|
|
134
|
+
fi
|
|
135
|
+
fi
|
|
136
|
+
|
|
137
|
+
# ── Source 3: Today's daily memory ─────────────────────────────────────────────
|
|
138
|
+
DAILY_SECTION=""
|
|
139
|
+
TODAY=$(date +%Y-%m-%d 2>/dev/null || true)
|
|
140
|
+
if [ -n "$TODAY" ] && [ -n "$WORKSPACE_DIR" ]; then
|
|
141
|
+
DAILY_FILE="$WORKSPACE_DIR/memory/${TODAY}.md"
|
|
142
|
+
if [ -f "$DAILY_FILE" ] && [ -s "$DAILY_FILE" ]; then
|
|
143
|
+
DAILY_CONTENT=$(cat "$DAILY_FILE")
|
|
144
|
+
if [ -n "$DAILY_CONTENT" ]; then
|
|
145
|
+
DAILY_SECTION="## Today's memory (${TODAY})
|
|
146
|
+
|
|
147
|
+
$DAILY_CONTENT"
|
|
148
|
+
fi
|
|
149
|
+
fi
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
# ── Assemble briefing ───────────────────────────────────────────────────────────
|
|
153
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ" 2>/dev/null || date +"%Y-%m-%d %H:%M:%S UTC")
|
|
154
|
+
|
|
155
|
+
# Determine restart reason if available
|
|
156
|
+
RESTART_REASON="unknown"
|
|
157
|
+
if [ -n "$AGENT_DIR" ] && [ -f "$AGENT_DIR/.restart-reason" ]; then
|
|
158
|
+
RESTART_REASON=$(cat "$AGENT_DIR/.restart-reason" 2>/dev/null | head -1 | tr -d '\r\n')
|
|
159
|
+
fi
|
|
160
|
+
# Also check SWITCHROOM_PENDING_ENDED_VIA if set by start.sh
|
|
161
|
+
if [ -n "${SWITCHROOM_PENDING_ENDED_VIA:-}" ]; then
|
|
162
|
+
RESTART_REASON="$SWITCHROOM_PENDING_ENDED_VIA"
|
|
163
|
+
fi
|
|
164
|
+
|
|
165
|
+
# Build the briefing body
|
|
166
|
+
SECTIONS=""
|
|
167
|
+
for section in "$TELEGRAM_SECTION" "$HINDSIGHT_SECTION" "$DAILY_SECTION"; do
|
|
168
|
+
if [ -n "$section" ]; then
|
|
169
|
+
if [ -n "$SECTIONS" ]; then
|
|
170
|
+
SECTIONS="$SECTIONS
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
$section"
|
|
175
|
+
else
|
|
176
|
+
SECTIONS="$section"
|
|
177
|
+
fi
|
|
178
|
+
fi
|
|
179
|
+
done
|
|
180
|
+
|
|
181
|
+
# Empty briefing — nothing to inject
|
|
182
|
+
if [ -z "$SECTIONS" ]; then
|
|
183
|
+
exit 0
|
|
184
|
+
fi
|
|
185
|
+
|
|
186
|
+
BRIEFING="You just restarted at ${TIMESTAMP}. Previous session ended via: ${RESTART_REASON}. Consult this briefing before responding.
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
${SECTIONS}"
|
|
191
|
+
|
|
192
|
+
# ── Output ──────────────────────────────────────────────────────────────────────
|
|
193
|
+
if [ "$STDOUT_MODE" = "1" ]; then
|
|
194
|
+
printf '%s\n' "$BRIEFING"
|
|
195
|
+
else
|
|
196
|
+
if [ -z "$AGENT_DIR" ]; then
|
|
197
|
+
# Fallback: write to stdout if AGENT_DIR is not set
|
|
198
|
+
printf '%s\n' "$BRIEFING"
|
|
199
|
+
exit 0
|
|
200
|
+
fi
|
|
201
|
+
OUTPUT_FILE="$AGENT_DIR/.handoff-briefing.md"
|
|
202
|
+
OUTPUT_TMP="${OUTPUT_FILE}.tmp.$$"
|
|
203
|
+
printf '%s\n' "$BRIEFING" > "$OUTPUT_TMP" && mv -f "$OUTPUT_TMP" "$OUTPUT_FILE"
|
|
204
|
+
fi
|
|
205
|
+
|
|
206
|
+
exit 0
|
package/bin/run-hook.sh
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# run-hook.sh — wrap a hook command and surface failures to the issue
|
|
3
|
+
# sink (#425). Phase 0.2 of #424.
|
|
4
|
+
#
|
|
5
|
+
# Usage:
|
|
6
|
+
# run-hook.sh <source> <command> [args...]
|
|
7
|
+
#
|
|
8
|
+
# <source> Stable identifier for this hook, e.g. "hook:handoff" or
|
|
9
|
+
# "hook:secret-scrub-stop". Becomes the issue source field;
|
|
10
|
+
# coalesces all failures of this hook into one entry.
|
|
11
|
+
# <command> The actual hook command (binary or script path).
|
|
12
|
+
# [args...] Forwarded verbatim to <command>.
|
|
13
|
+
#
|
|
14
|
+
# Behaviour:
|
|
15
|
+
# - Stdin/stdout pass through unchanged. Hooks that emit JSON to
|
|
16
|
+
# claude on stdout still work.
|
|
17
|
+
# - Stderr is teed: visible in journald as before AND captured to a
|
|
18
|
+
# buffer so we can attach the tail to the issue detail.
|
|
19
|
+
# - On exit 0: auto-resolve any prior unresolved issue with the same
|
|
20
|
+
# fingerprint. So a transient flake clears itself on next success.
|
|
21
|
+
# - On non-zero exit: record an issue with severity=error, code = the
|
|
22
|
+
# command basename, summary = "<source>: <basename> exited <code>",
|
|
23
|
+
# detail = last ~60 lines of stderr.
|
|
24
|
+
# - The wrapper itself never blocks the hook. If `switchroom issues`
|
|
25
|
+
# fails (CLI missing, state dir not writable), we just emit a one-line
|
|
26
|
+
# warning to stderr and exit with the original status.
|
|
27
|
+
#
|
|
28
|
+
# The wrapper exits with the original command's exit code, so claude
|
|
29
|
+
# code's hook contract (block / allow / non-zero behaviour) is preserved.
|
|
30
|
+
|
|
31
|
+
set -u
|
|
32
|
+
|
|
33
|
+
if [ "$#" -lt 2 ]; then
|
|
34
|
+
echo "run-hook.sh: usage: run-hook.sh <source> <command> [args...]" >&2
|
|
35
|
+
exit 2
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
SOURCE="$1"; shift
|
|
39
|
+
COMMAND="$1"
|
|
40
|
+
shift
|
|
41
|
+
|
|
42
|
+
# Derive a code that discriminates between, e.g., `bash foo.sh` and
|
|
43
|
+
# `bash bar.sh`. When COMMAND is a known interpreter (bash, node, etc.)
|
|
44
|
+
# and the first arg looks like a script path, use its basename. So
|
|
45
|
+
# fingerprints stay distinct across hooks that share an interpreter.
|
|
46
|
+
case "$(basename -- "$COMMAND")" in
|
|
47
|
+
bash|sh|node|npx|bun|python|python3|deno)
|
|
48
|
+
if [ "$#" -gt 0 ]; then
|
|
49
|
+
CODE="$(basename -- "$1")"
|
|
50
|
+
else
|
|
51
|
+
CODE="$(basename -- "$COMMAND")"
|
|
52
|
+
fi
|
|
53
|
+
;;
|
|
54
|
+
*)
|
|
55
|
+
CODE="$(basename -- "$COMMAND")"
|
|
56
|
+
;;
|
|
57
|
+
esac
|
|
58
|
+
|
|
59
|
+
# Best-effort: locate the switchroom CLI. Prefer SWITCHROOM_CLI_PATH
|
|
60
|
+
# (set in the agent's MCP env), then PATH. If not found, the wrapper
|
|
61
|
+
# degrades to a passthrough — no issue recording, but the hook still
|
|
62
|
+
# runs.
|
|
63
|
+
if [ -n "${SWITCHROOM_CLI_PATH:-}" ] && [ -x "$SWITCHROOM_CLI_PATH" ]; then
|
|
64
|
+
SWITCHROOM_CLI="$SWITCHROOM_CLI_PATH"
|
|
65
|
+
elif command -v switchroom >/dev/null 2>&1; then
|
|
66
|
+
SWITCHROOM_CLI="$(command -v switchroom)"
|
|
67
|
+
else
|
|
68
|
+
SWITCHROOM_CLI=""
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
# We need a writable state dir to record issues. The CLI also accepts
|
|
72
|
+
# this via env; we just check up-front so the degraded path is obvious.
|
|
73
|
+
STATE_DIR="${TELEGRAM_STATE_DIR:-}"
|
|
74
|
+
|
|
75
|
+
# Run the wrapped command, capturing stderr to a temp file. After the
|
|
76
|
+
# command exits, replay the buffer to our own stderr so journald sees
|
|
77
|
+
# everything as before. This is intentionally NOT a process substitution
|
|
78
|
+
# with tee — bash does not wait for process substitutions to drain
|
|
79
|
+
# before the next command runs, which previously meant tail-reading
|
|
80
|
+
# the buffer could miss the final lines (the most informative ones).
|
|
81
|
+
# See review on #434/#435.
|
|
82
|
+
STDERR_TMP="$(mktemp -t run-hook-stderr.XXXXXX 2>/dev/null || mktemp)"
|
|
83
|
+
trap 'rm -f "$STDERR_TMP" 2>/dev/null || true' EXIT
|
|
84
|
+
|
|
85
|
+
"$COMMAND" "$@" 2>"$STDERR_TMP"
|
|
86
|
+
STATUS=$?
|
|
87
|
+
|
|
88
|
+
# Replay captured stderr to our own stderr now that the command has
|
|
89
|
+
# fully exited — preserves journald visibility without the streaming
|
|
90
|
+
# property (which hooks don't need; they're short-lived).
|
|
91
|
+
if [ -s "$STDERR_TMP" ]; then
|
|
92
|
+
cat "$STDERR_TMP" >&2
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
emit_warn() {
|
|
96
|
+
echo "run-hook.sh: $1" >&2
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
# When RUN_HOOK_DEBUG=1 is set, drop the stderr redirect on the
|
|
100
|
+
# issues-CLI invocations so an operator debugging a broken record-path
|
|
101
|
+
# sees the actual cause in journald instead of just the generic
|
|
102
|
+
# "failed to record issue (non-fatal)" line. See #445.
|
|
103
|
+
debug_mode() {
|
|
104
|
+
[ "${RUN_HOOK_DEBUG:-}" = "1" ]
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
record_failure() {
|
|
108
|
+
local detail summary
|
|
109
|
+
# Last ~60 lines of stderr; CLI will further cap to DETAIL_MAX_BYTES.
|
|
110
|
+
if [ -s "$STDERR_TMP" ]; then
|
|
111
|
+
detail="$(tail -n 60 "$STDERR_TMP")"
|
|
112
|
+
else
|
|
113
|
+
detail=""
|
|
114
|
+
fi
|
|
115
|
+
summary="${SOURCE}: ${CODE} exited ${STATUS}"
|
|
116
|
+
|
|
117
|
+
# Pipe detail via stdin so we don't have to shell-quote arbitrary
|
|
118
|
+
# error text. CLI reads it when --detail-stdin is set.
|
|
119
|
+
if debug_mode; then
|
|
120
|
+
if [ -n "$detail" ]; then
|
|
121
|
+
printf '%s' "$detail" | "$SWITCHROOM_CLI" issues record \
|
|
122
|
+
--severity error \
|
|
123
|
+
--source "$SOURCE" \
|
|
124
|
+
--code "$CODE" \
|
|
125
|
+
--summary "$summary" \
|
|
126
|
+
--detail-stdin \
|
|
127
|
+
--quiet \
|
|
128
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
129
|
+
|| emit_warn "failed to record issue (non-fatal)"
|
|
130
|
+
else
|
|
131
|
+
"$SWITCHROOM_CLI" issues record \
|
|
132
|
+
--severity error \
|
|
133
|
+
--source "$SOURCE" \
|
|
134
|
+
--code "$CODE" \
|
|
135
|
+
--summary "$summary" \
|
|
136
|
+
--quiet \
|
|
137
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
138
|
+
|| emit_warn "failed to record issue (non-fatal)"
|
|
139
|
+
fi
|
|
140
|
+
else
|
|
141
|
+
if [ -n "$detail" ]; then
|
|
142
|
+
printf '%s' "$detail" | "$SWITCHROOM_CLI" issues record \
|
|
143
|
+
--severity error \
|
|
144
|
+
--source "$SOURCE" \
|
|
145
|
+
--code "$CODE" \
|
|
146
|
+
--summary "$summary" \
|
|
147
|
+
--detail-stdin \
|
|
148
|
+
--quiet \
|
|
149
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
150
|
+
>/dev/null 2>&1 || emit_warn "failed to record issue (non-fatal)"
|
|
151
|
+
else
|
|
152
|
+
"$SWITCHROOM_CLI" issues record \
|
|
153
|
+
--severity error \
|
|
154
|
+
--source "$SOURCE" \
|
|
155
|
+
--code "$CODE" \
|
|
156
|
+
--summary "$summary" \
|
|
157
|
+
--quiet \
|
|
158
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
159
|
+
>/dev/null 2>&1 || emit_warn "failed to record issue (non-fatal)"
|
|
160
|
+
fi
|
|
161
|
+
fi
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
resolve_success() {
|
|
165
|
+
# Fast-skip the CLI fork when there is nothing to resolve.
|
|
166
|
+
#
|
|
167
|
+
# Cold-starting the switchroom CLI to call `issues resolve` costs
|
|
168
|
+
# ~785ms on a typical box (measured 2026-05-01 across three runs).
|
|
169
|
+
# With 3-5 successful hooks per turn this is 2.4-4 s of pure wrapper
|
|
170
|
+
# overhead per turn — bigger than the model's first-token latency.
|
|
171
|
+
#
|
|
172
|
+
# Most hooks succeed and most successful hooks have nothing to clear
|
|
173
|
+
# (a fleet check on 2026-05-01 found 0 unresolved entries across 5
|
|
174
|
+
# production agents). In that case `issues resolve` walks the file,
|
|
175
|
+
# finds no matching unresolved entry, and returns 0 — pure waste.
|
|
176
|
+
#
|
|
177
|
+
# Bash-side prefilter mirrors the CLI's match condition exactly:
|
|
178
|
+
# - fingerprint == "<source>::<code>" (per src/issues/fingerprint.ts)
|
|
179
|
+
# - resolved_at is null/missing (per IssueEvent.resolved_at?)
|
|
180
|
+
# Since IssueEvent.resolved_at is optional and JSON.stringify omits
|
|
181
|
+
# undefined fields, an unresolved entry's JSONL line will NOT contain
|
|
182
|
+
# the substring `"resolved_at":` at all. So the prefilter is:
|
|
183
|
+
#
|
|
184
|
+
# any line containing the fingerprint AND lacking `"resolved_at":`
|
|
185
|
+
#
|
|
186
|
+
# If no such line exists, the CLI's resolve op is a guaranteed no-op
|
|
187
|
+
# and we skip the fork. False positives (forking when we don't need
|
|
188
|
+
# to) match today's behaviour and are harmless. False negatives
|
|
189
|
+
# (skipping when we should fork) require a fingerprint substring
|
|
190
|
+
# collision with `"resolved_at":` somewhere on the same line, which
|
|
191
|
+
# the JSON ordering and key set make impossible.
|
|
192
|
+
local fingerprint="${SOURCE}::${CODE}"
|
|
193
|
+
local issues_file="${STATE_DIR}/issues.jsonl"
|
|
194
|
+
|
|
195
|
+
if [ -z "$STATE_DIR" ] || [ ! -s "$issues_file" ]; then
|
|
196
|
+
return 0
|
|
197
|
+
fi
|
|
198
|
+
if ! grep -F "\"fingerprint\":\"${fingerprint}\"" "$issues_file" 2>/dev/null \
|
|
199
|
+
| grep -vqF '"resolved_at":'; then
|
|
200
|
+
return 0
|
|
201
|
+
fi
|
|
202
|
+
|
|
203
|
+
# Real work — fork the CLI to do the actual flip.
|
|
204
|
+
if debug_mode; then
|
|
205
|
+
"$SWITCHROOM_CLI" issues resolve --source "$SOURCE" --code "$CODE" \
|
|
206
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
207
|
+
|| true
|
|
208
|
+
else
|
|
209
|
+
"$SWITCHROOM_CLI" issues resolve --source "$SOURCE" --code "$CODE" \
|
|
210
|
+
${STATE_DIR:+--state-dir "$STATE_DIR"} \
|
|
211
|
+
>/dev/null 2>&1 || true
|
|
212
|
+
fi
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if [ -z "$SWITCHROOM_CLI" ]; then
|
|
216
|
+
# Degraded path. Emit a single warning so the operator knows visibility
|
|
217
|
+
# is off, but don't change the hook's exit semantics.
|
|
218
|
+
emit_warn "switchroom CLI not found on PATH; hook ran without issue tracking"
|
|
219
|
+
exit "$STATUS"
|
|
220
|
+
fi
|
|
221
|
+
|
|
222
|
+
if [ "$STATUS" -eq 0 ]; then
|
|
223
|
+
resolve_success
|
|
224
|
+
else
|
|
225
|
+
record_failure
|
|
226
|
+
fi
|
|
227
|
+
|
|
228
|
+
exit "$STATUS"
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# UserPromptSubmit hook that emits the agent's current local time.
|
|
3
|
+
#
|
|
4
|
+
# Switchroom agents run as long-lived Claude Code processes. Inbound Telegram
|
|
5
|
+
# messages arrive with UTC timestamps (e.g. ts="2026-04-23T00:37:12Z"), and
|
|
6
|
+
# the LLM — having no other clock — infers that UTC is "now." On a host whose
|
|
7
|
+
# operator lives in Australia/Melbourne that's 10–11 hours off, and the
|
|
8
|
+
# agent will cheerfully tell the user "good morning" at 10pm local time.
|
|
9
|
+
#
|
|
10
|
+
# This hook fires on every UserPromptSubmit and prints a one-line hint that
|
|
11
|
+
# Claude Code prepends to the prompt as additionalContext, so the LLM sees
|
|
12
|
+
# fresh local time each turn. The resolved zone is passed in via
|
|
13
|
+
# SWITCHROOM_TIMEZONE (baked into the agent's systemd unit at scaffold/
|
|
14
|
+
# reconcile time). If unset we fall back to UTC — same default as the
|
|
15
|
+
# resolver — so the hook never fails loudly.
|
|
16
|
+
#
|
|
17
|
+
# Stale-install detection: when SWITCHROOM_TIMEZONE is unset we also annotate
|
|
18
|
+
# the hint with an in-band WARNING. This makes the failure visible to the
|
|
19
|
+
# agent (and thus to the user), rather than silently emitting "UTC" while the
|
|
20
|
+
# operator's real zone is Australia/Melbourne. Typical cause: an install
|
|
21
|
+
# upgraded past the timezone-awareness PR without re-running
|
|
22
|
+
# `switchroom systemd install` to refresh the unit files.
|
|
23
|
+
#
|
|
24
|
+
# Failure modes are silent: hooks that error block the turn in Claude Code,
|
|
25
|
+
# and a missing timezone hint is never worse than no hint at all.
|
|
26
|
+
|
|
27
|
+
set -eu
|
|
28
|
+
|
|
29
|
+
if [ -z "${SWITCHROOM_TIMEZONE:-}" ]; then
|
|
30
|
+
TZ_VAL="UTC"
|
|
31
|
+
TZ_UNSET=1
|
|
32
|
+
else
|
|
33
|
+
TZ_VAL="$SWITCHROOM_TIMEZONE"
|
|
34
|
+
TZ_UNSET=0
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# Round the emitted timestamp down to the nearest 15-minute bucket. This
|
|
38
|
+
# matters for prompt caching: the timestamp lands in additionalContext on
|
|
39
|
+
# every UserPromptSubmit, and Anthropic's cache is content-addressed, so
|
|
40
|
+
# a fresh per-second value would invalidate the cache key on every turn.
|
|
41
|
+
# 15 minutes is short enough that "current local time" stays useful and
|
|
42
|
+
# long enough to coalesce ~15× more cache hits than per-minute. GNU date's
|
|
43
|
+
# `-d "@<unix>"` is required (Linux-only, fine for switchroom production).
|
|
44
|
+
NOW_UNIX=$(date +%s)
|
|
45
|
+
ROUNDED=$(( NOW_UNIX - (NOW_UNIX % 900) ))
|
|
46
|
+
NOW=$(TZ="$TZ_VAL" date -d "@$ROUNDED" '+%Y-%m-%d %H:%M %Z (UTC%:z)')
|
|
47
|
+
|
|
48
|
+
if [ "$TZ_UNSET" = "1" ]; then
|
|
49
|
+
MSG="Current local time: $NOW ($TZ_VAL — WARNING: SWITCHROOM_TIMEZONE unset; systemd unit may be stale, run \`switchroom systemd install\` to refresh)"
|
|
50
|
+
else
|
|
51
|
+
MSG="Current local time: $NOW ($TZ_VAL)"
|
|
52
|
+
fi
|
|
53
|
+
|
|
54
|
+
# Emit as additionalContext so Claude Code prepends to the prompt.
|
|
55
|
+
# Prefer jq for JSON escaping when available (handles backticks, quotes,
|
|
56
|
+
# newlines); fall back to a manual escape of the few chars we might embed.
|
|
57
|
+
if command -v jq >/dev/null 2>&1; then
|
|
58
|
+
jq -cn --arg msg "$MSG" \
|
|
59
|
+
'{hookSpecificOutput:{hookEventName:"UserPromptSubmit",additionalContext:$msg}}'
|
|
60
|
+
else
|
|
61
|
+
# Manual escape: backslash, then double-quote. The message only ever
|
|
62
|
+
# contains the above fixed template + TZ value + date output, none of
|
|
63
|
+
# which legally contain control chars, so this is sufficient.
|
|
64
|
+
ESCAPED=${MSG//\\/\\\\}
|
|
65
|
+
ESCAPED=${ESCAPED//\"/\\\"}
|
|
66
|
+
printf '{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"%s"}}\n' "$ESCAPED"
|
|
67
|
+
fi
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Refresh the user-profile Mental Model on Stop, so the next session
|
|
3
|
+
# wakes up with a current snapshot of who the user is.
|
|
4
|
+
# Debounced to 30 min via a marker file so rapid-fire turns don't
|
|
5
|
+
# hammer Hindsight.
|
|
6
|
+
set -u
|
|
7
|
+
AGENT_DIR="$(dirname "$TELEGRAM_STATE_DIR")"
|
|
8
|
+
BANK_ID="${HINDSIGHT_BANK_ID:-}"
|
|
9
|
+
API_URL="${HINDSIGHT_API_URL:-http://127.0.0.1:18888}"
|
|
10
|
+
[ -z "$BANK_ID" ] && exit 0
|
|
11
|
+
MARKER="$AGENT_DIR/.mm-refresh-last"
|
|
12
|
+
if [ -f "$MARKER" ]; then
|
|
13
|
+
_LAST=$(cat "$MARKER" 2>/dev/null || echo 0)
|
|
14
|
+
_NOW=$(date +%s)
|
|
15
|
+
if [ $((_NOW - _LAST)) -lt 1800 ]; then
|
|
16
|
+
exit 0 # < 30 min since last refresh, skip
|
|
17
|
+
fi
|
|
18
|
+
fi
|
|
19
|
+
# Fire-and-forget refresh via MCP. Timeout bounded by Claude Code hook.
|
|
20
|
+
# Output nothing on success or failure; errors are surfaced via doctor.
|
|
21
|
+
{
|
|
22
|
+
# JSON-RPC flow: initialize → tools/call refresh_mental_model
|
|
23
|
+
SESSION=$(curl -sS -X POST "$API_URL/mcp/" \
|
|
24
|
+
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
|
|
25
|
+
-H "X-Bank-Id: $BANK_ID" -D /tmp/mm-refresh-$$.headers \
|
|
26
|
+
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"mm-refresh","version":"0.1"}}}' \
|
|
27
|
+
-m 3 -o /dev/null 2>/dev/null && grep -i mcp-session-id /tmp/mm-refresh-$$.headers | cut -d' ' -f2 | tr -d '\r\n')
|
|
28
|
+
if [ -n "$SESSION" ]; then
|
|
29
|
+
curl -sS -X POST "$API_URL/mcp/" \
|
|
30
|
+
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
|
|
31
|
+
-H "X-Bank-Id: $BANK_ID" -H "mcp-session-id: $SESSION" \
|
|
32
|
+
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"refresh_mental_model","arguments":{"name":"user-profile"}}}' \
|
|
33
|
+
-m 5 -o /dev/null 2>/dev/null || true
|
|
34
|
+
fi
|
|
35
|
+
rm -f /tmp/mm-refresh-$$.headers 2>/dev/null || true
|
|
36
|
+
date +%s > "$MARKER"
|
|
37
|
+
} &
|
|
38
|
+
exit 0
|