crewly 1.15.0 → 1.17.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/README.md +39 -5
- package/config/roles/developer/prompt.md +1 -1
- package/config/roles/orchestrator/prompt.md +20 -5
- package/config/runtime_scripts/runtime-config.json +7 -0
- package/config/skills/agent/core/calendar-create/SKILL.md +62 -0
- package/config/skills/agent/core/calendar-create/execute.sh +91 -0
- package/config/skills/agent/core/calendar-create/execute.test.sh +80 -0
- package/config/skills/agent/core/calendar-list/SKILL.md +58 -0
- package/config/skills/agent/core/calendar-list/execute.sh +88 -0
- package/config/skills/agent/core/calendar-list/execute.test.sh +71 -0
- package/config/skills/agent/core/count-json/SKILL.md +61 -0
- package/config/skills/agent/core/count-json/execute.sh +52 -0
- package/config/skills/agent/core/count-json/execute.test.sh +35 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +61 -0
- package/config/skills/agent/core/gmail-read/execute.sh +62 -0
- package/config/skills/agent/core/gmail-read/execute.test.sh +68 -0
- package/config/skills/agent/core/gmail-search/SKILL.md +64 -0
- package/config/skills/agent/core/gmail-search/execute.sh +70 -0
- package/config/skills/agent/core/gmail-search/execute.test.sh +67 -0
- package/config/skills/agent/core/gmail-send/SKILL.md +69 -0
- package/config/skills/agent/core/gmail-send/execute.sh +114 -0
- package/config/skills/agent/core/gmail-send/execute.test.sh +83 -0
- package/config/skills/agent/core/record-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/record-prediction/execute.sh +90 -0
- package/config/skills/agent/core/record-prediction/execute.test.sh +67 -0
- package/config/skills/agent/core/resolve-prediction/SKILL.md +61 -0
- package/config/skills/agent/core/resolve-prediction/execute.sh +87 -0
- package/config/skills/agent/core/resolve-prediction/execute.test.sh +74 -0
- package/config/skills/agent/core/set-focus/SKILL.md +64 -0
- package/config/skills/agent/core/set-focus/execute.sh +73 -0
- package/config/skills/agent/core/set-focus/execute.test.sh +67 -0
- package/config/skills/agent/core/suppress-noise/SKILL.md +59 -0
- package/config/skills/agent/core/suppress-noise/execute.sh +68 -0
- package/config/skills/agent/core/suppress-noise/execute.test.sh +58 -0
- package/config/skills/orchestrator/list-missions/SKILL.md +47 -0
- package/config/skills/orchestrator/list-missions/execute.sh +34 -0
- package/config/skills/orchestrator/list-missions/execute.test.sh +33 -0
- package/config/slack-master-app-manifest.json +64 -0
- package/dist/backend/backend/src/constants.d.ts +186 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +196 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts +76 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js +262 -0
- package/dist/backend/backend/src/controllers/agent-self-improvement/agent-self-improvement.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js +3 -1
- package/dist/backend/backend/src/controllers/cloud/cloud.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +100 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js +293 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts +26 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js +38 -0
- package/dist/backend/backend/src/controllers/google/google.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js +31 -0
- package/dist/backend/backend/src/controllers/oauth/oauth.routes.js.map +1 -1
- package/dist/backend/backend/src/controllers/request-types.d.ts +6 -2
- package/dist/backend/backend/src/controllers/request-types.d.ts.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 +209 -2
- package/dist/backend/backend/src/controllers/slack/slack.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/team/team.controller.js +4 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +92 -8
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +10 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +10 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +32 -4
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/backend/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
- package/dist/backend/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/backend/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/backend/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js +45 -0
- package/dist/backend/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/backend/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/backend/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts +137 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js +216 -0
- package/dist/backend/backend/src/services/ai/self-improvement/consolidation-scheduler.service.js.map +1 -0
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +4 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js +3 -1
- package/dist/backend/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts +8 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js +25 -0
- package/dist/backend/backend/src/services/cloud/cloud-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/backend/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/backend/backend/src/services/google/calendar.service.d.ts +98 -0
- package/dist/backend/backend/src/services/google/calendar.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/calendar.service.js +125 -0
- package/dist/backend/backend/src/services/google/calendar.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +165 -0
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/gmail.service.js +296 -0
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts +44 -0
- package/dist/backend/backend/src/services/google/google-api.client.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-api.client.js +104 -0
- package/dist/backend/backend/src/services/google/google-api.client.js.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts +159 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js +274 -0
- package/dist/backend/backend/src/services/google/google-workspace-token.service.js.map +1 -0
- package/dist/backend/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/backend/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts +10 -1
- package/dist/backend/backend/src/services/runtime-adapter.d.ts.map +1 -1
- package/dist/backend/backend/src/services/runtime-adapter.js +12 -1
- package/dist/backend/backend/src/services/runtime-adapter.js.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/settings/settings.service.js +1 -0
- package/dist/backend/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/backend/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts +186 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js +409 -0
- package/dist/backend/backend/src/services/slack/slack-cloud-config.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts +95 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-initializer.js +284 -4
- package/dist/backend/backend/src/services/slack/slack-initializer.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts +178 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js +392 -0
- package/dist/backend/backend/src/services/slack/slack-instance-registry.service.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack.service.d.ts +76 -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 +234 -47
- package/dist/backend/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts +78 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js +129 -0
- package/dist/backend/backend/src/services/v3/fallback-trigger-cleanup.subscriber.js.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts +117 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js +214 -0
- package/dist/backend/backend/src/services/v3/kr-skill-measurer.service.js.map +1 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts +6 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js +33 -0
- package/dist/backend/backend/src/services/v3/mission-reminder.service.js.map +1 -1
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts +116 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js +254 -0
- package/dist/backend/backend/src/services/v3/okr-owner-guidance.service.js.map +1 -0
- package/dist/backend/backend/src/types/index.d.ts +11 -1
- package/dist/backend/backend/src/types/index.d.ts.map +1 -1
- package/dist/backend/backend/src/types/index.js.map +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts +1 -1
- package/dist/backend/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/settings.types.js +7 -0
- package/dist/backend/backend/src/types/settings.types.js.map +1 -1
- package/dist/backend/backend/src/types/slack.types.d.ts +141 -2
- 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/backend/src/types/team-template.types.d.ts +2 -2
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/backend/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/backend/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/backend/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +186 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +196 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +10 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +32 -4
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts +114 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js +185 -0
- package/dist/cli/backend/src/services/agent/opencode-runtime.service.js.map +1 -0
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js +22 -1
- package/dist/cli/backend/src/services/agent/runtime-agent.service.abstract.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js +15 -3
- package/dist/cli/backend/src/services/agent/runtime-exit-monitor.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js +9 -0
- package/dist/cli/backend/src/services/agent/runtime-service.factory.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts +23 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js +45 -0
- package/dist/cli/backend/src/services/ai/prompt-builder.service.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts +43 -3
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js +85 -4
- package/dist/cli/backend/src/services/ai/prompt-modules/memory-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts +2 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/prompt-module.interface.js.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.d.ts.map +1 -1
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js +6 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts +45 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js +59 -0
- package/dist/cli/backend/src/services/ai/self-improvement/agent-memory-provider.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts +74 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js +132 -0
- package/dist/cli/backend/src/services/ai/self-improvement/attention.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts +107 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js +183 -0
- package/dist/cli/backend/src/services/ai/self-improvement/memory-consolidation.service.js.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts +100 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js +130 -0
- package/dist/cli/backend/src/services/ai/self-improvement/prediction-calibration.service.js.map +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js +1 -0
- package/dist/cli/backend/src/services/cloud/cloud-sync.types.js.map +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.d.ts +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js +1 -1
- package/dist/cli/backend/src/services/mcp-tool-definitions.js.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/settings/settings.service.js +1 -0
- package/dist/cli/backend/src/services/settings/settings.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts +12 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js +30 -0
- package/dist/cli/backend/src/services/slack/slack-agent-identity.service.js.map +1 -1
- package/dist/cli/backend/src/services/slack/slack.service.d.ts +76 -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 +234 -47
- package/dist/cli/backend/src/services/slack/slack.service.js.map +1 -1
- package/dist/cli/backend/src/types/index.d.ts +11 -1
- package/dist/cli/backend/src/types/index.d.ts.map +1 -1
- package/dist/cli/backend/src/types/index.js.map +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts +1 -1
- package/dist/cli/backend/src/types/settings.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/settings.types.js +7 -0
- package/dist/cli/backend/src/types/settings.types.js.map +1 -1
- package/dist/cli/backend/src/types/slack.types.d.ts +141 -2
- 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/types/team-template.types.d.ts +2 -2
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.d.ts +2 -0
- package/dist/cli/backend/src/types/v2/mission.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/mission.types.js.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts +2 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.d.ts.map +1 -1
- package/dist/cli/backend/src/utils/terminal-string-ops.js +14 -0
- package/dist/cli/backend/src/utils/terminal-string-ops.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard.d.ts +2 -2
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +15 -7
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/frontend/dist/assets/{index-203224f9.js → index-c87332bf.js} +278 -278
- package/frontend/dist/assets/index-f6b4230e.css +42 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/index-dcaf6c88.css +0 -42
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fallback Trigger Cleanup — cancels a delegation's "fallback check" timer
|
|
3
|
+
* the moment the delegated WorkItem reaches a terminal status.
|
|
4
|
+
*
|
|
5
|
+
* `delegate-task` arms a one-shot time trigger named
|
|
6
|
+
* `fallback-<target>-<wi8>` whose action creates a self-targeted "Fallback
|
|
7
|
+
* check on <target> for task <wi8>" WorkItem for the orchestrator. Nothing
|
|
8
|
+
* ever cancelled it, so on steamfun-ops it fired after every delegation
|
|
9
|
+
* whether the work was long verified or not: 26 of 65 real WorkItems in
|
|
10
|
+
* three days were these checks, each one a full orchestrator turn
|
|
11
|
+
* (2026-09-18). The skill's default was raised to 2 h; this subscriber
|
|
12
|
+
* removes the timer as soon as the work is done, verified or cancelled so it
|
|
13
|
+
* never fires for finished work at all.
|
|
14
|
+
*
|
|
15
|
+
* @module services/v3/fallback-trigger-cleanup.subscriber
|
|
16
|
+
*/
|
|
17
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
18
|
+
import { formatError } from '../../utils/format-error.js';
|
|
19
|
+
import { TriggerEngine } from './trigger-engine.service.js';
|
|
20
|
+
/** Events after which a delegation's fallback timer is pointless. */
|
|
21
|
+
export const FALLBACK_CLEANUP_EVENTS = [
|
|
22
|
+
'task:done',
|
|
23
|
+
'task:verified',
|
|
24
|
+
'task:cancelled',
|
|
25
|
+
];
|
|
26
|
+
/** Length of the WorkItem-id prefix `delegate-task` puts in the trigger name. */
|
|
27
|
+
const WI_ID_PREFIX_LENGTH = 8;
|
|
28
|
+
/**
|
|
29
|
+
* Name `delegate-task` gives the fallback timer for a WorkItem.
|
|
30
|
+
*
|
|
31
|
+
* @param workItemId - Full WorkItem id
|
|
32
|
+
* @param target - Session the work was delegated to
|
|
33
|
+
* @returns The trigger name
|
|
34
|
+
*/
|
|
35
|
+
export function fallbackTriggerName(workItemId, target) {
|
|
36
|
+
return `fallback-${target}-${workItemId.slice(0, WI_ID_PREFIX_LENGTH)}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether a trigger is the fallback timer for the given WorkItem, regardless
|
|
40
|
+
* of target (the event may not carry the target session).
|
|
41
|
+
*
|
|
42
|
+
* @param trigger - Candidate trigger
|
|
43
|
+
* @param workItemId - Full WorkItem id
|
|
44
|
+
* @returns True when the name matches `fallback-*-<wi8>`
|
|
45
|
+
*/
|
|
46
|
+
export function isFallbackTriggerFor(trigger, workItemId) {
|
|
47
|
+
const name = trigger.name ?? '';
|
|
48
|
+
return name.startsWith('fallback-') && name.endsWith(`-${workItemId.slice(0, WI_ID_PREFIX_LENGTH)}`);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Subscribes to task terminal events and cancels matching fallback timers.
|
|
52
|
+
*/
|
|
53
|
+
export class FallbackTriggerCleanupSubscriber {
|
|
54
|
+
logger;
|
|
55
|
+
eventBus;
|
|
56
|
+
triggers;
|
|
57
|
+
unsubscribers = [];
|
|
58
|
+
started = false;
|
|
59
|
+
constructor(deps) {
|
|
60
|
+
this.logger = LoggerService.getInstance().createComponentLogger('FallbackTriggerCleanup');
|
|
61
|
+
this.eventBus = deps.eventBus;
|
|
62
|
+
this.triggers = deps.triggers;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Production wiring.
|
|
66
|
+
*
|
|
67
|
+
* @param eventBus - The process event bus
|
|
68
|
+
* @returns A subscriber bound to the trigger engine singleton
|
|
69
|
+
*/
|
|
70
|
+
static boot(eventBus) {
|
|
71
|
+
return new FallbackTriggerCleanupSubscriber({ eventBus, triggers: TriggerEngine.getInstance() });
|
|
72
|
+
}
|
|
73
|
+
/** Subscribe. Idempotent. */
|
|
74
|
+
start() {
|
|
75
|
+
if (this.started)
|
|
76
|
+
return;
|
|
77
|
+
this.started = true;
|
|
78
|
+
for (const eventType of FALLBACK_CLEANUP_EVENTS) {
|
|
79
|
+
this.unsubscribers.push(this.eventBus.onInProcess(eventType, (e) => {
|
|
80
|
+
void this.handle(e).catch((err) => {
|
|
81
|
+
this.logger.warn('Fallback trigger cleanup failed', { eventType, error: formatError(err) });
|
|
82
|
+
});
|
|
83
|
+
}));
|
|
84
|
+
}
|
|
85
|
+
this.logger.info('FallbackTriggerCleanup subscribed', { eventTypes: [...FALLBACK_CLEANUP_EVENTS] });
|
|
86
|
+
}
|
|
87
|
+
/** Unsubscribe. Safe to call twice. */
|
|
88
|
+
stop() {
|
|
89
|
+
for (const u of this.unsubscribers) {
|
|
90
|
+
try {
|
|
91
|
+
u();
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// ignore
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
this.unsubscribers = [];
|
|
98
|
+
this.started = false;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Cancel every live fallback timer for the event's WorkItem.
|
|
102
|
+
*
|
|
103
|
+
* @param event - A task terminal event
|
|
104
|
+
* @returns Number of triggers cancelled
|
|
105
|
+
*/
|
|
106
|
+
async handle(event) {
|
|
107
|
+
const workItemId = event.workItemId;
|
|
108
|
+
if (!workItemId)
|
|
109
|
+
return 0;
|
|
110
|
+
let cancelled = 0;
|
|
111
|
+
for (const trigger of this.triggers.list()) {
|
|
112
|
+
if (trigger.status !== 'active' && trigger.status !== 'paused')
|
|
113
|
+
continue;
|
|
114
|
+
if (!isFallbackTriggerFor(trigger, workItemId))
|
|
115
|
+
continue;
|
|
116
|
+
if (await this.triggers.cancel(trigger.id)) {
|
|
117
|
+
cancelled += 1;
|
|
118
|
+
this.logger.info('Cancelled fallback timer for finished WorkItem', {
|
|
119
|
+
workItemId,
|
|
120
|
+
triggerId: trigger.id,
|
|
121
|
+
name: trigger.name,
|
|
122
|
+
event: event.type,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return cancelled;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=fallback-trigger-cleanup.subscriber.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fallback-trigger-cleanup.subscriber.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/fallback-trigger-cleanup.subscriber.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KR Skill Measurer — fills `measurementSource: 'skill_output'` Key Results
|
|
3
|
+
* from a skill's JSON output.
|
|
4
|
+
*
|
|
5
|
+
* Until 2026-09-18 a KR's value had exactly three ways to change and all of
|
|
6
|
+
* them were a hand-made API call, so "tickets waiting for acceptance" or
|
|
7
|
+
* "build pass rate" could only be tracked by someone remembering to type the
|
|
8
|
+
* number in. A KR configured as
|
|
9
|
+
*
|
|
10
|
+
* ```json
|
|
11
|
+
* { "measurementSource": "skill_output",
|
|
12
|
+
* "measurementConfig": { "skill": "steamfun-ticket-count",
|
|
13
|
+
* "args": { "status": "review" },
|
|
14
|
+
* "jsonPath": ".count" } }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* is now measured on every mission sweep: the named skill's `execute.sh` is
|
|
18
|
+
* run with the JSON args, the number at `jsonPath` is read from its stdout
|
|
19
|
+
* and recorded as a measurement (deduped when unchanged since the last one).
|
|
20
|
+
*
|
|
21
|
+
* Safety: `skill` is a bare name (`[a-z0-9-]`) resolved against the known
|
|
22
|
+
* skill roots only — never a path — and runs with a hard timeout and a
|
|
23
|
+
* bounded output size. This is the same trust boundary as an agent running
|
|
24
|
+
* the skill itself, not a new one.
|
|
25
|
+
*
|
|
26
|
+
* @module services/v3/kr-skill-measurer.service
|
|
27
|
+
*/
|
|
28
|
+
import { KRTrackingService } from './kr-tracking.service.js';
|
|
29
|
+
import type { KeyResult } from '../../types/v2/key-result.types.js';
|
|
30
|
+
/** Shape of `measurementConfig` for a `skill_output` KR. */
|
|
31
|
+
export interface SkillOutputMeasurementConfig {
|
|
32
|
+
/** Bare skill directory name, e.g. `steamfun-ticket-count`. */
|
|
33
|
+
skill: string;
|
|
34
|
+
/** JSON object passed to the skill as its single argument. */
|
|
35
|
+
args?: Record<string, unknown>;
|
|
36
|
+
/** Dot path into the skill's JSON stdout, e.g. `.count` or `.data.total`. Default `.value`. */
|
|
37
|
+
jsonPath?: string;
|
|
38
|
+
}
|
|
39
|
+
/** What one measurement attempt produced. */
|
|
40
|
+
export interface SkillMeasurementOutcome {
|
|
41
|
+
krId: string;
|
|
42
|
+
status: 'recorded' | 'unchanged' | 'skipped' | 'failed';
|
|
43
|
+
value?: number;
|
|
44
|
+
reason?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Runs a resolved skill and returns its stdout. Injectable for tests. */
|
|
47
|
+
export type SkillRunner = (executePath: string, argsJson: string, timeoutMs: number) => Promise<string>;
|
|
48
|
+
/**
|
|
49
|
+
* Default runner: `bash <execute.sh> '<json>'` with a timeout and output cap.
|
|
50
|
+
*
|
|
51
|
+
* @param executePath - Absolute path of the skill's execute.sh
|
|
52
|
+
* @param argsJson - JSON argument string
|
|
53
|
+
* @param timeoutMs - Kill the skill after this long
|
|
54
|
+
* @returns stdout
|
|
55
|
+
*/
|
|
56
|
+
export declare const defaultSkillRunner: SkillRunner;
|
|
57
|
+
/**
|
|
58
|
+
* Read a dot path (`.a.b.c`, leading dot optional) out of parsed JSON.
|
|
59
|
+
*
|
|
60
|
+
* @param value - Parsed JSON
|
|
61
|
+
* @param jsonPath - Dot path
|
|
62
|
+
* @returns The value at the path, or undefined
|
|
63
|
+
*/
|
|
64
|
+
export declare function readJsonPath(value: unknown, jsonPath: string): unknown;
|
|
65
|
+
/**
|
|
66
|
+
* Coerce a skill output value to a number: numbers as is, booleans to 1/0,
|
|
67
|
+
* numeric strings parsed. Anything else is undefined.
|
|
68
|
+
*
|
|
69
|
+
* @param raw - Value read from the skill output
|
|
70
|
+
* @returns A finite number or undefined
|
|
71
|
+
*/
|
|
72
|
+
export declare function coerceMeasurement(raw: unknown): number | undefined;
|
|
73
|
+
/**
|
|
74
|
+
* Measures `skill_output` Key Results by running their skill.
|
|
75
|
+
*/
|
|
76
|
+
export declare class KRSkillMeasurerService {
|
|
77
|
+
private static instance;
|
|
78
|
+
private readonly logger;
|
|
79
|
+
private readonly runner;
|
|
80
|
+
private readonly skillRoots;
|
|
81
|
+
private readonly krTracking;
|
|
82
|
+
/**
|
|
83
|
+
* @param opts - Test seams: skill roots to search, a runner, a KR service
|
|
84
|
+
*/
|
|
85
|
+
constructor(opts?: {
|
|
86
|
+
skillRoots?: string[];
|
|
87
|
+
runner?: SkillRunner;
|
|
88
|
+
krTracking?: KRTrackingService;
|
|
89
|
+
projectRoot?: string;
|
|
90
|
+
});
|
|
91
|
+
static getInstance(): KRSkillMeasurerService;
|
|
92
|
+
static setInstance(next: KRSkillMeasurerService | null): void;
|
|
93
|
+
/**
|
|
94
|
+
* Resolve a bare skill name to its `execute.sh`, searching the known roots.
|
|
95
|
+
*
|
|
96
|
+
* @param skill - Bare directory name
|
|
97
|
+
* @returns Absolute path, or null when the name is invalid or not found
|
|
98
|
+
*/
|
|
99
|
+
resolveSkill(skill: string): string | null;
|
|
100
|
+
/**
|
|
101
|
+
* Measure every `skill_output` KR of a mission. Failure-soft: one KR's
|
|
102
|
+
* error never stops the others, and nothing throws to the sweep.
|
|
103
|
+
*
|
|
104
|
+
* @param missionId - Mission whose KRs to measure
|
|
105
|
+
* @returns One outcome per skill_output KR
|
|
106
|
+
*/
|
|
107
|
+
measureMission(missionId: string): Promise<SkillMeasurementOutcome[]>;
|
|
108
|
+
/**
|
|
109
|
+
* Measure one KR. Exposed for the manual `POST …/measure-now` path.
|
|
110
|
+
*
|
|
111
|
+
* @param missionId - Owning mission
|
|
112
|
+
* @param kr - The KR (must be `skill_output`)
|
|
113
|
+
* @returns The outcome
|
|
114
|
+
*/
|
|
115
|
+
measureOne(missionId: string, kr: KeyResult): Promise<SkillMeasurementOutcome>;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=kr-skill-measurer.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kr-skill-measurer.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/kr-skill-measurer.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAOH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAGpE,4DAA4D;AAC5D,MAAM,WAAW,4BAA4B;IAC3C,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,6CAA6C;AAC7C,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;IACxD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,0EAA0E;AAC1E,MAAM,MAAM,WAAW,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAIxG;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,EAAE,WAa7B,CAAC;AAEL;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQtE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAQlE;AAED;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAc;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAW;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C;;OAEG;gBACS,IAAI,GAAE;QAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAO;IAe5H,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAK5C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,sBAAsB,GAAG,IAAI,GAAG,IAAI;IAI7D;;;;;OAKG;IACH,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAS1C;;;;;;OAMG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAmB3E;;;;;;OAMG;IACG,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAuCrF"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KR Skill Measurer — fills `measurementSource: 'skill_output'` Key Results
|
|
3
|
+
* from a skill's JSON output.
|
|
4
|
+
*
|
|
5
|
+
* Until 2026-09-18 a KR's value had exactly three ways to change and all of
|
|
6
|
+
* them were a hand-made API call, so "tickets waiting for acceptance" or
|
|
7
|
+
* "build pass rate" could only be tracked by someone remembering to type the
|
|
8
|
+
* number in. A KR configured as
|
|
9
|
+
*
|
|
10
|
+
* ```json
|
|
11
|
+
* { "measurementSource": "skill_output",
|
|
12
|
+
* "measurementConfig": { "skill": "steamfun-ticket-count",
|
|
13
|
+
* "args": { "status": "review" },
|
|
14
|
+
* "jsonPath": ".count" } }
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* is now measured on every mission sweep: the named skill's `execute.sh` is
|
|
18
|
+
* run with the JSON args, the number at `jsonPath` is read from its stdout
|
|
19
|
+
* and recorded as a measurement (deduped when unchanged since the last one).
|
|
20
|
+
*
|
|
21
|
+
* Safety: `skill` is a bare name (`[a-z0-9-]`) resolved against the known
|
|
22
|
+
* skill roots only — never a path — and runs with a hard timeout and a
|
|
23
|
+
* bounded output size. This is the same trust boundary as an agent running
|
|
24
|
+
* the skill itself, not a new one.
|
|
25
|
+
*
|
|
26
|
+
* @module services/v3/kr-skill-measurer.service
|
|
27
|
+
*/
|
|
28
|
+
import { execFile } from 'child_process';
|
|
29
|
+
import * as fs from 'fs';
|
|
30
|
+
import * as os from 'os';
|
|
31
|
+
import * as path from 'path';
|
|
32
|
+
import { LoggerService } from '../core/logger.service.js';
|
|
33
|
+
import { KRTrackingService } from './kr-tracking.service.js';
|
|
34
|
+
import { KR_SKILL_MEASURER_CONSTANTS } from '../../constants.js';
|
|
35
|
+
const SKILL_NAME_RE = /^[a-z0-9][a-z0-9-]{0,63}$/;
|
|
36
|
+
/**
|
|
37
|
+
* Default runner: `bash <execute.sh> '<json>'` with a timeout and output cap.
|
|
38
|
+
*
|
|
39
|
+
* @param executePath - Absolute path of the skill's execute.sh
|
|
40
|
+
* @param argsJson - JSON argument string
|
|
41
|
+
* @param timeoutMs - Kill the skill after this long
|
|
42
|
+
* @returns stdout
|
|
43
|
+
*/
|
|
44
|
+
export const defaultSkillRunner = (executePath, argsJson, timeoutMs) => new Promise((resolve, reject) => {
|
|
45
|
+
execFile('bash', [executePath, argsJson], {
|
|
46
|
+
timeout: timeoutMs,
|
|
47
|
+
maxBuffer: KR_SKILL_MEASURER_CONSTANTS.MAX_OUTPUT_BYTES,
|
|
48
|
+
cwd: path.dirname(executePath),
|
|
49
|
+
env: { ...process.env, CREWLY_SKILL_FULL_OUTPUT: '1' },
|
|
50
|
+
}, (err, stdout) => (err ? reject(err) : resolve(String(stdout))));
|
|
51
|
+
});
|
|
52
|
+
/**
|
|
53
|
+
* Read a dot path (`.a.b.c`, leading dot optional) out of parsed JSON.
|
|
54
|
+
*
|
|
55
|
+
* @param value - Parsed JSON
|
|
56
|
+
* @param jsonPath - Dot path
|
|
57
|
+
* @returns The value at the path, or undefined
|
|
58
|
+
*/
|
|
59
|
+
export function readJsonPath(value, jsonPath) {
|
|
60
|
+
const parts = jsonPath.replace(/^\./, '').split('.').filter(Boolean);
|
|
61
|
+
let cur = value;
|
|
62
|
+
for (const part of parts) {
|
|
63
|
+
if (cur === null || typeof cur !== 'object')
|
|
64
|
+
return undefined;
|
|
65
|
+
cur = cur[part];
|
|
66
|
+
}
|
|
67
|
+
return cur;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Coerce a skill output value to a number: numbers as is, booleans to 1/0,
|
|
71
|
+
* numeric strings parsed. Anything else is undefined.
|
|
72
|
+
*
|
|
73
|
+
* @param raw - Value read from the skill output
|
|
74
|
+
* @returns A finite number or undefined
|
|
75
|
+
*/
|
|
76
|
+
export function coerceMeasurement(raw) {
|
|
77
|
+
if (typeof raw === 'number')
|
|
78
|
+
return Number.isFinite(raw) ? raw : undefined;
|
|
79
|
+
if (typeof raw === 'boolean')
|
|
80
|
+
return raw ? 1 : 0;
|
|
81
|
+
if (typeof raw === 'string' && raw.trim() !== '') {
|
|
82
|
+
const n = Number(raw);
|
|
83
|
+
return Number.isFinite(n) ? n : undefined;
|
|
84
|
+
}
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Measures `skill_output` Key Results by running their skill.
|
|
89
|
+
*/
|
|
90
|
+
export class KRSkillMeasurerService {
|
|
91
|
+
static instance = null;
|
|
92
|
+
logger;
|
|
93
|
+
runner;
|
|
94
|
+
skillRoots;
|
|
95
|
+
krTracking;
|
|
96
|
+
/**
|
|
97
|
+
* @param opts - Test seams: skill roots to search, a runner, a KR service
|
|
98
|
+
*/
|
|
99
|
+
constructor(opts = {}) {
|
|
100
|
+
this.logger = LoggerService.getInstance().createComponentLogger('KRSkillMeasurer');
|
|
101
|
+
this.runner = opts.runner ?? defaultSkillRunner;
|
|
102
|
+
this.krTracking = opts.krTracking ?? KRTrackingService.getInstance();
|
|
103
|
+
const projectRoot = opts.projectRoot ?? process.cwd();
|
|
104
|
+
this.skillRoots = opts.skillRoots ?? [
|
|
105
|
+
path.join(os.homedir(), '.crewly', 'skills', 'agent'),
|
|
106
|
+
path.join(os.homedir(), '.crewly', 'marketplace', 'skills'),
|
|
107
|
+
path.join(projectRoot, 'config', 'skills', 'agent'),
|
|
108
|
+
path.join(projectRoot, 'config', 'skills', 'agent', 'core'),
|
|
109
|
+
path.join(projectRoot, 'config', 'skills', 'orchestrator'),
|
|
110
|
+
path.join(projectRoot, 'config', 'skills', 'team-leader'),
|
|
111
|
+
];
|
|
112
|
+
}
|
|
113
|
+
static getInstance() {
|
|
114
|
+
if (!this.instance)
|
|
115
|
+
this.instance = new KRSkillMeasurerService();
|
|
116
|
+
return this.instance;
|
|
117
|
+
}
|
|
118
|
+
static setInstance(next) {
|
|
119
|
+
this.instance = next;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Resolve a bare skill name to its `execute.sh`, searching the known roots.
|
|
123
|
+
*
|
|
124
|
+
* @param skill - Bare directory name
|
|
125
|
+
* @returns Absolute path, or null when the name is invalid or not found
|
|
126
|
+
*/
|
|
127
|
+
resolveSkill(skill) {
|
|
128
|
+
if (!SKILL_NAME_RE.test(skill))
|
|
129
|
+
return null;
|
|
130
|
+
for (const root of this.skillRoots) {
|
|
131
|
+
const candidate = path.join(root, skill, 'execute.sh');
|
|
132
|
+
if (fs.existsSync(candidate))
|
|
133
|
+
return candidate;
|
|
134
|
+
}
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Measure every `skill_output` KR of a mission. Failure-soft: one KR's
|
|
139
|
+
* error never stops the others, and nothing throws to the sweep.
|
|
140
|
+
*
|
|
141
|
+
* @param missionId - Mission whose KRs to measure
|
|
142
|
+
* @returns One outcome per skill_output KR
|
|
143
|
+
*/
|
|
144
|
+
async measureMission(missionId) {
|
|
145
|
+
let krs;
|
|
146
|
+
try {
|
|
147
|
+
krs = await this.krTracking.listByMission(missionId);
|
|
148
|
+
}
|
|
149
|
+
catch (err) {
|
|
150
|
+
this.logger.warn('Could not list KRs for skill measurement', {
|
|
151
|
+
missionId,
|
|
152
|
+
error: err instanceof Error ? err.message : String(err),
|
|
153
|
+
});
|
|
154
|
+
return [];
|
|
155
|
+
}
|
|
156
|
+
const outcomes = [];
|
|
157
|
+
for (const kr of krs) {
|
|
158
|
+
if (kr.measurementSource !== 'skill_output')
|
|
159
|
+
continue;
|
|
160
|
+
outcomes.push(await this.measureOne(missionId, kr));
|
|
161
|
+
}
|
|
162
|
+
return outcomes;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Measure one KR. Exposed for the manual `POST …/measure-now` path.
|
|
166
|
+
*
|
|
167
|
+
* @param missionId - Owning mission
|
|
168
|
+
* @param kr - The KR (must be `skill_output`)
|
|
169
|
+
* @returns The outcome
|
|
170
|
+
*/
|
|
171
|
+
async measureOne(missionId, kr) {
|
|
172
|
+
const cfg = (kr.measurementConfig ?? {});
|
|
173
|
+
if (typeof cfg.skill !== 'string') {
|
|
174
|
+
return { krId: kr.id, status: 'skipped', reason: 'measurementConfig.skill missing' };
|
|
175
|
+
}
|
|
176
|
+
const executePath = this.resolveSkill(cfg.skill);
|
|
177
|
+
if (!executePath) {
|
|
178
|
+
return { krId: kr.id, status: 'failed', reason: `skill not found: ${cfg.skill}` };
|
|
179
|
+
}
|
|
180
|
+
let stdout;
|
|
181
|
+
try {
|
|
182
|
+
stdout = await this.runner(executePath, JSON.stringify(cfg.args ?? {}), KR_SKILL_MEASURER_CONSTANTS.TIMEOUT_MS);
|
|
183
|
+
}
|
|
184
|
+
catch (err) {
|
|
185
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
186
|
+
this.logger.warn('skill_output measurement failed', { missionId, krId: kr.id, skill: cfg.skill, reason });
|
|
187
|
+
return { krId: kr.id, status: 'failed', reason };
|
|
188
|
+
}
|
|
189
|
+
let parsed;
|
|
190
|
+
try {
|
|
191
|
+
const start = stdout.search(/[[{]/);
|
|
192
|
+
parsed = JSON.parse(start >= 0 ? stdout.slice(start) : stdout);
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return { krId: kr.id, status: 'failed', reason: 'skill output is not JSON' };
|
|
196
|
+
}
|
|
197
|
+
const value = coerceMeasurement(readJsonPath(parsed, cfg.jsonPath ?? KR_SKILL_MEASURER_CONSTANTS.DEFAULT_JSON_PATH));
|
|
198
|
+
if (value === undefined) {
|
|
199
|
+
return { krId: kr.id, status: 'failed', reason: `no number at ${cfg.jsonPath ?? KR_SKILL_MEASURER_CONSTANTS.DEFAULT_JSON_PATH}` };
|
|
200
|
+
}
|
|
201
|
+
if (kr.measurements.length > 0 && kr.current === value) {
|
|
202
|
+
return { krId: kr.id, status: 'unchanged', value };
|
|
203
|
+
}
|
|
204
|
+
try {
|
|
205
|
+
await this.krTracking.recordMeasurement(missionId, kr.id, value, 'skill_output', `skill ${cfg.skill}`);
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return { krId: kr.id, status: 'failed', reason: err instanceof Error ? err.message : String(err) };
|
|
209
|
+
}
|
|
210
|
+
this.logger.info('KR measured from skill output', { missionId, krId: kr.id, skill: cfg.skill, value });
|
|
211
|
+
return { krId: kr.id, status: 'recorded', value };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
//# sourceMappingURL=kr-skill-measurer.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kr-skill-measurer.service.js","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/kr-skill-measurer.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -112,6 +112,12 @@ export declare class MissionReminderService {
|
|
|
112
112
|
reviewsAutoContinued: number;
|
|
113
113
|
/** Missions flagged stale this sweep (`mission:stale` published, staleCycles bumped). */
|
|
114
114
|
staleFlagged: number;
|
|
115
|
+
/** KRs re-measured from skill output this sweep */
|
|
116
|
+
skillMeasured: number;
|
|
117
|
+
/** Pending proposals the owner was nudged about this sweep */
|
|
118
|
+
proposalsNudged: number;
|
|
119
|
+
/** Whether the weekly digest went out this sweep */
|
|
120
|
+
digestSent: boolean;
|
|
115
121
|
}>;
|
|
116
122
|
/**
|
|
117
123
|
* Result of {@link maybeCreateReviewWorkItem} — `'created'` when a new
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;
|
|
1
|
+
{"version":3,"file":"mission-reminder.service.d.ts","sourceRoot":"","sources":["../../../../../../backend/src/services/v3/mission-reminder.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAaH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAUzE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAuE7B;;GAEG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;IACtD;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB,CAAK;IAE9B;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAgC;IAEhD;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IAExD,6EAA6E;IAC7E,OAAO,CAAC,WAAW,CAAqB;IAExC,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO;IAMP;;;;;;OAMG;IACH,IAAW,qBAAqB,IAAI,MAAM,CAEzC;IAED;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAOnB,MAAM,CAAC,WAAW,IAAI,sBAAsB;IAO5C,MAAM,CAAC,aAAa,IAAI,IAAI;IAI5B;;;;;OAKG;IACH,kBAAkB,CAAC,GAAG,EAAE,eAAe,GAAG,IAAI,GAAG,IAAI;IAIrD;;;;;;;;;;;;;;;;;;;OAmBG;IACG,QAAQ,CAAC,KAAK,GAAE,OAAe,GAAG,OAAO,CAAC;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,MAAM,CAAC;QACvB,cAAc,EAAE,MAAM,CAAC;QACvB,wFAAwF;QACxF,oBAAoB,EAAE,MAAM,CAAC;QAC7B,yFAAyF;QACzF,YAAY,EAAE,MAAM,CAAC;QACrB,mDAAmD;QACnD,aAAa,EAAE,MAAM,CAAC;QACtB,8DAA8D;QAC9D,eAAe,EAAE,MAAM,CAAC;QACxB,oDAAoD;QACpD,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IAoJF;;;;;;;;OAQG;YACW,yBAAyB;IAoLvC;;;;OAIG;YACW,gBAAgB;IAa9B;;;;;;;;;;OAUG;YACW,WAAW;IAyDzB,mEAAmE;IACnE,OAAO,CAAC,mBAAmB;IAO3B;;;;;;;;;;;OAWG;YACW,sBAAsB;IAmBpC;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,iBAAiB;IAkBzB;;;;;;;;;;;;OAYG;YACW,sBAAsB;IAcpC;;OAEG;YACW,YAAY;IAoC1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;OAEG;YACW,gBAAgB;IAqB9B;;;;;OAKG;YACW,qBAAqB;IAuBnC;;OAEG;YACW,WAAW;IASzB;;OAEG;YACW,WAAW;CAI1B"}
|
|
@@ -22,6 +22,8 @@ import { StorageService } from '../core/storage.service.js';
|
|
|
22
22
|
import { KRTrackingService } from './kr-tracking.service.js';
|
|
23
23
|
import { OKRReviewService } from './okr-review.service.js';
|
|
24
24
|
import { MissionPeriodService } from './mission-period.service.js';
|
|
25
|
+
import { KRSkillMeasurerService } from './kr-skill-measurer.service.js';
|
|
26
|
+
import { OKROwnerGuidanceService } from './okr-owner-guidance.service.js';
|
|
25
27
|
import { getSlackOrchestratorBridge } from '../slack/slack-orchestrator-bridge.js';
|
|
26
28
|
import { TaskPoolService } from '../task-pool/task-pool.service.js';
|
|
27
29
|
import { isMissionExecutable } from '../../types/v2/mission.types.js';
|
|
@@ -211,7 +213,24 @@ export class MissionReminderService {
|
|
|
211
213
|
reviewsSkipped: 0,
|
|
212
214
|
reviewsAutoContinued: 0,
|
|
213
215
|
staleFlagged: 0,
|
|
216
|
+
skillMeasured: 0,
|
|
217
|
+
proposalsNudged: 0,
|
|
218
|
+
digestSent: false,
|
|
214
219
|
};
|
|
220
|
+
// Owner guidance runs on every sweep and looks at ALL missions (pending
|
|
221
|
+
// proposals included — those are exactly what the owner must hear about).
|
|
222
|
+
try {
|
|
223
|
+
const guidance = await OKROwnerGuidanceService.getInstance()?.run();
|
|
224
|
+
if (guidance) {
|
|
225
|
+
result.proposalsNudged = guidance.nudged;
|
|
226
|
+
result.digestSent = guidance.digestSent;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (err) {
|
|
230
|
+
this.logger.warn('Owner guidance failed (non-fatal)', {
|
|
231
|
+
error: err instanceof Error ? err.message : String(err),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
215
234
|
this.logger.info('Starting Mission OKR reminder sweep', { count: missions.length });
|
|
216
235
|
// One pool read per sweep for the stale detector (not per mission).
|
|
217
236
|
let poolItems = null;
|
|
@@ -244,6 +263,20 @@ export class MissionReminderService {
|
|
|
244
263
|
});
|
|
245
264
|
}
|
|
246
265
|
}
|
|
266
|
+
// Refresh skill-measured KRs before reading progress, so the sweep
|
|
267
|
+
// reviews this hour's numbers rather than whatever was typed in last.
|
|
268
|
+
try {
|
|
269
|
+
const measured = await KRSkillMeasurerService.getInstance().measureMission(mission.id);
|
|
270
|
+
const recorded = measured.filter((m) => m.status === 'recorded').length;
|
|
271
|
+
if (recorded > 0)
|
|
272
|
+
result.skillMeasured += recorded;
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
this.logger.warn('skill_output measurement failed for mission', {
|
|
276
|
+
missionId: mission.id,
|
|
277
|
+
error: err instanceof Error ? err.message : String(err),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
247
280
|
let summary = null;
|
|
248
281
|
try {
|
|
249
282
|
// Get OKR progress summary — needed for both the reminder DM
|