crewly 1.13.1 → 1.14.1
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/config/constants.ts +8 -0
- package/config/roles/orchestrator/prompt.md +23 -0
- package/config/skills/agent/core/reply-channel/SKILL.md +6 -0
- package/config/skills/agent/core/reply-channel/execute.sh +14 -2
- package/config/skills/agent/core/slack-post/SKILL.md +126 -0
- package/config/skills/agent/core/slack-post/execute.sh +127 -0
- package/config/skills/agent/remote-browser/SKILL.md +178 -0
- package/config/skills/agent/xiaoyuzhoufm-transcript/SKILL.md +46 -22
- package/config/skills/agent/xiaoyuzhoufm-transcript/execute.sh +82 -214
- package/config/skills/agent/xiaoyuzhoufm-transcript/skill.json +3 -3
- package/config/skills/orchestrator/get-team-status/SKILL.md +5 -1
- package/config/skills/orchestrator/get-team-status/execute.sh +28 -2
- package/config/slack-app-manifest.json +7 -1
- package/dist/backend/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/backend/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/backend/backend/src/config/oauth.config.js +121 -19
- package/dist/backend/backend/src/config/oauth.config.js.map +1 -1
- package/dist/backend/backend/src/constants.d.ts +60 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +74 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +33 -4
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js +27 -9
- package/dist/backend/backend/src/controllers/credentials/google-oauth.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/slack/slack.controller.js +342 -0
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +31 -7
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts +10 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/idle-detection.service.js +37 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js +13 -11
- package/dist/backend/backend/src/services/browser/browser-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts +14 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js +56 -0
- package/dist/backend/backend/src/services/browser/browser-proxy.service.js.map +1 -1
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts +63 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js +74 -0
- package/dist/backend/backend/src/services/browser/browser-services.registry.js.map +1 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +25 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +19 -7
- package/dist/backend/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js +121 -1
- package/dist/backend/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
- package/dist/backend/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/backend/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/backend/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js +14 -0
- package/dist/backend/backend/src/services/event-bus/event-to-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/backend/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts +34 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +99 -10
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts +124 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +243 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +11 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +56 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/backend/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
- package/dist/backend/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/backend/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack.service.js +297 -3
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts +22 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js +71 -0
- package/dist/backend/backend/src/services/v3/workitem-dispatch.subscriber.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts +20 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js +27 -2
- package/dist/backend/backend/src/services/wiki/wiki-bookkeep-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts +36 -2
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js +86 -10
- package/dist/backend/backend/src/services/wiki/wiki-reflect-trigger.service.js.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts +37 -0
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js +74 -8
- package/dist/backend/backend/src/services/wiki/wiki-workitem-bridge.service.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +87 -0
- package/dist/backend/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/slack.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/backend/config/constants.d.ts +8 -0
- package/dist/backend/config/constants.d.ts.map +1 -1
- package/dist/backend/config/constants.js +8 -0
- package/dist/backend/config/constants.js.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.d.ts +93 -19
- package/dist/cli/backend/src/config/oauth.config.d.ts.map +1 -1
- package/dist/cli/backend/src/config/oauth.config.js +121 -19
- package/dist/cli/backend/src/config/oauth.config.js.map +1 -1
- package/dist/cli/backend/src/constants.d.ts +60 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +74 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts +292 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js +420 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.dispatcher.service.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts +134 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js +232 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts +66 -0
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js +121 -1
- package/dist/cli/backend/src/services/chat-v2/chat-v2.service.js.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts +35 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.d.ts.map +1 -1
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js +63 -0
- package/dist/cli/backend/src/services/chat-v2/sqlite/message.store.js.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.d.ts +6 -0
- package/dist/cli/backend/src/services/core/storage.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.d.ts.map +1 -1
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js +6 -2
- package/dist/cli/backend/src/services/credential/helpers/gemini-cli-workspace.helper.js.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts +8 -0
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js +31 -3
- package/dist/cli/backend/src/services/orc/orc-delivery-enforcer.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +209 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +416 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts +103 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js +197 -0
- package/dist/cli/backend/src/services/slack/slack-mention-resolver.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js +18 -0
- package/dist/cli/backend/src/services/slack/slack-orchestrator-bridge.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +329 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +821 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +116 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.js +297 -3
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +87 -0
- package/dist/cli/backend/src/types/slack.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/slack.types.js.map +1 -1
- package/dist/cli/backend/src/utils/team.utils.d.ts +40 -0
- package/dist/cli/backend/src/utils/team.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/utils/team.utils.js +66 -0
- package/dist/cli/backend/src/utils/team.utils.js.map +1 -0
- package/dist/cli/cli/src/index.js +0 -0
- package/dist/cli/config/constants.d.ts +8 -0
- package/dist/cli/config/constants.d.ts.map +1 -1
- package/dist/cli/config/constants.js +8 -0
- package/dist/cli/config/constants.js.map +1 -1
- package/frontend/dist/assets/{index-890d3f9d.js → index-190a957f.js} +294 -294
- package/frontend/dist/assets/{index-8205ea5e.css → index-88feb412.css} +1 -1
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/config/constants.d.ts.map +0 -1
- package/config/index.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/index.js +0 -7
- package/dist/backend/backend/src/controllers/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts +0 -71
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js +0 -237
- package/dist/backend/backend/src/controllers/knowledge/knowledge.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts +0 -24
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js +0 -34
- package/dist/backend/backend/src/controllers/knowledge/knowledge.routes.js.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts +0 -91
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js +0 -290
- package/dist/backend/backend/src/controllers/scheduler/unified-scheduler.controller.js.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts +0 -169
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.d.ts.map +0 -1
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js +0 -1779
- package/dist/backend/backend/src/controllers/task-management/task-management.controller.js.map +0 -1
- package/dist/backend/backend/src/index.js.orc-bak-20260529 +0 -3130
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts +0 -27
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.d.ts.map +0 -1
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js +0 -40
- package/dist/backend/backend/src/routes/modules/unified-scheduler.routes.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts +0 -513
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js +0 -1568
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-runner.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts +0 -86
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js +0 -147
- package/dist/backend/backend/src/services/agent/crewly-agent/agent-worker.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts +0 -68
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js +0 -131
- package/dist/backend/backend/src/services/agent/crewly-agent/api-client.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts +0 -130
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js +0 -263
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-log.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts +0 -74
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js +0 -140
- package/dist/backend/backend/src/services/agent/crewly-agent/audit-trail.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts +0 -29
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js +0 -279
- package/dist/backend/backend/src/services/agent/crewly-agent/auditor-tools.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts +0 -340
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js +0 -1176
- package/dist/backend/backend/src/services/agent/crewly-agent/crewly-agent-runtime.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js +0 -145
- package/dist/backend/backend/src/services/agent/crewly-agent/deepseek-sse-transform.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts +0 -79
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js +0 -218
- package/dist/backend/backend/src/services/agent/crewly-agent/env-isolation.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js +0 -16
- package/dist/backend/backend/src/services/agent/crewly-agent/index.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js +0 -185
- package/dist/backend/backend/src/services/agent/crewly-agent/mcp-tool-bridge.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts +0 -141
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js +0 -310
- package/dist/backend/backend/src/services/agent/crewly-agent/model-manager.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/output-filter.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts +0 -103
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js +0 -256
- package/dist/backend/backend/src/services/agent/crewly-agent/prompt-guard.service.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts +0 -143
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js +0 -264
- package/dist/backend/backend/src/services/agent/crewly-agent/rate-limiter.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts +0 -13
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js +0 -91
- package/dist/backend/backend/src/services/agent/crewly-agent/smoke-test.js.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts +0 -135
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.d.ts.map +0 -1
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js +0 -1937
- package/dist/backend/backend/src/services/agent/crewly-agent/tool-registry.js.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts +0 -429
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js +0 -852
- package/dist/backend/backend/src/services/autonomous/auto-assign.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/backend/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/backend/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/backend/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.d.ts +0 -8
- package/dist/backend/backend/src/services/knowledge/index.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/index.js +0 -8
- package/dist/backend/backend/src/services/knowledge/index.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/backend/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/backend/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/backend/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/backend/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/backend/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/backend/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/embedding-provider.js +0 -185
- package/dist/backend/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/backend/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/memory/vector-store.service.js +0 -825
- package/dist/backend/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/backend/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/backend/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts +0 -118
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js +0 -326
- package/dist/backend/backend/src/services/v3/project-task-watcher.service.js.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts +0 -74
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js +0 -154
- package/dist/backend/backend/src/services/wiki/wiki-chat-subscriber.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts +0 -234
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js +0 -636
- package/dist/backend/backend/src/services/workflow/unified-scheduler.service.js.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts +0 -156
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.d.ts.map +0 -1
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js +0 -81
- package/dist/backend/backend/src/services/workflow/unified-scheduler.types.js.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/backend/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/auto-assign.types.js +0 -136
- package/dist/backend/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/backend/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/backend/backend/src/types/knowledge.types.js +0 -38
- package/dist/backend/backend/src/types/knowledge.types.js.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts +0 -111
- package/dist/backend/backend/src/utils/esm-require.utils.d.ts.map +0 -1
- package/dist/backend/backend/src/utils/esm-require.utils.js +0 -124
- package/dist/backend/backend/src/utils/esm-require.utils.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/knowledge/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/knowledge/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js +0 -241
- package/dist/cli/backend/src/services/knowledge/fts5-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts +0 -102
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js +0 -118
- package/dist/cli/backend/src/services/knowledge/fts5-query-sanitizer.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts +0 -56
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js +0 -91
- package/dist/cli/backend/src/services/knowledge/fts5-search-strategy.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts +0 -241
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js +0 -590
- package/dist/cli/backend/src/services/knowledge/knowledge-search.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts +0 -153
- package/dist/cli/backend/src/services/knowledge/knowledge.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js +0 -409
- package/dist/cli/backend/src/services/knowledge/knowledge.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts +0 -159
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js +0 -304
- package/dist/cli/backend/src/services/knowledge/learnings-index.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/knowledge/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js +0 -830
- package/dist/cli/backend/src/services/knowledge/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts +0 -115
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js +0 -215
- package/dist/cli/backend/src/services/knowledge/wiki-compiler.service.js.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts +0 -78
- package/dist/cli/backend/src/services/memory/embedding-provider.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/embedding-provider.js +0 -179
- package/dist/cli/backend/src/services/memory/embedding-provider.js.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts +0 -331
- package/dist/cli/backend/src/services/memory/vector-store.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/memory/vector-store.service.js +0 -814
- package/dist/cli/backend/src/services/memory/vector-store.service.js.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts +0 -171
- package/dist/cli/backend/src/services/project/task-tracking.service.d.ts.map +0 -1
- package/dist/cli/backend/src/services/project/task-tracking.service.js +0 -725
- package/dist/cli/backend/src/services/project/task-tracking.service.js.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.d.ts +0 -271
- package/dist/cli/backend/src/types/auto-assign.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/auto-assign.types.js +0 -136
- package/dist/cli/backend/src/types/auto-assign.types.js.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.d.ts +0 -195
- package/dist/cli/backend/src/types/knowledge.types.d.ts.map +0 -1
- package/dist/cli/backend/src/types/knowledge.types.js +0 -38
- package/dist/cli/backend/src/types/knowledge.types.js.map +0 -1
package/config/constants.ts
CHANGED
|
@@ -873,6 +873,14 @@ export const AGENT_SUSPEND_CONSTANTS = {
|
|
|
873
873
|
ALWAYS_ON_ROLES: ['orchestrator', 'auditor'] as const,
|
|
874
874
|
/** Idle timeout in ms before a worker agent is stopped (default 30 min) */
|
|
875
875
|
AGENT_IDLE_STOP_TIMEOUT_MS: 1_800_000,
|
|
876
|
+
/**
|
|
877
|
+
* Do not idle-stop an agent whose next cron run is due within this many
|
|
878
|
+
* minutes. Killing it only to respawn it for the cron costs a cold start
|
|
879
|
+
* (init prompt + registration + recall, ~0.5-1M input tokens on Codex)
|
|
880
|
+
* every single run — a 15-minute cron under a 10-minute idle timeout
|
|
881
|
+
* paid that 50 times a day on steamfun-ops (2026-09-16).
|
|
882
|
+
*/
|
|
883
|
+
CRON_KEEPALIVE_WINDOW_MINUTES: 30,
|
|
876
884
|
} as const;
|
|
877
885
|
|
|
878
886
|
// ========================= SERVER PROCESS CONSTANTS =========================
|
|
@@ -618,6 +618,29 @@ After queueing, continue the turn normally. A separate `wiki-process-queue` run
|
|
|
618
618
|
|
|
619
619
|
The trigger debounces — replying does not cause re-fire. Ignoring it means the next fire arrives 4h later and the counter shows zero queue-adds, which Steve will notice during audits.
|
|
620
620
|
|
|
621
|
+
## Context Hygiene — keep tool output small (2026-09-16) — MANDATORY
|
|
622
|
+
|
|
623
|
+
Every byte a command prints stays in your context for the rest of the
|
|
624
|
+
session and is re-sent to the model on every subsequent call. On a
|
|
625
|
+
long-running box the cost of the session is dominated by this, not by
|
|
626
|
+
the work itself. Rules:
|
|
627
|
+
|
|
628
|
+
1. **Never dump raw output.** No bare `cat` of a file, no raw `curl`/API
|
|
629
|
+
JSON, no `rg` across a tree. Pipe through `jq '<selector>'`,
|
|
630
|
+
`head -n 40`, `grep`, or `wc -l` and ask for exactly the field you need.
|
|
631
|
+
2. **`get-team-status` is compact by default.** Only pass `--full` when a
|
|
632
|
+
specific field is missing from the compact view.
|
|
633
|
+
3. **Bridge-auto wiki WIs: one pass, then stop.** If `wiki-migrate --apply`
|
|
634
|
+
reports `applied: 0`, there is nothing left to migrate right now — say so
|
|
635
|
+
in `complete-task` and move on. Do not re-run scan + apply in the same
|
|
636
|
+
turn, and do not re-check "just in case"; the bridge backs off on its
|
|
637
|
+
own when nothing changed.
|
|
638
|
+
4. **One reminder covers all queued WorkItems.** A `[CREWLY-DISPATCH]` that
|
|
639
|
+
lists several WIs means: process all of them in this turn. Do not wait
|
|
640
|
+
for a separate message per item.
|
|
641
|
+
5. **Reflect / bookkeep messages list every vault at once.** Handle the
|
|
642
|
+
whole list in one sweep and reply once.
|
|
643
|
+
|
|
621
644
|
## Turn-end "idle-drain" checklist (2026-05-26) — MANDATORY
|
|
622
645
|
|
|
623
646
|
Before yielding the turn, run this 5-step check. **Task work always wins** — only drain wiki when you're genuinely idle, never block a chat reply or active WI on wiki maintenance.
|
|
@@ -36,9 +36,15 @@ user's chat UI sees it.
|
|
|
36
36
|
bash config/skills/agent/core/reply-channel/execute.sh \
|
|
37
37
|
--channel <channelId> \
|
|
38
38
|
--content "your reply text" \
|
|
39
|
+
[--thread <messageId>] \
|
|
39
40
|
[--cmid <clientMessageId>]
|
|
40
41
|
```
|
|
41
42
|
|
|
43
|
+
`--thread` replies inside an existing thread. When the prompt you received
|
|
44
|
+
came from a **Slack team channel** it names the thread id
|
|
45
|
+
(`--thread <id>`); pass it through so your reply shows up in the same Slack
|
|
46
|
+
thread, under your own name.
|
|
47
|
+
|
|
42
48
|
Or with JSON:
|
|
43
49
|
|
|
44
50
|
```bash
|
|
@@ -15,7 +15,7 @@ print_usage() {
|
|
|
15
15
|
cat <<'EOF_USAGE'
|
|
16
16
|
Usage:
|
|
17
17
|
# CLI flags (preferred)
|
|
18
|
-
bash execute.sh --channel <channelId> --content "reply text" [--cmid <clientMessageId>]
|
|
18
|
+
bash execute.sh --channel <channelId> --content "reply text" [--thread <messageId>] [--cmid <clientMessageId>]
|
|
19
19
|
|
|
20
20
|
# Content from stdin
|
|
21
21
|
echo "multi-line reply" | bash execute.sh --channel chan-1
|
|
@@ -27,6 +27,8 @@ Options:
|
|
|
27
27
|
--channel | -c Target channel id (required)
|
|
28
28
|
--content | -m Reply text (required unless piped via stdin)
|
|
29
29
|
--content-file Read reply text from a file path
|
|
30
|
+
--thread | -t Thread root message id — reply inside that thread
|
|
31
|
+
(Slack team channels: keeps the reply in the same Slack thread)
|
|
30
32
|
--cmid Optional client-message-id for idempotency
|
|
31
33
|
--json | -j Raw JSON payload
|
|
32
34
|
--help | -h Show this help
|
|
@@ -37,6 +39,7 @@ INPUT_JSON=""
|
|
|
37
39
|
CHANNEL_ID=""
|
|
38
40
|
CONTENT=""
|
|
39
41
|
CMID=""
|
|
42
|
+
THREAD_ID=""
|
|
40
43
|
|
|
41
44
|
# Detect legacy JSON argument as $1
|
|
42
45
|
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
@@ -62,6 +65,10 @@ while [[ $# -gt 0 ]]; do
|
|
|
62
65
|
CMID="$2"
|
|
63
66
|
shift 2
|
|
64
67
|
;;
|
|
68
|
+
--thread|-t)
|
|
69
|
+
THREAD_ID="$2"
|
|
70
|
+
shift 2
|
|
71
|
+
;;
|
|
65
72
|
--json|-j)
|
|
66
73
|
INPUT_JSON="$2"
|
|
67
74
|
shift 2
|
|
@@ -95,6 +102,7 @@ except Exception as e:
|
|
|
95
102
|
sys.exit(0)
|
|
96
103
|
print('CHANNEL=' + str(d.get('channelId', '')))
|
|
97
104
|
print('CMID=' + str(d.get('clientMessageId', '')))
|
|
105
|
+
print('THREAD=' + str(d.get('threadId', '')))
|
|
98
106
|
# content is multi-line safe — use base64
|
|
99
107
|
import base64
|
|
100
108
|
c = d.get('content', '')
|
|
@@ -109,6 +117,7 @@ PY
|
|
|
109
117
|
case "$line" in
|
|
110
118
|
CHANNEL=*) [ -z "$CHANNEL_ID" ] && CHANNEL_ID="${line#CHANNEL=}";;
|
|
111
119
|
CMID=*) [ -z "$CMID" ] && CMID="${line#CMID=}";;
|
|
120
|
+
THREAD=*) [ -z "$THREAD_ID" ] && THREAD_ID="${line#THREAD=}";;
|
|
112
121
|
CONTENT_B64=*) [ -z "$CONTENT" ] && CONTENT="$(echo "${line#CONTENT_B64=}" | base64 -d 2>/dev/null)";;
|
|
113
122
|
esac
|
|
114
123
|
done <<< "$EXTRACTED"
|
|
@@ -131,12 +140,15 @@ fi
|
|
|
131
140
|
# Build JSON body. Export CONTENT/CMID so python can read them safely without
|
|
132
141
|
# quoting the values through the shell (avoids escaping hell for multi-line
|
|
133
142
|
# content with quotes, backslashes, backticks, etc.).
|
|
134
|
-
BODY=$(CONTENT="$CONTENT" CMID="$CMID" python3 -c '
|
|
143
|
+
BODY=$(CONTENT="$CONTENT" CMID="$CMID" THREAD_ID="$THREAD_ID" python3 -c '
|
|
135
144
|
import os, json
|
|
136
145
|
p = {"content": os.environ["CONTENT"], "contentType": "markdown"}
|
|
137
146
|
cmid = os.environ.get("CMID", "")
|
|
138
147
|
if cmid:
|
|
139
148
|
p["clientMessageId"] = cmid
|
|
149
|
+
thread = os.environ.get("THREAD_ID", "")
|
|
150
|
+
if thread:
|
|
151
|
+
p["threadId"] = thread
|
|
140
152
|
print(json.dumps(p))
|
|
141
153
|
')
|
|
142
154
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: slack-post
|
|
3
|
+
description: Start a Slack conversation yourself — post to a channel or DM a person, under your own Slack identity. Use it to raise something proactively, not to answer a message you were already sent (that is reply-channel).
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: communication
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- team-leader
|
|
9
|
+
- tpm
|
|
10
|
+
- developer
|
|
11
|
+
- frontend-developer
|
|
12
|
+
- backend-developer
|
|
13
|
+
- fullstack-dev
|
|
14
|
+
- qa
|
|
15
|
+
- qa-engineer
|
|
16
|
+
- designer
|
|
17
|
+
- product-manager
|
|
18
|
+
- architect
|
|
19
|
+
- generalist
|
|
20
|
+
- sales
|
|
21
|
+
- support
|
|
22
|
+
- marketing
|
|
23
|
+
triggers:
|
|
24
|
+
- slack post
|
|
25
|
+
- message slack
|
|
26
|
+
- dm on slack
|
|
27
|
+
- tell the team on slack
|
|
28
|
+
tags:
|
|
29
|
+
- communication
|
|
30
|
+
- slack
|
|
31
|
+
- proactive
|
|
32
|
+
execution:
|
|
33
|
+
type: script
|
|
34
|
+
script:
|
|
35
|
+
file: execute.sh
|
|
36
|
+
interpreter: bash
|
|
37
|
+
timeoutMs: 20000
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
# slack-post
|
|
41
|
+
|
|
42
|
+
Send a Slack message on your own initiative. If you have a Slack identity of
|
|
43
|
+
your own, the message comes from your bot user, so a DM is a real conversation
|
|
44
|
+
between that person and you. Otherwise it goes out through the shared Crewly
|
|
45
|
+
bot carrying your name and icon.
|
|
46
|
+
|
|
47
|
+
## When to use
|
|
48
|
+
|
|
49
|
+
- Something you found needs a human's attention now, and nobody asked you.
|
|
50
|
+
- You finished long-running work and the person who wanted it is not in the
|
|
51
|
+
thread any more.
|
|
52
|
+
- You need one specific person, so a DM beats the team channel.
|
|
53
|
+
|
|
54
|
+
**Do not use it to answer a message you were handed.** A prompt that starts
|
|
55
|
+
with `[CHAT:<channelId>]` is answered with `reply-channel`, which keeps your
|
|
56
|
+
reply in the same Slack thread.
|
|
57
|
+
|
|
58
|
+
## Invocation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
bash config/skills/agent/core/slack-post/execute.sh \
|
|
62
|
+
--target "#general" \
|
|
63
|
+
--text "Deploy finished, staging is on 1.4.2."
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```bash
|
|
67
|
+
# DM a person by handle
|
|
68
|
+
bash config/skills/agent/core/slack-post/execute.sh --target "@steve" --text "..."
|
|
69
|
+
|
|
70
|
+
# Reply inside an existing Slack thread
|
|
71
|
+
bash config/skills/agent/core/slack-post/execute.sh --target C0123ABCD --thread 1712345678.000100 --text "..."
|
|
72
|
+
|
|
73
|
+
# Long text from a file, or piped
|
|
74
|
+
bash .../execute.sh --target "#general" --text-file /tmp/report.md
|
|
75
|
+
echo "..." | bash .../execute.sh --target "@steve"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Target syntax
|
|
79
|
+
|
|
80
|
+
| Target | Goes to |
|
|
81
|
+
|---|---|
|
|
82
|
+
| `#general` or `general` | that channel |
|
|
83
|
+
| `C0123ABCD` | that channel by id |
|
|
84
|
+
| `D0123ABCD` | an already-open DM |
|
|
85
|
+
| `@steve` | a DM with that person |
|
|
86
|
+
| `U0123ABCD` | a DM with that user id |
|
|
87
|
+
|
|
88
|
+
Slack ids are upper-case and channel names are lower-case, which is how the
|
|
89
|
+
two are told apart. Write ids exactly as Slack shows them.
|
|
90
|
+
|
|
91
|
+
## Options
|
|
92
|
+
|
|
93
|
+
| Flag | Short | Description |
|
|
94
|
+
|---|---|---|
|
|
95
|
+
| `--target` | `-c` | Channel or person (required) |
|
|
96
|
+
| `--text` | `-m` | Message text (required unless piped or `--text-file`) |
|
|
97
|
+
| `--text-file` | | Read the text from a file |
|
|
98
|
+
| `--thread` | `-t` | Slack thread timestamp to reply inside |
|
|
99
|
+
| `--json` | `-j` | Raw JSON payload |
|
|
100
|
+
|
|
101
|
+
## Environment
|
|
102
|
+
|
|
103
|
+
- `CREWLY_SESSION_NAME` — your agent session, attached automatically. The post
|
|
104
|
+
is sent under that agent's identity, so this must be set.
|
|
105
|
+
- `CREWLY_API_URL` — defaults to `http://localhost:8787`.
|
|
106
|
+
|
|
107
|
+
## Output
|
|
108
|
+
|
|
109
|
+
On success, JSON on stdout:
|
|
110
|
+
|
|
111
|
+
```json
|
|
112
|
+
{"success":true,"channelId":"C-GEN","messageTs":"1712345678.000200","kind":"channel","postedAs":"agent"}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`postedAs` is `agent` when your own Slack bot sent it, `crewly` when the shared
|
|
116
|
+
bot did.
|
|
117
|
+
|
|
118
|
+
## Failures worth knowing
|
|
119
|
+
|
|
120
|
+
| Message contains | What to do |
|
|
121
|
+
|---|---|
|
|
122
|
+
| `No Slack channel named` | check the name, or the bot cannot see it (private channel needs an invite) |
|
|
123
|
+
| `No Slack user matches` | the handle is wrong; ask for the exact Slack handle |
|
|
124
|
+
| `invite ... into the channel` | a private channel the bot is not in; ask a human to invite it |
|
|
125
|
+
| `reinstall the app` | the Slack app is missing a scope; tell the owner |
|
|
126
|
+
| `Slack is not connected` | Slack is not configured on this install; stop, do not retry |
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# slack-post — send a Slack message on the agent's own initiative.
|
|
3
|
+
#
|
|
4
|
+
# Posts to a channel or opens a DM, under the calling agent's Slack identity
|
|
5
|
+
# (its own bot user when it has one). The shared `api_call` helper attaches
|
|
6
|
+
# `X-Agent-Session: $CREWLY_SESSION_NAME`, which the backend uses to pick that
|
|
7
|
+
# identity — without it the request is refused.
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
10
|
+
source "${SCRIPT_DIR}/../../_common/lib.sh"
|
|
11
|
+
|
|
12
|
+
print_usage() {
|
|
13
|
+
cat <<'EOF_USAGE'
|
|
14
|
+
Usage:
|
|
15
|
+
bash execute.sh --target <#channel|@user|C…|D…|U…> --text "message" [--thread <ts>]
|
|
16
|
+
|
|
17
|
+
echo "message" | bash execute.sh --target "#general"
|
|
18
|
+
bash execute.sh --target "@steve" --text-file /tmp/report.md
|
|
19
|
+
bash execute.sh '{"target":"#general","text":"hi","threadTs":"100.1"}'
|
|
20
|
+
|
|
21
|
+
Options:
|
|
22
|
+
--target | -c Channel or person (required)
|
|
23
|
+
--text | -m Message text (required unless piped or --text-file)
|
|
24
|
+
--text-file Read the message text from a file
|
|
25
|
+
--thread | -t Slack thread timestamp to reply inside
|
|
26
|
+
--json | -j Raw JSON payload
|
|
27
|
+
--help | -h Show this help
|
|
28
|
+
EOF_USAGE
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
INPUT_JSON=""
|
|
32
|
+
TARGET=""
|
|
33
|
+
TEXT=""
|
|
34
|
+
THREAD_TS=""
|
|
35
|
+
|
|
36
|
+
# Legacy JSON as the first positional argument
|
|
37
|
+
if [[ $# -gt 0 && ${1:0:1} == '{' ]]; then
|
|
38
|
+
INPUT_JSON="$1"
|
|
39
|
+
shift || true
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
while [[ $# -gt 0 ]]; do
|
|
43
|
+
case "$1" in
|
|
44
|
+
--target|-c) TARGET="$2"; shift 2 ;;
|
|
45
|
+
--text|-m) TEXT="$2"; shift 2 ;;
|
|
46
|
+
--text-file) TEXT="$(cat "$2")"; shift 2 ;;
|
|
47
|
+
--thread|-t) THREAD_TS="$2"; shift 2 ;;
|
|
48
|
+
--json|-j) INPUT_JSON="$2"; shift 2 ;;
|
|
49
|
+
--help|-h) print_usage; exit 0 ;;
|
|
50
|
+
*) echo "Unknown argument: $1" >&2; print_usage >&2; exit 2 ;;
|
|
51
|
+
esac
|
|
52
|
+
done
|
|
53
|
+
|
|
54
|
+
# Fall back to stdin for the body
|
|
55
|
+
if [ -z "$TEXT" ] && [ -z "$INPUT_JSON" ] && [ ! -t 0 ]; then
|
|
56
|
+
TEXT="$(cat)"
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
if [ -n "$INPUT_JSON" ]; then
|
|
60
|
+
EXTRACTED=$(INPUT_JSON="$INPUT_JSON" python3 -c '
|
|
61
|
+
import base64, json, os, sys
|
|
62
|
+
try:
|
|
63
|
+
d = json.loads(os.environ["INPUT_JSON"])
|
|
64
|
+
except Exception as e:
|
|
65
|
+
print("PARSE_ERROR:" + str(e)); sys.exit(0)
|
|
66
|
+
print("TARGET=" + str(d.get("target", "")))
|
|
67
|
+
print("THREAD=" + str(d.get("threadTs", d.get("thread", ""))))
|
|
68
|
+
print("TEXT_B64=" + base64.b64encode(str(d.get("text", "")).encode("utf-8")).decode("ascii"))
|
|
69
|
+
')
|
|
70
|
+
if echo "$EXTRACTED" | grep -q '^PARSE_ERROR'; then
|
|
71
|
+
echo '{"success":false,"error":"invalid JSON payload"}' >&2
|
|
72
|
+
exit 2
|
|
73
|
+
fi
|
|
74
|
+
while IFS= read -r line; do
|
|
75
|
+
case "$line" in
|
|
76
|
+
TARGET=*) [ -z "$TARGET" ] && TARGET="${line#TARGET=}" ;;
|
|
77
|
+
THREAD=*) [ -z "$THREAD_TS" ] && THREAD_TS="${line#THREAD=}" ;;
|
|
78
|
+
TEXT_B64=*) [ -z "$TEXT" ] && TEXT="$(echo "${line#TEXT_B64=}" | base64 -d 2>/dev/null)" ;;
|
|
79
|
+
esac
|
|
80
|
+
done <<< "$EXTRACTED"
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
if [ -z "$TARGET" ]; then
|
|
84
|
+
echo '{"success":false,"error":"--target is required (#channel, @user, or a Slack id)"}' >&2
|
|
85
|
+
exit 2
|
|
86
|
+
fi
|
|
87
|
+
if [ -z "$TEXT" ]; then
|
|
88
|
+
echo '{"success":false,"error":"--text is required (or pipe it via stdin)"}' >&2
|
|
89
|
+
exit 2
|
|
90
|
+
fi
|
|
91
|
+
if [ -z "${CREWLY_SESSION_NAME:-}" ]; then
|
|
92
|
+
echo '{"success":false,"error":"CREWLY_SESSION_NAME is unset — the post needs an agent identity"}' >&2
|
|
93
|
+
exit 2
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Convert literal \n to real newlines, matching the other comm skills
|
|
97
|
+
_NL=$'\n'; TEXT="${TEXT//\\n/$_NL}"
|
|
98
|
+
|
|
99
|
+
BODY=$(TARGET="$TARGET" TEXT="$TEXT" THREAD_TS="$THREAD_TS" python3 -c '
|
|
100
|
+
import json, os
|
|
101
|
+
p = {"target": os.environ["TARGET"], "text": os.environ["TEXT"]}
|
|
102
|
+
ts = os.environ.get("THREAD_TS", "")
|
|
103
|
+
if ts:
|
|
104
|
+
p["threadTs"] = ts
|
|
105
|
+
print(json.dumps(p))
|
|
106
|
+
')
|
|
107
|
+
|
|
108
|
+
if RESPONSE=$(api_call POST "/slack/post" "$BODY" 2>&1); then
|
|
109
|
+
echo "$RESPONSE" | python3 -c '
|
|
110
|
+
import json, sys
|
|
111
|
+
try:
|
|
112
|
+
d = json.load(sys.stdin).get("data") or {}
|
|
113
|
+
except Exception:
|
|
114
|
+
print("{\"success\":true}"); raise SystemExit(0)
|
|
115
|
+
print(json.dumps({
|
|
116
|
+
"success": True,
|
|
117
|
+
"channelId": d.get("channelId", ""),
|
|
118
|
+
"messageTs": d.get("messageTs", ""),
|
|
119
|
+
"kind": d.get("kind", ""),
|
|
120
|
+
"postedAs": d.get("postedAs", ""),
|
|
121
|
+
}))
|
|
122
|
+
'
|
|
123
|
+
exit 0
|
|
124
|
+
else
|
|
125
|
+
echo "{\"success\":false,\"error\":$(echo "$RESPONSE" | python3 -c 'import json,sys;print(json.dumps(sys.stdin.read()))')}"
|
|
126
|
+
exit 1
|
|
127
|
+
fi
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Remote Browser
|
|
3
|
+
description: "Drive the user's real Chrome browser through the Crewly Chrome Extension. Navigate, click, fill forms, screenshot, read text, run JS, inspect cookies/console. Each agent gets its own bound tab, so concurrent agents never fight over the active tab. Plain HTTP + bash — usable by any agent runtime, not just Claude."
|
|
4
|
+
version: 1.0.0
|
|
5
|
+
category: browser
|
|
6
|
+
skillType: claude-skill
|
|
7
|
+
assignableRoles:
|
|
8
|
+
- developer
|
|
9
|
+
- qa
|
|
10
|
+
- researcher
|
|
11
|
+
- marketing
|
|
12
|
+
triggers:
|
|
13
|
+
- remote browser
|
|
14
|
+
- drive chrome
|
|
15
|
+
- control my browser
|
|
16
|
+
- use my chrome
|
|
17
|
+
- browser automation
|
|
18
|
+
- fill the form
|
|
19
|
+
- take a screenshot of the page
|
|
20
|
+
- scrape the page
|
|
21
|
+
tags:
|
|
22
|
+
- browser
|
|
23
|
+
- chrome
|
|
24
|
+
- extension
|
|
25
|
+
- automation
|
|
26
|
+
- scraping
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
# Remote Browser
|
|
30
|
+
|
|
31
|
+
Control the user's **real, logged-in Chrome** — their sessions, their cookies,
|
|
32
|
+
their extensions — through the Crewly Chrome Extension.
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
agent → bash execute.sh → POST /api/browser/* → WebSocket → Chrome Extension → real tab
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The transport is plain HTTP from a bash script, so **any agent runtime can use
|
|
39
|
+
it** (Claude Code, Codex, Gemini CLI, a cron job). There is no MCP dependency
|
|
40
|
+
and nothing model-specific.
|
|
41
|
+
|
|
42
|
+
## Why this and not a headless browser
|
|
43
|
+
|
|
44
|
+
Use this when the task needs the user's **actual logged-in state** — an account
|
|
45
|
+
only they are signed into, a site behind SSO, a page whose content differs for
|
|
46
|
+
an authenticated user. For anything that works logged-out, a headless browser is
|
|
47
|
+
cheaper and will not disturb the user's window.
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
Two equivalent calling conventions:
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
# JSON argument
|
|
55
|
+
bash execute.sh '{"action":"navigate","url":"https://example.com"}'
|
|
56
|
+
|
|
57
|
+
# Flags
|
|
58
|
+
bash execute.sh --action navigate --url https://example.com
|
|
59
|
+
bash execute.sh -a click -s "#submit"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`bash execute.sh --help` prints the action list.
|
|
63
|
+
|
|
64
|
+
## Actions
|
|
65
|
+
|
|
66
|
+
### Page control
|
|
67
|
+
| Action | Required | Optional |
|
|
68
|
+
|---|---|---|
|
|
69
|
+
| `navigate` | `--url` | |
|
|
70
|
+
| `screenshot` | | |
|
|
71
|
+
| `full-page-screenshot` | | scrolls and stitches the whole page |
|
|
72
|
+
| `read-text` | | `--selector` (defaults to whole page) |
|
|
73
|
+
| `scroll` | | `--params` e.g. `'{"direction":"down","amount":3}'` |
|
|
74
|
+
| `scroll-in-element` | | `--params` with a selector + direction |
|
|
75
|
+
|
|
76
|
+
### Interaction
|
|
77
|
+
| Action | Required | Optional |
|
|
78
|
+
|---|---|---|
|
|
79
|
+
| `click` | `--selector` | or `--params` for coordinate clicks |
|
|
80
|
+
| `fill` | `--selector` `--value` | replaces the field's contents |
|
|
81
|
+
| `type` | `--selector` `--text` | types keystroke by keystroke |
|
|
82
|
+
| `hover` | `--selector` | |
|
|
83
|
+
| `press-key` | `--params` e.g. `'{"key":"Enter"}'` | |
|
|
84
|
+
| `select-option` | `--selector` + one of `--value` / `--params` with `label` or `index` | resolution order: value → label → index |
|
|
85
|
+
| `set-file-input` | `--params` with selector + file path | |
|
|
86
|
+
|
|
87
|
+
### Reading the page
|
|
88
|
+
| Action | Required | Optional |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `get-element` | `--selector` | |
|
|
91
|
+
| `get-interactive-elements` | | `--params` — buttons/links/inputs with refs |
|
|
92
|
+
| `search-text` | `--text` | locate text on the page |
|
|
93
|
+
| `list-options` | `--selector` | enumerate a `<select>` |
|
|
94
|
+
| `wait-for-selector` | `--selector` | blocks until it appears |
|
|
95
|
+
| `execute-js` | `--code` | alias: `execute`. Raw JS in page context |
|
|
96
|
+
|
|
97
|
+
### Browser state
|
|
98
|
+
| Action | Notes |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `tabs` | list open tabs |
|
|
101
|
+
| `cookies` | optional `?domain=` on the endpoint |
|
|
102
|
+
| `console` | recent console messages; optional `?clear=true` |
|
|
103
|
+
| `local-storage` | `--params` to scope the read |
|
|
104
|
+
| `status` | extension connection status |
|
|
105
|
+
| `instances` | connected browser instances |
|
|
106
|
+
| `proxy-connect` | manually connect the proxy to Cloud Relay |
|
|
107
|
+
|
|
108
|
+
### Tab binding
|
|
109
|
+
| Action | Notes |
|
|
110
|
+
|---|---|
|
|
111
|
+
| `bind-tab` | bind a tab to this agent; `--active` foregrounds it (default: background) |
|
|
112
|
+
| `unbind-tab` | release the tab and close it |
|
|
113
|
+
|
|
114
|
+
## Per-agent tab binding
|
|
115
|
+
|
|
116
|
+
This is what makes the skill safe to run from several agents at once.
|
|
117
|
+
|
|
118
|
+
When `CREWLY_SESSION_NAME` is set in the agent's environment it is forwarded as
|
|
119
|
+
the `X-Agent-Session` header, and the backend dispatches each command to **that
|
|
120
|
+
agent's own tab** instead of whatever tab the user is looking at.
|
|
121
|
+
|
|
122
|
+
- The first command from a fresh agent auto-binds a new background tab.
|
|
123
|
+
- The resulting id is cached at
|
|
124
|
+
`~/.crewly/runtime/<agentSession>/browser-tab-id`, so later calls skip the
|
|
125
|
+
bind round-trip.
|
|
126
|
+
- Concurrent agents therefore never steal each other's page — and never yank
|
|
127
|
+
the user's foreground tab out from under them.
|
|
128
|
+
|
|
129
|
+
Escape hatches:
|
|
130
|
+
|
|
131
|
+
| Flag | Effect |
|
|
132
|
+
|---|---|
|
|
133
|
+
| `--tab-id <n>` | pin one call to a specific tab (tests, debugging) |
|
|
134
|
+
| `--no-bind` | drop the session header and use the legacy active-tab path |
|
|
135
|
+
| `--active` | with `bind-tab`, open the tab in the foreground |
|
|
136
|
+
|
|
137
|
+
With `CREWLY_SESSION_NAME` unset, behaviour falls back to the legacy active-tab
|
|
138
|
+
path, so scripts written before per-tab dispatch keep working unchanged.
|
|
139
|
+
|
|
140
|
+
## Examples
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
# Read a page that requires the user's login
|
|
144
|
+
bash execute.sh -a navigate -u "https://app.example.com/reports"
|
|
145
|
+
bash execute.sh -a wait-for-selector -s ".report-table"
|
|
146
|
+
bash execute.sh -a read-text -s ".report-table"
|
|
147
|
+
|
|
148
|
+
# Fill and submit a form
|
|
149
|
+
bash execute.sh -a fill -s "#email" -v "someone@example.com"
|
|
150
|
+
bash execute.sh -a type -s "#note" -t "Following up on the quote"
|
|
151
|
+
bash execute.sh -a click -s "button[type=submit]"
|
|
152
|
+
|
|
153
|
+
# Pull structured data out of the DOM
|
|
154
|
+
bash execute.sh -a execute-js -c '[...document.querySelectorAll(".row")].map(r=>r.innerText)'
|
|
155
|
+
|
|
156
|
+
# Explicit lifecycle when doing a long multi-step job
|
|
157
|
+
bash execute.sh -a bind-tab
|
|
158
|
+
# ... many commands ...
|
|
159
|
+
bash execute.sh -a unbind-tab
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Prerequisites
|
|
163
|
+
|
|
164
|
+
- Crewly backend running, with the Chrome Extension connected
|
|
165
|
+
(`bash execute.sh -a status` to confirm)
|
|
166
|
+
- `curl` and `jq` in PATH
|
|
167
|
+
|
|
168
|
+
## Cautions
|
|
169
|
+
|
|
170
|
+
- **This is the user's real browser.** Actions have real effects under their
|
|
171
|
+
real identity: a click can send a message, place an order, or delete
|
|
172
|
+
something. Confirm before anything irreversible or outward-facing.
|
|
173
|
+
- Never enter passwords, card numbers, or other credentials — ask the user to
|
|
174
|
+
do it themselves in their own window.
|
|
175
|
+
- Avoid clicking elements that raise native `alert()` / `confirm()` dialogs:
|
|
176
|
+
they block the extension until dismissed by hand.
|
|
177
|
+
- Always `unbind-tab` when a job is done, or abandoned tabs accumulate in the
|
|
178
|
+
user's window.
|
|
@@ -1,29 +1,37 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: xiaoyuzhoufm-transcript
|
|
3
|
-
description: Extract and transcribe 小宇宙 (Xiaoyuzhou FM) podcast episodes.
|
|
3
|
+
description: Extract and transcribe 小宇宙 (Xiaoyuzhou FM) podcast episodes. Resolves an episode URL to its audio, then transcribes with Whisper via the transcribe-audio skill — local whisper.cpp by default (free, offline), OpenAI Whisper API as fallback. Segment-level timestamps.
|
|
4
4
|
category: content
|
|
5
5
|
assignableRoles:
|
|
6
6
|
- "*"
|
|
7
|
-
version: "
|
|
7
|
+
version: "2.0.0"
|
|
8
8
|
tags:
|
|
9
9
|
- podcast
|
|
10
10
|
- transcript
|
|
11
11
|
- audio
|
|
12
|
-
-
|
|
12
|
+
- whisper
|
|
13
13
|
- xiaoyuzhou
|
|
14
14
|
- chinese
|
|
15
15
|
---
|
|
16
16
|
|
|
17
17
|
# 小宇宙 Podcast Transcript
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
Turn a 小宇宙 episode URL into a timestamped transcript.
|
|
20
20
|
|
|
21
21
|
## Pipeline
|
|
22
22
|
|
|
23
23
|
```
|
|
24
|
-
Episode URL → Fetch HTML → Extract audio URL → Download m4a
|
|
24
|
+
Episode URL → Fetch HTML → Extract audio URL → Download m4a
|
|
25
|
+
↓
|
|
26
|
+
transcribe-audio (Whisper) → Markdown + JSON
|
|
25
27
|
```
|
|
26
28
|
|
|
29
|
+
This skill owns the 小宇宙 half — resolving an episode page to its audio and
|
|
30
|
+
labelling the result. Transcription is delegated to the `transcribe-audio`
|
|
31
|
+
skill, so there is one Whisper integration in the repo rather than two, and
|
|
32
|
+
this skill inherits its engine selection, normalization and long-file handling
|
|
33
|
+
for free.
|
|
34
|
+
|
|
27
35
|
## Usage
|
|
28
36
|
|
|
29
37
|
```bash
|
|
@@ -36,8 +44,12 @@ bash execute.sh '{"url":"https://www.xiaoyuzhoufm.com/episode/...","outputFile":
|
|
|
36
44
|
# Transcribe a local audio file (skip download)
|
|
37
45
|
bash execute.sh '{"audioFile":"/path/to/podcast.m4a"}'
|
|
38
46
|
|
|
39
|
-
#
|
|
40
|
-
bash execute.sh '{"url":"...","language":"
|
|
47
|
+
# Language hint (ISO-639-1) — helps on mixed Chinese/English episodes
|
|
48
|
+
bash execute.sh '{"url":"...","language":"zh"}'
|
|
49
|
+
|
|
50
|
+
# Force an engine
|
|
51
|
+
bash execute.sh '{"url":"...","engine":"local"}'
|
|
52
|
+
bash execute.sh '{"url":"...","engine":"openai"}'
|
|
41
53
|
```
|
|
42
54
|
|
|
43
55
|
## Parameters
|
|
@@ -47,7 +59,8 @@ bash execute.sh '{"url":"...","language":"Chinese"}'
|
|
|
47
59
|
| `url` | Yes* | 小宇宙 episode URL |
|
|
48
60
|
| `audioFile` | Yes* | Path to local audio file (alternative to url) |
|
|
49
61
|
| `outputFile` | No | Save transcript as markdown to this path |
|
|
50
|
-
| `language` | No | Language hint
|
|
62
|
+
| `language` | No | Language hint, ISO-639-1 (`zh`, `en`, `ja`…). Default: auto-detect |
|
|
63
|
+
| `engine` | No | `auto` (default), `local`, or `openai` — passed to `transcribe-audio` |
|
|
51
64
|
|
|
52
65
|
*Either `url` or `audioFile` is required.
|
|
53
66
|
|
|
@@ -58,28 +71,39 @@ bash execute.sh '{"url":"...","language":"Chinese"}'
|
|
|
58
71
|
"success": true,
|
|
59
72
|
"title": "Episode Title",
|
|
60
73
|
"url": "https://www.xiaoyuzhoufm.com/episode/...",
|
|
61
|
-
"audioUrl": "https://media.xyzcdn.net
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
74
|
+
"audioUrl": "https://media.xyzcdn.net/...",
|
|
75
|
+
"engine": "whisper.cpp",
|
|
76
|
+
"language": "zh",
|
|
77
|
+
"duration": 4437,
|
|
78
|
+
"transcriptLength": 41234,
|
|
79
|
+
"transcript": "[00:00:00] ...\n[00:00:07] ..."
|
|
65
80
|
}
|
|
66
81
|
```
|
|
67
82
|
|
|
68
83
|
## Transcript Format
|
|
69
84
|
|
|
70
|
-
-
|
|
71
|
-
-
|
|
72
|
-
- Preserves original language (Chinese/English/mixed)
|
|
85
|
+
- One line per segment, prefixed `[HH:MM:SS]`
|
|
86
|
+
- Original language preserved (Chinese / English / mixed)
|
|
73
87
|
|
|
74
88
|
## Prerequisites
|
|
75
89
|
|
|
76
|
-
- `
|
|
77
|
-
- `
|
|
78
|
-
-
|
|
90
|
+
- `curl` and `jq` in PATH
|
|
91
|
+
- Whatever `transcribe-audio` needs: `ffmpeg`, plus either a local whisper.cpp
|
|
92
|
+
install (`whisper-cli` + a `ggml-*` model) or `OPENAI_API_KEY` for the fallback
|
|
93
|
+
- Internet access to xiaoyuzhoufm.com (and to the OpenAI API only if the local
|
|
94
|
+
engine is unavailable)
|
|
95
|
+
|
|
96
|
+
**No Gemini key is required.** On the default local path the transcription runs
|
|
97
|
+
entirely offline at zero per-use cost.
|
|
79
98
|
|
|
80
99
|
## Notes
|
|
81
100
|
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
|
|
85
|
-
- Temp files are auto-cleaned on exit
|
|
101
|
+
- Episodes are typically 30–90 minutes (20–80 MB)
|
|
102
|
+
- Local whisper.cpp roughly tracks real time on Apple Silicon; a 75-minute
|
|
103
|
+
episode takes on the order of ten minutes
|
|
104
|
+
- Temp files (page HTML, downloaded audio) are auto-cleaned on exit — including
|
|
105
|
+
on interrupt, so a killed run leaves nothing behind and also keeps nothing
|
|
106
|
+
to resume from
|
|
107
|
+
- **No speaker identification.** The previous Gemini-based version labelled
|
|
108
|
+
speaker turns; Whisper does not do diarization, so output is timestamped
|
|
109
|
+
segments only
|