crewly 1.20.269 → 1.20.271
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/skills/agent/core/gmail-attachment/SKILL.md +72 -0
- package/config/skills/agent/core/gmail-attachment/execute.sh +126 -0
- package/config/skills/agent/core/gmail-attachment/execute.test.sh +74 -0
- package/config/skills/agent/core/gmail-read/SKILL.md +2 -2
- package/dist/backend/backend/src/constants.d.ts +41 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +41 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js +12 -0
- package/dist/backend/backend/src/controllers/chat/agent-reply.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts +8 -0
- package/dist/backend/backend/src/controllers/google/google.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.controller.js +16 -0
- package/dist/backend/backend/src/controllers/google/google.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts +1 -0
- package/dist/backend/backend/src/controllers/google/google.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/google/google.routes.js +3 -1
- package/dist/backend/backend/src/controllers/google/google.routes.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 +11 -0
- package/dist/backend/backend/src/controllers/team/team.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts +18 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +85 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- 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 +3 -0
- package/dist/backend/backend/src/services/agent/idle-detection.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts +16 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/resource-mode.service.js +24 -3
- package/dist/backend/backend/src/services/agent/resource-mode.service.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 +1 -0
- package/dist/backend/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts +17 -0
- package/dist/backend/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.service.js +21 -0
- package/dist/backend/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.d.ts.map +1 -1
- package/dist/backend/backend/src/services/decisions/decision.wiring.js +11 -0
- package/dist/backend/backend/src/services/decisions/decision.wiring.js.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.d.ts +22 -2
- package/dist/backend/backend/src/services/google/gmail.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/google/gmail.service.js +27 -2
- package/dist/backend/backend/src/services/google/gmail.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts +11 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js +25 -0
- package/dist/backend/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +320 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js +692 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts +137 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.d.ts.map +1 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js +234 -0
- package/dist/backend/backend/src/services/messaging/owner-thread-sentinel.wiring.js.map +1 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js +3 -0
- package/dist/backend/backend/src/services/slack/slack-agent-post.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +13 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +41 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +41 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts +16 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/resource-mode.service.js +24 -3
- package/dist/cli/backend/src/services/agent/resource-mode.service.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 +1 -0
- package/dist/cli/backend/src/services/ai/prompt-modules/skills-reference.module.js.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts +17 -0
- package/dist/cli/backend/src/services/decisions/decision.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/decisions/decision.service.js +21 -0
- package/dist/cli/backend/src/services/decisions/decision.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts +11 -0
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js +25 -0
- package/dist/cli/backend/src/services/messaging/owner-message-watchdog.service.js.map +1 -1
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts +320 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js +692 -0
- package/dist/cli/backend/src/services/messaging/owner-thread-sentinel.service.js.map +1 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +13 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":";AA4CA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../backend/src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,6 +71,7 @@ import { SubAgentMessageQueue } from './services/messaging/sub-agent-message-que
|
|
|
71
71
|
import { InProcessTurnFailureService, setInProcessTurnFailureService } from './services/agent/in-process-turn-failure.service.js';
|
|
72
72
|
import { LivenessMonitorService } from './services/monitoring/liveness-monitor.service.js';
|
|
73
73
|
import { getOwnerMessageWatchdog } from './services/messaging/owner-message-watchdog.service.js';
|
|
74
|
+
import { getOwnerThreadSentinel, reportOwnerThreadBlocking } from './services/messaging/owner-thread-sentinel.service.js';
|
|
74
75
|
import { parseInboundOrigin } from './services/orc/orc-reply-route.service.js';
|
|
75
76
|
import { parseSlackThreadKey } from './services/slack/slack-thread-key.js';
|
|
76
77
|
import { LIVENESS_MONITOR_CONSTANTS, INPUT_CIRCUIT_CONSTANTS, INPUT_BLOCKED_RETRY_CONSTANTS } from './constants.js';
|
|
@@ -1938,6 +1939,10 @@ export class CrewlyServer {
|
|
|
1938
1939
|
// An agent with work queued for it (e.g. a ticket just assigned to a
|
|
1939
1940
|
// member that was started for it) is never idle-stopped.
|
|
1940
1941
|
idleDetection.setPendingWorkCheck(async (sessionName) => {
|
|
1942
|
+
// Mid-conversation with the owner (an unanswered owner message or a
|
|
1943
|
+
// promise in an owner thread in the last 30 min) counts as work.
|
|
1944
|
+
if (getOwnerThreadSentinel()?.owesRecently(sessionName))
|
|
1945
|
+
return true;
|
|
1941
1946
|
const items = await TaskPoolService.getInstance().getAllItems();
|
|
1942
1947
|
return items.some((wi) => wi.target === sessionName && PENDING_WORK_STATUSES.has(wi.status));
|
|
1943
1948
|
});
|
|
@@ -1974,6 +1979,12 @@ export class CrewlyServer {
|
|
|
1974
1979
|
return out;
|
|
1975
1980
|
},
|
|
1976
1981
|
hasOwnerMessage: (name) => SubAgentMessageQueue.getInstance().peek(name).some((m) => m.meta?.owner === true),
|
|
1982
|
+
// An agent mid-conversation with the owner is the last one stopped
|
|
1983
|
+
// for a slot, and its owner thread hears when it is
|
|
1984
|
+
// (specs/2026-10-08-owner-thread-sentinel.md).
|
|
1985
|
+
owesOwnerThread: (name) => getOwnerThreadSentinel()?.owesRecently(name) === true,
|
|
1986
|
+
onStoppedForSlot: (name) => reportOwnerThreadBlocking(name, { kind: 'stopped', why: 'slot' }),
|
|
1987
|
+
onStartDeferred: (name) => reportOwnerThreadBlocking(name, { kind: 'start_deferred' }),
|
|
1977
1988
|
stopAgent: async (name, role) => {
|
|
1978
1989
|
await agentRegistration.terminateAgentSession(name, role);
|
|
1979
1990
|
await StorageService.getInstance().updateAgentStatus(name, CREWLY_CONSTANTS.AGENT_STATUSES.INACTIVE, 'idle_exit');
|
|
@@ -4151,6 +4162,12 @@ export class CrewlyServer {
|
|
|
4151
4162
|
// (2026-10-02, Eve). Not-yet-due and already-nudged
|
|
4152
4163
|
// promises are left to the open-items sweep.
|
|
4153
4164
|
...owed.map((c) => c.sessionName),
|
|
4165
|
+
// Agents an owner Slack thread waits on: a promised
|
|
4166
|
+
// follow-up, an unanswered owner message, or an owner
|
|
4167
|
+
// card they asked (2026-10-08: Atlas waited on a browser
|
|
4168
|
+
// approval in the owner's thread and was skipped as "no
|
|
4169
|
+
// work in hand").
|
|
4170
|
+
...(await this.ownerThreadSessionsAtBoot()),
|
|
4154
4171
|
]);
|
|
4155
4172
|
}
|
|
4156
4173
|
catch (poolErr) {
|
|
@@ -5027,6 +5044,21 @@ export class CrewlyServer {
|
|
|
5027
5044
|
*
|
|
5028
5045
|
* @returns Open commitments and the agents owing an answer
|
|
5029
5046
|
*/
|
|
5047
|
+
/**
|
|
5048
|
+
* Sessions an owner thread waits on at boot: the owner-thread sentinel's
|
|
5049
|
+
* persisted threads (promise / unanswered owner message / open card) and
|
|
5050
|
+
* the askers of open owner cards from the last day. Read from disk: the
|
|
5051
|
+
* restore can run before the sentinel and the decision service start.
|
|
5052
|
+
*
|
|
5053
|
+
* @returns Session names (never the orchestrator)
|
|
5054
|
+
*/
|
|
5055
|
+
async ownerThreadSessionsAtBoot() {
|
|
5056
|
+
const { ownerThreadSessionsAtBoot } = await import('./services/messaging/owner-thread-sentinel.wiring.js');
|
|
5057
|
+
const sessions = await ownerThreadSessionsAtBoot(this.config.crewlyHome, Date.now(), (msg, error) => this.logger.warn(msg, { error: error instanceof Error ? error.message : String(error) }));
|
|
5058
|
+
if (sessions.length > 0)
|
|
5059
|
+
this.logger.info('Owner threads wait on these agents; restoring them as work in hand', { sessions });
|
|
5060
|
+
return sessions;
|
|
5061
|
+
}
|
|
5030
5062
|
async loadOwedWorkAtBoot() {
|
|
5031
5063
|
let commitments = [];
|
|
5032
5064
|
try {
|
|
@@ -5659,6 +5691,51 @@ export class CrewlyServer {
|
|
|
5659
5691
|
this.logger.warn('Owner completion report not started', { error: error instanceof Error ? error.message : String(error) });
|
|
5660
5692
|
}
|
|
5661
5693
|
}
|
|
5694
|
+
/**
|
|
5695
|
+
* An owner Slack thread is never left silent: one status line per
|
|
5696
|
+
* blocking event for the agent it waits on
|
|
5697
|
+
* (services/messaging/owner-thread-sentinel.service.ts). Best-effort.
|
|
5698
|
+
*
|
|
5699
|
+
* @param watchdog - The owner message watchdog (owner messages feed the sentinel)
|
|
5700
|
+
* @param names - Session → display name (kept fresh by the watchdog's refresh)
|
|
5701
|
+
*/
|
|
5702
|
+
async startOwnerThreadSentinel(watchdog, names) {
|
|
5703
|
+
try {
|
|
5704
|
+
const wiring = await import('./services/messaging/owner-thread-sentinel.wiring.js');
|
|
5705
|
+
const { ActivityMonitorService } = await import('./services/monitoring/activity-monitor.service.js');
|
|
5706
|
+
const activity = ActivityMonitorService.getInstance();
|
|
5707
|
+
const sentinel = wiring.createOwnerThreadSentinel({
|
|
5708
|
+
crewlyHome: this.config.crewlyHome,
|
|
5709
|
+
slack: () => getSlackService(),
|
|
5710
|
+
agentDmBotToken: (slackChannelId) => {
|
|
5711
|
+
const link = getSlackAgentDmService()?.findBySlackChannelId(slackChannelId);
|
|
5712
|
+
return link ? getSlackAgentIdentityService()?.getInstalled(link.agentSession)?.botToken : undefined;
|
|
5713
|
+
},
|
|
5714
|
+
botTokenOf: (session) => getSlackAgentIdentityService()?.getInstalled(session)?.botToken,
|
|
5715
|
+
sendToAgent: (session, text) => this.apiController.agentRegistrationService.sendMessageToAgent(session, text),
|
|
5716
|
+
sessionExists: (session) => {
|
|
5717
|
+
try {
|
|
5718
|
+
return getSessionBackendSync()?.sessionExists(session) ?? false;
|
|
5719
|
+
}
|
|
5720
|
+
catch {
|
|
5721
|
+
return false;
|
|
5722
|
+
}
|
|
5723
|
+
},
|
|
5724
|
+
activate: async (session) => {
|
|
5725
|
+
const { activateAgentBySession } = await import('./controllers/team/team.controller.js');
|
|
5726
|
+
return activateAgentBySession(this.apiController, session);
|
|
5727
|
+
},
|
|
5728
|
+
displayNameOf: (session) => (session === ORCHESTRATOR_SESSION_NAME ? 'Orc' : names.get(session) ?? session),
|
|
5729
|
+
listItems: () => TaskPoolService.getInstance().getAllItems(),
|
|
5730
|
+
workingStatusOf: (session) => activity.getObservedWorkingStatus(session) ?? null,
|
|
5731
|
+
});
|
|
5732
|
+
watchdog.onTrack((entry) => wiring.onOwnerMessageTracked(sentinel, entry));
|
|
5733
|
+
this.logger.info('Owner thread sentinel started', { watched: sentinel.list().length });
|
|
5734
|
+
}
|
|
5735
|
+
catch (error) {
|
|
5736
|
+
this.logger.warn('Owner thread sentinel not started', { error: error instanceof Error ? error.message : String(error) });
|
|
5737
|
+
}
|
|
5738
|
+
}
|
|
5662
5739
|
async startOwnerMessageWatchdog(chatV2) {
|
|
5663
5740
|
try {
|
|
5664
5741
|
const wiring = await import('./services/messaging/owner-message-watchdog.wiring.js');
|
|
@@ -5743,6 +5820,7 @@ export class CrewlyServer {
|
|
|
5743
5820
|
slack.on('message', (message) => wiring.onSlackInbound(watchdog, message));
|
|
5744
5821
|
activity.onWorkingStatusChange((session, status) => watchdog.noteAgentTurn(session, status === 'in_progress'));
|
|
5745
5822
|
this.logger.info('Owner message watchdog started', { tracked: watchdog.size });
|
|
5823
|
+
await this.startOwnerThreadSentinel(watchdog, names);
|
|
5746
5824
|
}
|
|
5747
5825
|
catch (error) {
|
|
5748
5826
|
this.logger.warn('Owner message watchdog not started', {
|
|
@@ -5981,6 +6059,13 @@ export class CrewlyServer {
|
|
|
5981
6059
|
},
|
|
5982
6060
|
notify: async (notice) => {
|
|
5983
6061
|
const minutes = Math.max(1, Math.round(notice.blockedForMs / 60000));
|
|
6062
|
+
// The owner thread waiting on this agent hears it too
|
|
6063
|
+
// (specs/2026-10-08-owner-thread-sentinel.md).
|
|
6064
|
+
{
|
|
6065
|
+
const { reportOwnerThreadBlocking } = await import('./services/messaging/owner-thread-sentinel.service.js');
|
|
6066
|
+
const why = notice.state === 'busy' ? 'busy' : notice.state === 'unknown' || notice.blockedState === 'unknown' ? 'unreadable' : notice.state === 'circuit-open' ? 'blocked' : 'foreign';
|
|
6067
|
+
reportOwnerThreadBlocking(notice.sessionName, { kind: 'delivery_held', why });
|
|
6068
|
+
}
|
|
5984
6069
|
// The kind of content, never the text: a box can hold a password.
|
|
5985
6070
|
if (notice.state === 'stuck') {
|
|
5986
6071
|
tell(notice.sessionName, `Needs you: ${notice.sessionName} is idle, but its input box has held ${notice.inputLength} characters for ${minutes} min that Crewly cannot match to its own messages, and nobody typed into its terminal since Crewly's last message. Crewly did not submit it. Check the agent's terminal: submit or clear what is in the box.`, undefined);
|