@nocobase/app-plugin-agents 0.1.0-beta.1 → 0.1.0-beta.3
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/CHANGELOG.md +124 -0
- package/README.md +44 -12
- package/dist/client/api/client.d.ts +9 -2
- package/dist/client/api/client.d.ts.map +1 -1
- package/dist/client/api/client.js +15 -3
- package/dist/client/api/client.js.map +1 -1
- package/dist/client/chat/message-model.d.ts.map +1 -1
- package/dist/client/chat/message-model.js +10 -0
- package/dist/client/chat/message-model.js.map +1 -1
- package/dist/client/chat/settings-section.d.ts.map +1 -1
- package/dist/client/chat/settings-section.js +29 -19
- package/dist/client/chat/settings-section.js.map +1 -1
- package/dist/client/components/model-entries.d.ts +12 -3
- package/dist/client/components/model-entries.d.ts.map +1 -1
- package/dist/client/components/model-entries.js +41 -19
- package/dist/client/components/model-entries.js.map +1 -1
- package/dist/client/components/variables/variable-dialogs.d.ts +6 -1
- package/dist/client/components/variables/variable-dialogs.d.ts.map +1 -1
- package/dist/client/components/variables/variable-dialogs.js +27 -11
- package/dist/client/components/variables/variable-dialogs.js.map +1 -1
- package/dist/client/components/variables/variables-panel.d.ts.map +1 -1
- package/dist/client/components/variables/variables-panel.js +9 -2
- package/dist/client/components/variables/variables-panel.js.map +1 -1
- package/dist/client/lib/agents.d.ts +5 -0
- package/dist/client/lib/agents.d.ts.map +1 -1
- package/dist/client/lib/agents.js +23 -0
- package/dist/client/lib/agents.js.map +1 -1
- package/dist/client/lib/model-suggestions.d.ts +28 -0
- package/dist/client/lib/model-suggestions.d.ts.map +1 -0
- package/dist/client/lib/model-suggestions.js +44 -0
- package/dist/client/lib/model-suggestions.js.map +1 -0
- package/dist/client/locales/chat.en-US.d.ts +7 -0
- package/dist/client/locales/chat.en-US.d.ts.map +1 -1
- package/dist/client/locales/chat.en-US.js +8 -1
- package/dist/client/locales/chat.en-US.js.map +1 -1
- package/dist/client/locales/chat.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/chat.zh-CN.js +8 -1
- package/dist/client/locales/chat.zh-CN.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +20 -1
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +21 -1
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/runWait.en-US.d.ts +31 -0
- package/dist/client/locales/runWait.en-US.d.ts.map +1 -0
- package/dist/client/locales/runWait.en-US.js +30 -0
- package/dist/client/locales/runWait.en-US.js.map +1 -0
- package/dist/client/locales/runWait.zh-CN.d.ts +5 -0
- package/dist/client/locales/runWait.zh-CN.d.ts.map +1 -0
- package/dist/client/locales/runWait.zh-CN.js +25 -0
- package/dist/client/locales/runWait.zh-CN.js.map +1 -0
- package/dist/client/locales/runtimes.en-US.d.ts +6 -0
- package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
- package/dist/client/locales/runtimes.en-US.js +7 -1
- package/dist/client/locales/runtimes.en-US.js.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
- package/dist/client/locales/runtimes.zh-CN.js +7 -1
- package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +21 -1
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/pages/agents/index.d.ts.map +1 -1
- package/dist/client/pages/agents/index.js +6 -6
- package/dist/client/pages/agents/index.js.map +1 -1
- package/dist/client/pages/runtimes/index.js +2 -2
- package/dist/client/pages/runtimes/index.js.map +1 -1
- package/dist/client/pages/runtimes/runner-sheet.js +11 -3
- package/dist/client/pages/runtimes/runner-sheet.js.map +1 -1
- package/dist/client/runs/format-wait.d.ts +21 -0
- package/dist/client/runs/format-wait.d.ts.map +1 -0
- package/dist/client/runs/format-wait.js +76 -0
- package/dist/client/runs/format-wait.js.map +1 -0
- package/dist/client/runs.d.ts +2 -0
- package/dist/client/runs.d.ts.map +1 -1
- package/dist/client/runs.js +2 -0
- package/dist/client/runs.js.map +1 -1
- package/dist/database/migrations/.manifest.json +20 -0
- package/dist/database/migrations/202610090001_ag_add_team_runner_variables.d.ts +9 -0
- package/dist/database/migrations/202610090001_ag_add_team_runner_variables.d.ts.map +1 -0
- package/dist/database/migrations/202610090001_ag_add_team_runner_variables.js +28 -0
- package/dist/database/migrations/202610090001_ag_add_team_runner_variables.js.map +1 -0
- package/dist/database/migrations/202610090002_ag_create_run_requests.d.ts +10 -0
- package/dist/database/migrations/202610090002_ag_create_run_requests.d.ts.map +1 -0
- package/dist/database/migrations/202610090002_ag_create_run_requests.js +105 -0
- package/dist/database/migrations/202610090002_ag_create_run_requests.js.map +1 -0
- package/dist/database/migrations/202610090003_ag_add_execution_history.d.ts +4 -0
- package/dist/database/migrations/202610090003_ag_add_execution_history.d.ts.map +1 -0
- package/dist/database/migrations/202610090003_ag_add_execution_history.js +17 -0
- package/dist/database/migrations/202610090003_ag_add_execution_history.js.map +1 -0
- package/dist/database/migrations/202610090004_ag_add_runner_workspace_usage.d.ts +9 -0
- package/dist/database/migrations/202610090004_ag_add_runner_workspace_usage.d.ts.map +1 -0
- package/dist/database/migrations/202610090004_ag_add_runner_workspace_usage.js +22 -0
- package/dist/database/migrations/202610090004_ag_add_runner_workspace_usage.js.map +1 -0
- package/dist/database/migrations/202610090005_ag_add_runner_variables.d.ts +10 -0
- package/dist/database/migrations/202610090005_ag_add_runner_variables.d.ts.map +1 -0
- package/dist/database/migrations/202610090005_ag_add_runner_variables.js +36 -0
- package/dist/database/migrations/202610090005_ag_add_runner_variables.js.map +1 -0
- package/dist/package.json +1 -1
- package/dist/server/composition.d.ts +12 -2
- package/dist/server/composition.d.ts.map +1 -1
- package/dist/server/composition.js +16 -3
- package/dist/server/composition.js.map +1 -1
- package/dist/server/core/agents/agent.service.d.ts.map +1 -1
- package/dist/server/core/agents/agent.service.js +4 -1
- package/dist/server/core/agents/agent.service.js.map +1 -1
- package/dist/server/core/consultations/consultation.service.d.ts.map +1 -1
- package/dist/server/core/consultations/consultation.service.js +5 -2
- package/dist/server/core/consultations/consultation.service.js.map +1 -1
- package/dist/server/core/conversations/availability.d.ts +10 -4
- package/dist/server/core/conversations/availability.d.ts.map +1 -1
- package/dist/server/core/conversations/availability.js +6 -20
- package/dist/server/core/conversations/availability.js.map +1 -1
- package/dist/server/core/conversations/chat-settings.d.ts +2 -2
- package/dist/server/core/conversations/chat-settings.d.ts.map +1 -1
- package/dist/server/core/conversations/chat-settings.js +19 -1
- package/dist/server/core/conversations/chat-settings.js.map +1 -1
- package/dist/server/core/conversations/conversation.service.d.ts +2 -1
- package/dist/server/core/conversations/conversation.service.d.ts.map +1 -1
- package/dist/server/core/conversations/conversation.service.js +255 -57
- package/dist/server/core/conversations/conversation.service.js.map +1 -1
- package/dist/server/core/runs/availability.d.ts +5 -2
- package/dist/server/core/runs/availability.d.ts.map +1 -1
- package/dist/server/core/runs/availability.js +17 -6
- package/dist/server/core/runs/availability.js.map +1 -1
- package/dist/server/core/runs/claim.d.ts +16 -2
- package/dist/server/core/runs/claim.d.ts.map +1 -1
- package/dist/server/core/runs/claim.js +220 -64
- package/dist/server/core/runs/claim.js.map +1 -1
- package/dist/server/core/runs/eligibility.d.ts +49 -0
- package/dist/server/core/runs/eligibility.d.ts.map +1 -0
- package/dist/server/core/runs/eligibility.js +44 -0
- package/dist/server/core/runs/eligibility.js.map +1 -0
- package/dist/server/core/runs/execution-view.d.ts +10 -0
- package/dist/server/core/runs/execution-view.d.ts.map +1 -0
- package/dist/server/core/runs/execution-view.js +25 -0
- package/dist/server/core/runs/execution-view.js.map +1 -0
- package/dist/server/core/runs/execution.d.ts +13 -0
- package/dist/server/core/runs/execution.d.ts.map +1 -0
- package/dist/server/core/runs/execution.js +85 -0
- package/dist/server/core/runs/execution.js.map +1 -0
- package/dist/server/core/runs/extensions.d.ts +2 -0
- package/dist/server/core/runs/extensions.d.ts.map +1 -1
- package/dist/server/core/runs/extensions.js.map +1 -1
- package/dist/server/core/runs/index.d.ts +6 -3
- package/dist/server/core/runs/index.d.ts.map +1 -1
- package/dist/server/core/runs/index.js +5 -2
- package/dist/server/core/runs/index.js.map +1 -1
- package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
- package/dist/server/core/runs/lifecycle.js +29 -2
- package/dist/server/core/runs/lifecycle.js.map +1 -1
- package/dist/server/core/runs/ports.d.ts +20 -0
- package/dist/server/core/runs/ports.d.ts.map +1 -1
- package/dist/server/core/runs/ports.js.map +1 -1
- package/dist/server/core/runs/preview.d.ts.map +1 -1
- package/dist/server/core/runs/preview.js +2 -0
- package/dist/server/core/runs/preview.js.map +1 -1
- package/dist/server/core/runs/run-requests.d.ts +217 -0
- package/dist/server/core/runs/run-requests.d.ts.map +1 -0
- package/dist/server/core/runs/run-requests.js +471 -0
- package/dist/server/core/runs/run-requests.js.map +1 -0
- package/dist/server/core/runs/run.service.d.ts +63 -7
- package/dist/server/core/runs/run.service.d.ts.map +1 -1
- package/dist/server/core/runs/run.service.js +211 -37
- package/dist/server/core/runs/run.service.js.map +1 -1
- package/dist/server/core/runs/run.store.d.ts +14 -3
- package/dist/server/core/runs/run.store.d.ts.map +1 -1
- package/dist/server/core/runs/run.store.js +41 -2
- package/dist/server/core/runs/run.store.js.map +1 -1
- package/dist/server/core/runs/runner-view.d.ts +4 -3
- package/dist/server/core/runs/runner-view.d.ts.map +1 -1
- package/dist/server/core/runs/runner-view.js +7 -3
- package/dist/server/core/runs/runner-view.js.map +1 -1
- package/dist/server/core/runs/transitions.d.ts.map +1 -1
- package/dist/server/core/runs/transitions.js +4 -0
- package/dist/server/core/runs/transitions.js.map +1 -1
- package/dist/server/core/runs/workload.d.ts +1 -1
- package/dist/server/core/runs/workload.d.ts.map +1 -1
- package/dist/server/core/runs/workload.js +44 -13
- package/dist/server/core/runs/workload.js.map +1 -1
- package/dist/server/core/variables/index.d.ts +1 -1
- package/dist/server/core/variables/index.d.ts.map +1 -1
- package/dist/server/core/variables/index.js +1 -1
- package/dist/server/core/variables/index.js.map +1 -1
- package/dist/server/core/variables/variable.service.d.ts +38 -6
- package/dist/server/core/variables/variable.service.d.ts.map +1 -1
- package/dist/server/core/variables/variable.service.js +201 -30
- package/dist/server/core/variables/variable.service.js.map +1 -1
- package/dist/server/jobs/index.d.ts +1 -1
- package/dist/server/jobs/index.d.ts.map +1 -1
- package/dist/server/jobs/index.js +1 -1
- package/dist/server/jobs/index.js.map +1 -1
- package/dist/server/jobs/job.service.d.ts +2 -0
- package/dist/server/jobs/job.service.d.ts.map +1 -1
- package/dist/server/jobs/job.service.js +3 -1
- package/dist/server/jobs/job.service.js.map +1 -1
- package/dist/server/jobs/spec.d.ts +4 -0
- package/dist/server/jobs/spec.d.ts.map +1 -1
- package/dist/server/jobs/spec.js +6 -0
- package/dist/server/jobs/spec.js.map +1 -1
- package/dist/server/kernel/errors.d.ts +1 -1
- package/dist/server/kernel/errors.d.ts.map +1 -1
- package/dist/server/kernel/errors.js +1 -0
- package/dist/server/kernel/errors.js.map +1 -1
- package/dist/server/kernel/events.d.ts +28 -8
- package/dist/server/kernel/events.d.ts.map +1 -1
- package/dist/server/kernel/events.js.map +1 -1
- package/dist/server/routes/admin.d.ts.map +1 -1
- package/dist/server/routes/admin.js +38 -7
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/chat.d.ts.map +1 -1
- package/dist/server/routes/chat.js +9 -6
- package/dist/server/routes/chat.js.map +1 -1
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +11 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/roster.d.ts.map +1 -1
- package/dist/server/routes/roster.js +2 -1
- package/dist/server/routes/roster.js.map +1 -1
- package/dist/server/routes/run-requests.d.ts +6 -0
- package/dist/server/routes/run-requests.d.ts.map +1 -0
- package/dist/server/routes/run-requests.js +216 -0
- package/dist/server/routes/run-requests.js.map +1 -0
- package/dist/server/routes/runners/admin.d.ts +9 -1
- package/dist/server/routes/runners/admin.d.ts.map +1 -1
- package/dist/server/routes/runners/admin.js +62 -24
- package/dist/server/routes/runners/admin.js.map +1 -1
- package/dist/server/routes/runners/runner.d.ts.map +1 -1
- package/dist/server/routes/runners/runner.js +21 -3
- package/dist/server/routes/runners/runner.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +31 -3
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +233 -3
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/runners/index.d.ts +1 -0
- package/dist/server/runners/index.d.ts.map +1 -1
- package/dist/server/runners/index.js +1 -0
- package/dist/server/runners/index.js.map +1 -1
- package/dist/server/runners/runner.service.d.ts +10 -5
- package/dist/server/runners/runner.service.d.ts.map +1 -1
- package/dist/server/runners/runner.service.js +35 -10
- package/dist/server/runners/runner.service.js.map +1 -1
- package/dist/server/runners/runner.store.d.ts +7 -1
- package/dist/server/runners/runner.store.d.ts.map +1 -1
- package/dist/server/runners/runner.store.js +69 -4
- package/dist/server/runners/runner.store.js.map +1 -1
- package/dist/server/runners/sweeper.d.ts +5 -0
- package/dist/server/runners/sweeper.d.ts.map +1 -1
- package/dist/server/runners/sweeper.js +4 -2
- package/dist/server/runners/sweeper.js.map +1 -1
- package/dist/server/runners/workspaces.d.ts +30 -0
- package/dist/server/runners/workspaces.d.ts.map +1 -0
- package/dist/server/runners/workspaces.js +135 -0
- package/dist/server/runners/workspaces.js.map +1 -0
- package/dist/server/tokens.d.ts +4 -2
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js +2 -0
- package/dist/server/tokens.js.map +1 -1
- package/dist/shared/agents.d.ts +2 -0
- package/dist/shared/agents.d.ts.map +1 -1
- package/dist/shared/agents.js.map +1 -1
- package/dist/shared/conversations.d.ts +48 -13
- package/dist/shared/conversations.d.ts.map +1 -1
- package/dist/shared/conversations.js +2 -2
- package/dist/shared/conversations.js.map +1 -1
- package/dist/shared/runners.d.ts +56 -5
- package/dist/shared/runners.d.ts.map +1 -1
- package/dist/shared/runners.js.map +1 -1
- package/dist/shared/runs.d.ts +145 -1
- package/dist/shared/runs.d.ts.map +1 -1
- package/dist/shared/runs.js +18 -0
- package/dist/shared/runs.js.map +1 -1
- package/dist/shared/variables.d.ts +22 -0
- package/dist/shared/variables.d.ts.map +1 -1
- package/dist/shared/variables.js +9 -1
- package/dist/shared/variables.js.map +1 -1
- package/package.json +8 -8
- package/skills/nocobase-app-plugin-agents/references/extension-points.md +4 -0
- package/skills/nocobase-app-plugin-agents/references/runners.md +9 -1
- package/skills/nocobase-app-plugin-agents/references/verification-and-troubleshooting.md +1 -1
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
2
|
+
import { conflict, forbidden, notFound, precondition, } from '../../kernel/errors.js';
|
|
3
|
+
import { asJson, cleanList, stringArray } from '../../kernel/values.js';
|
|
4
|
+
import { findAgent, lockAgentForClaim } from '../agents/index.js';
|
|
5
|
+
/** How long a request waits for its responsible: seven days. */
|
|
6
|
+
export const RUN_REQUEST_TTL_MS = 7 * 24 * 60 * 60 * 1000;
|
|
7
|
+
/** How many requests one sweep expires at most; the next sweep takes the rest. */
|
|
8
|
+
const EXPIRE_BATCH = 100;
|
|
9
|
+
export function runRequestsRepo(conn) {
|
|
10
|
+
return conn.repository('agRunRequests');
|
|
11
|
+
}
|
|
12
|
+
export function toRunRequest(record) {
|
|
13
|
+
return {
|
|
14
|
+
id: record.id,
|
|
15
|
+
agentId: record.agentId,
|
|
16
|
+
subject: { kind: record.subjectKind, id: record.subjectId },
|
|
17
|
+
threadScope: record.threadScope,
|
|
18
|
+
responsibleUserId: record.responsibleUserId,
|
|
19
|
+
requestedByUserId: record.requestedByUserId,
|
|
20
|
+
ownerUserId: record.ownerUserId,
|
|
21
|
+
fireAt: record.fireAt,
|
|
22
|
+
maxAttempts: record.maxAttempts === null ? null : Number(record.maxAttempts),
|
|
23
|
+
input: {
|
|
24
|
+
type: record.inputType,
|
|
25
|
+
actor: {
|
|
26
|
+
kind: record.inputActorKind,
|
|
27
|
+
id: record.inputActorId,
|
|
28
|
+
name: record.inputActorName,
|
|
29
|
+
},
|
|
30
|
+
text: record.inputText,
|
|
31
|
+
payload: record.inputPayload ?? null,
|
|
32
|
+
},
|
|
33
|
+
status: record.status,
|
|
34
|
+
settledById: record.settledById,
|
|
35
|
+
settledAt: record.settledAt,
|
|
36
|
+
note: record.note,
|
|
37
|
+
expiresAt: record.expiresAt,
|
|
38
|
+
runId: record.runId,
|
|
39
|
+
supersededById: record.supersededById,
|
|
40
|
+
createdAt: record.createdAt,
|
|
41
|
+
updatedAt: record.updatedAt,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Stores a pending request in `unit` and announces it; it expires `RUN_REQUEST_TTL_MS` from now. */
|
|
45
|
+
export async function insertRunRequest(unit, deps, request) {
|
|
46
|
+
const now = deps.clock.now();
|
|
47
|
+
const fireAt = request.fireAt === null ? null : new Date(request.fireAt).getTime();
|
|
48
|
+
// Serializes retries for this agent; duplicate input never creates another inbox entry or renews its expiry.
|
|
49
|
+
await lockAgentForClaim(unit.conn, request.agentId, now.toISOString());
|
|
50
|
+
const pending = await runRequestsRepo(unit.conn).findMany({
|
|
51
|
+
filter: {
|
|
52
|
+
agentId: request.agentId,
|
|
53
|
+
subjectKind: request.subject.kind,
|
|
54
|
+
subjectId: request.subject.id,
|
|
55
|
+
threadScope: request.threadScope,
|
|
56
|
+
responsibleUserId: request.responsibleUserId,
|
|
57
|
+
requestedByUserId: request.requestedByUserId,
|
|
58
|
+
status: 'pending',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const duplicate = pending.find((record) => Date.parse(record.expiresAt) > now.getTime() &&
|
|
62
|
+
record.ownerUserId === request.ownerUserId &&
|
|
63
|
+
Number(record.priority) === request.priority &&
|
|
64
|
+
isDeepStrictEqual(stringArray(record.requires), cleanList([...request.requires])) &&
|
|
65
|
+
(record.fireAt === null ? null : new Date(record.fireAt).getTime()) ===
|
|
66
|
+
fireAt &&
|
|
67
|
+
(record.maxAttempts === null ? null : Number(record.maxAttempts)) ===
|
|
68
|
+
request.maxAttempts &&
|
|
69
|
+
record.inputType === request.input.type &&
|
|
70
|
+
record.inputActorKind === request.input.actor.kind &&
|
|
71
|
+
record.inputActorId === request.input.actor.id &&
|
|
72
|
+
record.inputActorName === request.input.actor.name &&
|
|
73
|
+
record.inputText === request.input.text &&
|
|
74
|
+
isDeepStrictEqual(record.inputPayload ?? null, asJson(request.input.payload)));
|
|
75
|
+
if (duplicate)
|
|
76
|
+
return toRunRequest(duplicate);
|
|
77
|
+
const id = deps.ids.next();
|
|
78
|
+
await runRequestsRepo(unit.conn).createOne({
|
|
79
|
+
values: {
|
|
80
|
+
id,
|
|
81
|
+
agentId: request.agentId,
|
|
82
|
+
subjectKind: request.subject.kind,
|
|
83
|
+
subjectId: request.subject.id,
|
|
84
|
+
threadScope: request.threadScope,
|
|
85
|
+
responsibleUserId: request.responsibleUserId,
|
|
86
|
+
requestedByUserId: request.requestedByUserId,
|
|
87
|
+
ownerUserId: request.ownerUserId,
|
|
88
|
+
priority: request.priority,
|
|
89
|
+
requires: cleanList([...request.requires]),
|
|
90
|
+
fireAt: request.fireAt,
|
|
91
|
+
maxAttempts: request.maxAttempts,
|
|
92
|
+
inputType: request.input.type,
|
|
93
|
+
inputActorKind: request.input.actor.kind,
|
|
94
|
+
inputActorId: request.input.actor.id,
|
|
95
|
+
inputActorName: request.input.actor.name,
|
|
96
|
+
inputText: request.input.text,
|
|
97
|
+
inputPayload: asJson(request.input.payload),
|
|
98
|
+
status: 'pending',
|
|
99
|
+
settledById: null,
|
|
100
|
+
settledAt: null,
|
|
101
|
+
note: null,
|
|
102
|
+
expiresAt: new Date(now.getTime() + RUN_REQUEST_TTL_MS).toISOString(),
|
|
103
|
+
runId: null,
|
|
104
|
+
supersededById: null,
|
|
105
|
+
createdAt: now.toISOString(),
|
|
106
|
+
updatedAt: now.toISOString(),
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
const created = toRunRequest((await runRequestsRepo(unit.conn).findOne({ filter: { id } })));
|
|
110
|
+
unit.emit({ type: 'runRequest.created', request: created });
|
|
111
|
+
return created;
|
|
112
|
+
}
|
|
113
|
+
function settled(record, status = record.status) {
|
|
114
|
+
return precondition('RUN_REQUEST_SETTLED', status === 'expired'
|
|
115
|
+
? 'The request expired.'
|
|
116
|
+
: `The request is ${status} already.`, { status });
|
|
117
|
+
}
|
|
118
|
+
export function createRunRequestService(deps) {
|
|
119
|
+
const { tx, clock } = deps;
|
|
120
|
+
const require = async (conn, id) => {
|
|
121
|
+
const record = await runRequestsRepo(conn).findOne({ filter: { id } });
|
|
122
|
+
if (!record)
|
|
123
|
+
throw notFound('Run request');
|
|
124
|
+
return record;
|
|
125
|
+
};
|
|
126
|
+
/** Whether a pending request's time ran out, whether or not the sweeper has noticed yet. */
|
|
127
|
+
const isDue = (record) => Date.parse(record.expiresAt) <= clock.now().getTime();
|
|
128
|
+
/**
|
|
129
|
+
* Expires a pending request whose time ran out and tells the person who asked; false when something else moved it
|
|
130
|
+
* first. The sweeper's pass and every other path that finds one due go through here.
|
|
131
|
+
*/
|
|
132
|
+
async function expire(unit, record, reason = 'timeout') {
|
|
133
|
+
const result = await runRequestsRepo(unit.conn).updateMany({
|
|
134
|
+
filter: (f) => f.and([f.string('id').eq(record.id), f.string('status').eq('pending')]),
|
|
135
|
+
values: { status: 'expired', updatedAt: clock.now().toISOString() },
|
|
136
|
+
});
|
|
137
|
+
if (result.updatedCount !== 1)
|
|
138
|
+
return false;
|
|
139
|
+
const request = toRunRequest(await require(unit.conn, record.id));
|
|
140
|
+
unit.emit({ type: 'runRequest.expired', request });
|
|
141
|
+
const agentName = (await findAgent(unit.conn, record.agentId))?.name ?? record.agentId;
|
|
142
|
+
unit.emit({
|
|
143
|
+
type: 'notice',
|
|
144
|
+
notice: {
|
|
145
|
+
key: `run_request_expired:${record.id}`,
|
|
146
|
+
type: 'run_request_expired',
|
|
147
|
+
userIds: [record.requestedByUserId],
|
|
148
|
+
subject: { kind: 'runRequest', id: record.id, label: agentName },
|
|
149
|
+
title: `${agentName} did not run your request`,
|
|
150
|
+
body: `${reason === 'timeout' ? 'Nobody confirmed your request in time' : 'The new responsible cannot run your request'}, so your request to ${agentName} on ${record.subjectKind} ${record.subjectId} expired. You can still run it as yourself, on your own runner or a team runner.`,
|
|
151
|
+
params: {
|
|
152
|
+
agentName,
|
|
153
|
+
subjectKind: record.subjectKind,
|
|
154
|
+
subjectId: record.subjectId,
|
|
155
|
+
requestId: record.id,
|
|
156
|
+
responsibleUserId: record.responsibleUserId,
|
|
157
|
+
reason,
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
});
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
const requirePending = (record) => {
|
|
164
|
+
if (record.status !== 'pending')
|
|
165
|
+
throw settled(record);
|
|
166
|
+
if (isDue(record))
|
|
167
|
+
throw settled(record, 'expired');
|
|
168
|
+
};
|
|
169
|
+
async function requireCurrentResponsible(unit, record, byUserId) {
|
|
170
|
+
const current = await deps.currentResponsible?.(unit, {
|
|
171
|
+
kind: record.subjectKind,
|
|
172
|
+
id: record.subjectId,
|
|
173
|
+
});
|
|
174
|
+
if (current !== undefined && current !== byUserId)
|
|
175
|
+
throw forbidden('You no longer answer for this subject.');
|
|
176
|
+
}
|
|
177
|
+
/** Moves a pending request on, once: a concurrent change that moved it first wins. */
|
|
178
|
+
async function settle(unit, record, values) {
|
|
179
|
+
const result = await runRequestsRepo(unit.conn).updateMany({
|
|
180
|
+
filter: (f) => f.and([f.string('id').eq(record.id), f.string('status').eq('pending')]),
|
|
181
|
+
values: { ...values, updatedAt: clock.now().toISOString() },
|
|
182
|
+
});
|
|
183
|
+
if (result.updatedCount !== 1)
|
|
184
|
+
throw conflict('The request changed; read it again.');
|
|
185
|
+
return require(unit.conn, record.id);
|
|
186
|
+
}
|
|
187
|
+
async function setRun(unit, id, runId) {
|
|
188
|
+
await runRequestsRepo(unit.conn).updateMany({
|
|
189
|
+
filter: { id },
|
|
190
|
+
values: { runId, updatedAt: clock.now().toISOString() },
|
|
191
|
+
});
|
|
192
|
+
return require(unit.conn, id);
|
|
193
|
+
}
|
|
194
|
+
const inputOf = (record) => {
|
|
195
|
+
const view = toRunRequest(record).input;
|
|
196
|
+
return {
|
|
197
|
+
type: view.type,
|
|
198
|
+
actor: view.actor,
|
|
199
|
+
text: view.text,
|
|
200
|
+
...(view.payload === null ? {} : { payload: view.payload }),
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
const workOf = (record, agent) => ({
|
|
204
|
+
agent,
|
|
205
|
+
subject: { kind: record.subjectKind, id: record.subjectId },
|
|
206
|
+
threadScope: record.threadScope,
|
|
207
|
+
ownerUserId: record.ownerUserId,
|
|
208
|
+
priority: Number(record.priority),
|
|
209
|
+
requires: stringArray(record.requires),
|
|
210
|
+
fireAt: record.fireAt,
|
|
211
|
+
maxAttempts: record.maxAttempts === null ? null : Number(record.maxAttempts),
|
|
212
|
+
input: inputOf(record),
|
|
213
|
+
});
|
|
214
|
+
async function itemsOf(records) {
|
|
215
|
+
const conn = tx.read();
|
|
216
|
+
const names = await deps.people.names(conn, [
|
|
217
|
+
...new Set(records.flatMap((record) => [
|
|
218
|
+
record.responsibleUserId,
|
|
219
|
+
record.requestedByUserId,
|
|
220
|
+
])),
|
|
221
|
+
]);
|
|
222
|
+
const agents = new Map();
|
|
223
|
+
for (const record of records)
|
|
224
|
+
if (!agents.has(record.agentId))
|
|
225
|
+
agents.set(record.agentId, (await findAgent(conn, record.agentId))?.name ?? null);
|
|
226
|
+
return records.map((record) => ({
|
|
227
|
+
...toRunRequest(record),
|
|
228
|
+
agentName: agents.get(record.agentId) ?? null,
|
|
229
|
+
responsibleName: names.get(record.responsibleUserId) ?? null,
|
|
230
|
+
requestedByName: names.get(record.requestedByUserId) ?? null,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
async get(requestId) {
|
|
235
|
+
const [item] = await itemsOf([await require(tx.read(), requestId)]);
|
|
236
|
+
return item;
|
|
237
|
+
},
|
|
238
|
+
async list(filter) {
|
|
239
|
+
const records = await runRequestsRepo(tx.read()).findMany({
|
|
240
|
+
filter: (f) => f.and([
|
|
241
|
+
filter.role === 'responsible'
|
|
242
|
+
? f.string('responsibleUserId').eq(filter.userId)
|
|
243
|
+
: filter.role === 'requester'
|
|
244
|
+
? f.string('requestedByUserId').eq(filter.userId)
|
|
245
|
+
: f.or([
|
|
246
|
+
f.string('responsibleUserId').eq(filter.userId),
|
|
247
|
+
f.string('requestedByUserId').eq(filter.userId),
|
|
248
|
+
]),
|
|
249
|
+
...(filter.status ? [f.string('status').eq(filter.status)] : []),
|
|
250
|
+
...(filter.subject
|
|
251
|
+
? [f.string('subjectKind').eq(filter.subject.kind)]
|
|
252
|
+
: []),
|
|
253
|
+
...(filter.subject?.id
|
|
254
|
+
? [f.string('subjectId').eq(filter.subject.id)]
|
|
255
|
+
: []),
|
|
256
|
+
...(filter.agentId ? [f.string('agentId').eq(filter.agentId)] : []),
|
|
257
|
+
]),
|
|
258
|
+
sort: (sort) => [
|
|
259
|
+
sort.field('createdAt').desc(),
|
|
260
|
+
sort.field('id').desc(),
|
|
261
|
+
],
|
|
262
|
+
limit: Math.min(Math.max(filter.limit ?? 50, 1), 201),
|
|
263
|
+
...(filter.cursor ? { cursor: filter.cursor } : {}),
|
|
264
|
+
});
|
|
265
|
+
return itemsOf(records);
|
|
266
|
+
},
|
|
267
|
+
async pendingOn(conn, subject, agentId) {
|
|
268
|
+
const records = await runRequestsRepo(conn).findMany({
|
|
269
|
+
filter: (f) => f.and([
|
|
270
|
+
f.string('subjectKind').eq(subject.kind),
|
|
271
|
+
f.string('subjectId').eq(subject.id),
|
|
272
|
+
f.string('status').eq('pending'),
|
|
273
|
+
...(agentId ? [f.string('agentId').eq(agentId)] : []),
|
|
274
|
+
]),
|
|
275
|
+
sort: (sort) => [sort.field('createdAt').asc(), sort.field('id').asc()],
|
|
276
|
+
});
|
|
277
|
+
return records.map(toRunRequest);
|
|
278
|
+
},
|
|
279
|
+
confirm: (requestId, byUserId) => tx.run(async (unit) => {
|
|
280
|
+
const record = await require(unit.conn, requestId);
|
|
281
|
+
if (record.responsibleUserId !== byUserId)
|
|
282
|
+
throw forbidden('Only the person who answers for the subject may confirm this request.');
|
|
283
|
+
requirePending(record);
|
|
284
|
+
await requireCurrentResponsible(unit, record, byUserId);
|
|
285
|
+
// Confirming runs the work as them: they must still be able to wake the agent.
|
|
286
|
+
const agent = await deps.requireInvocable(unit, record.agentId, byUserId);
|
|
287
|
+
await settle(unit, record, {
|
|
288
|
+
status: 'confirmed',
|
|
289
|
+
settledById: byUserId,
|
|
290
|
+
settledAt: clock.now().toISOString(),
|
|
291
|
+
});
|
|
292
|
+
const run = await deps.direct(unit, {
|
|
293
|
+
...workOf(record, agent),
|
|
294
|
+
actorUserId: record.responsibleUserId,
|
|
295
|
+
requestedByUserId: record.requestedByUserId,
|
|
296
|
+
confirmedByUserId: byUserId,
|
|
297
|
+
});
|
|
298
|
+
const request = toRunRequest(await setRun(unit, record.id, run.runId));
|
|
299
|
+
unit.emit({ type: 'runRequest.confirmed', request });
|
|
300
|
+
return { request, run };
|
|
301
|
+
}),
|
|
302
|
+
reject: (requestId, byUserId, note) => tx.run(async (unit) => {
|
|
303
|
+
const record = await require(unit.conn, requestId);
|
|
304
|
+
if (record.responsibleUserId !== byUserId)
|
|
305
|
+
throw forbidden('Only the person who answers for the subject may reject this request.');
|
|
306
|
+
requirePending(record);
|
|
307
|
+
await requireCurrentResponsible(unit, record, byUserId);
|
|
308
|
+
const request = toRunRequest(await settle(unit, record, {
|
|
309
|
+
status: 'rejected',
|
|
310
|
+
settledById: byUserId,
|
|
311
|
+
settledAt: clock.now().toISOString(),
|
|
312
|
+
note: note ?? null,
|
|
313
|
+
}));
|
|
314
|
+
unit.emit({ type: 'runRequest.rejected', request });
|
|
315
|
+
return request;
|
|
316
|
+
}),
|
|
317
|
+
withdraw: (requestId, byUserId) => tx.run(async (unit) => {
|
|
318
|
+
const record = await require(unit.conn, requestId);
|
|
319
|
+
if (record.requestedByUserId !== byUserId)
|
|
320
|
+
throw forbidden('Only the person who asked may withdraw this request.');
|
|
321
|
+
requirePending(record);
|
|
322
|
+
const request = toRunRequest(await settle(unit, record, {
|
|
323
|
+
status: 'withdrawn',
|
|
324
|
+
settledById: byUserId,
|
|
325
|
+
settledAt: clock.now().toISOString(),
|
|
326
|
+
}));
|
|
327
|
+
unit.emit({ type: 'runRequest.withdrawn', request });
|
|
328
|
+
return request;
|
|
329
|
+
}),
|
|
330
|
+
runAsRequester: (requestId, byUserId) => tx.run(async (unit) => {
|
|
331
|
+
const record = await require(unit.conn, requestId);
|
|
332
|
+
if (record.requestedByUserId !== byUserId)
|
|
333
|
+
throw forbidden('Only the person who asked may run this request as themselves.');
|
|
334
|
+
// An expired request that went nowhere may still be run this way: that is what its expiry notice offers.
|
|
335
|
+
const expired = record.status === 'expired' ||
|
|
336
|
+
(record.status === 'pending' && isDue(record));
|
|
337
|
+
if (!(record.status === 'pending' || record.status === 'expired') ||
|
|
338
|
+
record.runId)
|
|
339
|
+
throw settled(record);
|
|
340
|
+
const agent = await deps.requireInvocable(unit, record.agentId, byUserId);
|
|
341
|
+
const work = workOf(record, agent);
|
|
342
|
+
await deps.requireRunnerFor(unit, agent, byUserId, work.requires);
|
|
343
|
+
if (record.status === 'pending')
|
|
344
|
+
await settle(unit, record, {
|
|
345
|
+
status: expired ? 'expired' : 'withdrawn',
|
|
346
|
+
settledById: expired ? null : byUserId,
|
|
347
|
+
settledAt: expired ? null : clock.now().toISOString(),
|
|
348
|
+
});
|
|
349
|
+
else {
|
|
350
|
+
// Only once: a second attempt finds the run set.
|
|
351
|
+
const result = await runRequestsRepo(unit.conn).updateMany({
|
|
352
|
+
filter: (f) => f.and([f.string('id').eq(record.id), f.string('runId').eq(null)]),
|
|
353
|
+
values: { updatedAt: clock.now().toISOString() },
|
|
354
|
+
});
|
|
355
|
+
if (result.updatedCount !== 1)
|
|
356
|
+
throw conflict('The request changed; read it again.');
|
|
357
|
+
}
|
|
358
|
+
const run = await deps.direct(unit, {
|
|
359
|
+
...work,
|
|
360
|
+
actorUserId: byUserId,
|
|
361
|
+
requestedByUserId: byUserId,
|
|
362
|
+
confirmedByUserId: null,
|
|
363
|
+
});
|
|
364
|
+
const request = toRunRequest(await setRun(unit, record.id, run.runId));
|
|
365
|
+
if (record.status === 'pending')
|
|
366
|
+
unit.emit({
|
|
367
|
+
type: expired ? 'runRequest.expired' : 'runRequest.withdrawn',
|
|
368
|
+
request,
|
|
369
|
+
});
|
|
370
|
+
return { request, run };
|
|
371
|
+
}),
|
|
372
|
+
reassign: (request, outer) => tx.run(async (unit) => {
|
|
373
|
+
const pending = await runRequestsRepo(unit.conn).findMany({
|
|
374
|
+
filter: (f) => f.and([
|
|
375
|
+
f.string('subjectKind').eq(request.subject.kind),
|
|
376
|
+
f.string('subjectId').eq(request.subject.id),
|
|
377
|
+
f.string('status').eq('pending'),
|
|
378
|
+
...(request.agentId
|
|
379
|
+
? [f.string('agentId').eq(request.agentId)]
|
|
380
|
+
: []),
|
|
381
|
+
]),
|
|
382
|
+
sort: (sort) => [
|
|
383
|
+
sort.field('createdAt').asc(),
|
|
384
|
+
sort.field('id').asc(),
|
|
385
|
+
],
|
|
386
|
+
});
|
|
387
|
+
const superseded = [];
|
|
388
|
+
const created = [];
|
|
389
|
+
const queued = [];
|
|
390
|
+
const expired = [];
|
|
391
|
+
for (const record of pending) {
|
|
392
|
+
// Its time ran out before the sweeper noticed: it expires now, as confirming would find, rather than being
|
|
393
|
+
// handed on with a fresh expiry or queued.
|
|
394
|
+
if (isDue(record)) {
|
|
395
|
+
if (await expire(unit, record))
|
|
396
|
+
expired.push(toRunRequest(await require(unit.conn, record.id)));
|
|
397
|
+
continue;
|
|
398
|
+
}
|
|
399
|
+
if (record.responsibleUserId === request.toUserId)
|
|
400
|
+
continue;
|
|
401
|
+
const agent = request.toUserId
|
|
402
|
+
? await findAgent(unit.conn, record.agentId)
|
|
403
|
+
: undefined;
|
|
404
|
+
const usable = request.toUserId &&
|
|
405
|
+
agent &&
|
|
406
|
+
!agent.archivedAt &&
|
|
407
|
+
deps.mayInvoke(agent, request.toUserId);
|
|
408
|
+
if (!usable) {
|
|
409
|
+
if (await expire(unit, record, 'reassignment'))
|
|
410
|
+
expired.push(toRunRequest(await require(unit.conn, record.id)));
|
|
411
|
+
continue;
|
|
412
|
+
}
|
|
413
|
+
await settle(unit, record, {
|
|
414
|
+
status: 'superseded',
|
|
415
|
+
settledById: request.byUserId,
|
|
416
|
+
settledAt: clock.now().toISOString(),
|
|
417
|
+
note: request.note ?? null,
|
|
418
|
+
});
|
|
419
|
+
if (usable && record.requestedByUserId === request.toUserId) {
|
|
420
|
+
// The new responsible asked for it: their own work needs nobody's confirmation.
|
|
421
|
+
queued.push(await deps.direct(unit, {
|
|
422
|
+
...workOf(record, agent),
|
|
423
|
+
actorUserId: request.toUserId,
|
|
424
|
+
requestedByUserId: request.toUserId,
|
|
425
|
+
confirmedByUserId: null,
|
|
426
|
+
}));
|
|
427
|
+
}
|
|
428
|
+
else if (usable) {
|
|
429
|
+
const next = await insertRunRequest(unit, deps, {
|
|
430
|
+
agentId: record.agentId,
|
|
431
|
+
subject: { kind: record.subjectKind, id: record.subjectId },
|
|
432
|
+
threadScope: record.threadScope,
|
|
433
|
+
responsibleUserId: request.toUserId,
|
|
434
|
+
requestedByUserId: record.requestedByUserId,
|
|
435
|
+
ownerUserId: record.ownerUserId,
|
|
436
|
+
priority: Number(record.priority),
|
|
437
|
+
requires: stringArray(record.requires),
|
|
438
|
+
fireAt: record.fireAt,
|
|
439
|
+
maxAttempts: record.maxAttempts === null ? null : Number(record.maxAttempts),
|
|
440
|
+
input: inputOf(record),
|
|
441
|
+
});
|
|
442
|
+
created.push(next);
|
|
443
|
+
await runRequestsRepo(unit.conn).updateMany({
|
|
444
|
+
filter: { id: record.id },
|
|
445
|
+
values: { supersededById: next.id },
|
|
446
|
+
});
|
|
447
|
+
}
|
|
448
|
+
const done = toRunRequest(await require(unit.conn, record.id));
|
|
449
|
+
superseded.push(done);
|
|
450
|
+
unit.emit({ type: 'runRequest.superseded', request: done });
|
|
451
|
+
}
|
|
452
|
+
return { superseded, created, queued, expired };
|
|
453
|
+
}, outer),
|
|
454
|
+
async expireDue() {
|
|
455
|
+
const due = await runRequestsRepo(tx.read()).findMany({
|
|
456
|
+
filter: (f) => f.and([
|
|
457
|
+
f.string('status').eq('pending'),
|
|
458
|
+
f.date('expiresAt').notAfter(clock.now()),
|
|
459
|
+
]),
|
|
460
|
+
sort: (sort) => [sort.field('expiresAt').asc(), sort.field('id').asc()],
|
|
461
|
+
limit: EXPIRE_BATCH,
|
|
462
|
+
});
|
|
463
|
+
let expired = 0;
|
|
464
|
+
for (const record of due)
|
|
465
|
+
if (await tx.run((unit) => expire(unit, record)))
|
|
466
|
+
expired += 1;
|
|
467
|
+
return expired;
|
|
468
|
+
},
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
//# sourceMappingURL=run-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-requests.js","sourceRoot":"","sources":["../../../../server/core/runs/run-requests.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,18 +3,22 @@
|
|
|
3
3
|
* cancelling and retrying, and reading runs and their transcripts. Who may read or change a run is decided by the
|
|
4
4
|
* callers (the admin routes, the application); this service checks only that the person who wakes an agent may wake it.
|
|
5
5
|
*
|
|
6
|
-
* Work is keyed by (agent, subject, thread). New work for a key joins the run already working on it
|
|
7
|
-
* still be told (dispatched, or running with input), else
|
|
6
|
+
* Work is keyed by (agent, subject, thread). New work for a key joins the run already working on it as the same person
|
|
7
|
+
* while it can still be told (dispatched, or running with input), else that person's run waiting for it (queued), else
|
|
8
|
+
* starts a new run. Runs of one key working as different people are claimed one at a time (`claim.ts`).
|
|
8
9
|
*/
|
|
9
10
|
import { type ActorRef, type RunInput, type RunInputType, type RunnerFeature, type RunSelf, type RunStatus } from '@nocobase/agent-protocol';
|
|
10
11
|
import type { Runner } from '../../../shared/runners.js';
|
|
11
12
|
import type { DatabaseConnection } from '@nocobase/db';
|
|
12
13
|
import type { RunBrief } from '../../../shared/briefs.js';
|
|
13
|
-
import type { Run, RunDetail, RunEventPage, Workload, WorkloadQuery } from '../../../shared/runs.js';
|
|
14
|
+
import type { Run, RunDetail, RunEventPage, RunExecution, Workload, WorkloadQuery } from '../../../shared/runs.js';
|
|
14
15
|
import type { Clock } from '../../kernel/clock.js';
|
|
16
|
+
import type { People } from '../../kernel/people.js';
|
|
15
17
|
import type { IdSource } from '../../kernel/ids.js';
|
|
16
18
|
import type { Tx, TxRunner } from '../../kernel/tx.js';
|
|
17
19
|
import type { AgentService } from '../agents/index.js';
|
|
20
|
+
import type { ClaimEligibility } from './eligibility.js';
|
|
21
|
+
import { type RunRequestService } from './run-requests.js';
|
|
18
22
|
import { type RunTokenIdentity } from './run-tokens.js';
|
|
19
23
|
import { type SubjectRegistry } from './ports.js';
|
|
20
24
|
import { type WorkloadRunners } from './workload.js';
|
|
@@ -34,8 +38,35 @@ export interface EnqueueRequest {
|
|
|
34
38
|
};
|
|
35
39
|
/** Separates conversations about one subject; `main` by default. */
|
|
36
40
|
readonly threadScope?: string;
|
|
37
|
-
/**
|
|
38
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Who woke the agent, for work on a subject nobody answers for (no `responsibleUserId`): their permissions bound the
|
|
43
|
+
* run. With a `responsibleUserId` the run acts as the responsible, or as the source under `execution` `mine`, and
|
|
44
|
+
* this is read only as the source when `requestedByUserId` is left out.
|
|
45
|
+
*/
|
|
46
|
+
readonly actorUserId?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Who answers for the subject (an issue's owner, say). Work whose source is someone else is not queued: it becomes a
|
|
49
|
+
* run request the responsible confirms (`outcome` `pending`), unless `execution` is `mine`. Left out, work is queued
|
|
50
|
+
* as `actorUserId`, as before.
|
|
51
|
+
*/
|
|
52
|
+
readonly responsibleUserId?: string | null;
|
|
53
|
+
/**
|
|
54
|
+
* The source of the chain of work: the person whose action woke the agent. `actorUserId`, else the responsible, by
|
|
55
|
+
* default; `causedByRunId` overrides it.
|
|
56
|
+
*/
|
|
57
|
+
readonly requestedByUserId?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Work a run caused (its own action woke an agent, such as a status it changed): the source is that run's, not the
|
|
60
|
+
* person who answers for the subject, so a chain somebody else started never runs as the responsible without their
|
|
61
|
+
* confirmation. The run's source is who confirmed it, else who it was requested by.
|
|
62
|
+
*/
|
|
63
|
+
readonly causedByRunId?: string;
|
|
64
|
+
/**
|
|
65
|
+
* How work whose source is not the responsible runs: `auto` (the default) asks the responsible to confirm it;
|
|
66
|
+
* `mine` queues it at once as the source, on a runner they may use (their own or a team runner), refused with
|
|
67
|
+
* `NO_RUNNER_AVAILABLE` when there is none now. Ignored when the source is the responsible or there is none.
|
|
68
|
+
*/
|
|
69
|
+
readonly execution?: RunExecution;
|
|
39
70
|
readonly ownerUserId?: string | null;
|
|
40
71
|
/** Lower runs first; 0 by default. Work merged into a waiting run raises it to the more urgent of the two. */
|
|
41
72
|
readonly priority?: number;
|
|
@@ -55,13 +86,28 @@ export interface EnqueueRequest {
|
|
|
55
86
|
readonly maxAttempts?: number;
|
|
56
87
|
readonly input: NewInput;
|
|
57
88
|
}
|
|
58
|
-
|
|
89
|
+
/** Work that was queued. */
|
|
90
|
+
export interface RunEnqueued {
|
|
59
91
|
readonly runId: string;
|
|
60
92
|
/** `created` a new run, `merged` into a queued one, `appended` to one a runner holds. */
|
|
61
93
|
readonly outcome: 'created' | 'merged' | 'appended';
|
|
62
94
|
readonly status: RunStatus;
|
|
63
95
|
readonly inputId: string;
|
|
64
96
|
}
|
|
97
|
+
/** Work that waits for the subject's responsible to confirm it: a run request (`runs.requests`), and no run yet. */
|
|
98
|
+
export interface RunRequestPending {
|
|
99
|
+
readonly outcome: 'pending';
|
|
100
|
+
readonly requestId: string;
|
|
101
|
+
readonly status: 'pending';
|
|
102
|
+
readonly runId: null;
|
|
103
|
+
readonly inputId: null;
|
|
104
|
+
}
|
|
105
|
+
export type EnqueueResult = RunEnqueued | RunRequestPending;
|
|
106
|
+
/**
|
|
107
|
+
* The run work went into, for a caller that names no responsible (a conversation, a consultation): such work is never
|
|
108
|
+
* pending, so a pending result is a programming error.
|
|
109
|
+
*/
|
|
110
|
+
export declare function queuedRun(result: EnqueueResult): RunEnqueued;
|
|
65
111
|
export interface RunFilter {
|
|
66
112
|
readonly subjectKind?: string;
|
|
67
113
|
readonly subjectId?: string;
|
|
@@ -77,8 +123,14 @@ export interface RunFilter {
|
|
|
77
123
|
};
|
|
78
124
|
}
|
|
79
125
|
export interface RunService {
|
|
80
|
-
/**
|
|
126
|
+
/**
|
|
127
|
+
* Queues work for an agent, or, when someone other than the subject's responsible caused it, asks the responsible
|
|
128
|
+
* to confirm it first (`outcome` `pending`). In `outer`, joins the caller's transaction (the caller publishes its
|
|
129
|
+
* events).
|
|
130
|
+
*/
|
|
81
131
|
enqueue(request: EnqueueRequest, outer?: Tx): Promise<EnqueueResult>;
|
|
132
|
+
/** Work waiting for the subject's responsible to confirm it: confirming, rejecting, withdrawing, handing it on. */
|
|
133
|
+
readonly requests: RunRequestService;
|
|
82
134
|
/** Adds input to a run that has not ended. */
|
|
83
135
|
addInput(runId: string, input: NewInput, outer?: Tx): Promise<string>;
|
|
84
136
|
/** A queued run ends at once; a held one is asked to stop. In `outer`, joins the caller's transaction. */
|
|
@@ -162,6 +214,10 @@ export interface RunServiceDeps extends TransitionDeps {
|
|
|
162
214
|
readonly runners: WorkloadRunners & {
|
|
163
215
|
find(conn: DatabaseConnection, id: string): Promise<Runner | null>;
|
|
164
216
|
};
|
|
217
|
+
/** Whether a runner would take work run as a person, for work someone asks to run as themselves. */
|
|
218
|
+
readonly eligibility: Pick<ClaimEligibility, 'canClaim'>;
|
|
219
|
+
/** Names of people, for the lists of run requests. */
|
|
220
|
+
readonly people: Pick<People, 'names'>;
|
|
165
221
|
}
|
|
166
222
|
export declare function createRunService(deps: RunServiceDeps): RunService;
|
|
167
223
|
//# sourceMappingURL=run.service.d.ts.map
|