@nocobase/app-plugin-agents 0.1.0-beta.5 → 0.1.0-beta.6

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.
Files changed (133) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +36 -21
  3. package/dist/client/chat.d.ts +2 -0
  4. package/dist/client/chat.d.ts.map +1 -1
  5. package/dist/client/chat.js +2 -0
  6. package/dist/client/chat.js.map +1 -1
  7. package/dist/client/locales/en-US.d.ts +3 -0
  8. package/dist/client/locales/en-US.d.ts.map +1 -1
  9. package/dist/client/locales/en-US.js +3 -0
  10. package/dist/client/locales/en-US.js.map +1 -1
  11. package/dist/client/locales/runtimes.en-US.d.ts +37 -0
  12. package/dist/client/locales/runtimes.en-US.d.ts.map +1 -1
  13. package/dist/client/locales/runtimes.en-US.js +37 -0
  14. package/dist/client/locales/runtimes.en-US.js.map +1 -1
  15. package/dist/client/locales/runtimes.zh-CN.d.ts.map +1 -1
  16. package/dist/client/locales/runtimes.zh-CN.js +37 -0
  17. package/dist/client/locales/runtimes.zh-CN.js.map +1 -1
  18. package/dist/client/locales/zh-CN.d.ts.map +1 -1
  19. package/dist/client/locales/zh-CN.js +3 -0
  20. package/dist/client/locales/zh-CN.js.map +1 -1
  21. package/dist/client/pages/runtimes/index.d.ts.map +1 -1
  22. package/dist/client/pages/runtimes/index.js +2 -1
  23. package/dist/client/pages/runtimes/index.js.map +1 -1
  24. package/dist/client/pages/runtimes/runner-sheet.d.ts.map +1 -1
  25. package/dist/client/pages/runtimes/runner-sheet.js +2 -1
  26. package/dist/client/pages/runtimes/runner-sheet.js.map +1 -1
  27. package/dist/client/pages/runtimes/workspace-diagnostics.d.ts +9 -0
  28. package/dist/client/pages/runtimes/workspace-diagnostics.d.ts.map +1 -0
  29. package/dist/client/pages/runtimes/workspace-diagnostics.js +58 -0
  30. package/dist/client/pages/runtimes/workspace-diagnostics.js.map +1 -0
  31. package/dist/client/runs/subject-runs.d.ts.map +1 -1
  32. package/dist/client/runs/subject-runs.js +2 -3
  33. package/dist/client/runs/subject-runs.js.map +1 -1
  34. package/dist/database/migrations/.manifest.json +8 -0
  35. package/dist/database/migrations/202610100002_ag_add_run_git_credentials.d.ts +9 -0
  36. package/dist/database/migrations/202610100002_ag_add_run_git_credentials.d.ts.map +1 -0
  37. package/dist/database/migrations/202610100002_ag_add_run_git_credentials.js +30 -0
  38. package/dist/database/migrations/202610100002_ag_add_run_git_credentials.js.map +1 -0
  39. package/dist/database/migrations/202610110001_ag_add_fresh_sessions.d.ts +4 -0
  40. package/dist/database/migrations/202610110001_ag_add_fresh_sessions.d.ts.map +1 -0
  41. package/dist/database/migrations/202610110001_ag_add_fresh_sessions.js +23 -0
  42. package/dist/database/migrations/202610110001_ag_add_fresh_sessions.js.map +1 -0
  43. package/dist/package.json +1 -1
  44. package/dist/server/composition.d.ts +3 -1
  45. package/dist/server/composition.d.ts.map +1 -1
  46. package/dist/server/composition.js +18 -2
  47. package/dist/server/composition.js.map +1 -1
  48. package/dist/server/core/runs/claim.d.ts +2 -0
  49. package/dist/server/core/runs/claim.d.ts.map +1 -1
  50. package/dist/server/core/runs/claim.js +53 -7
  51. package/dist/server/core/runs/claim.js.map +1 -1
  52. package/dist/server/core/runs/extensions.d.ts +57 -4
  53. package/dist/server/core/runs/extensions.d.ts.map +1 -1
  54. package/dist/server/core/runs/extensions.js +45 -9
  55. package/dist/server/core/runs/extensions.js.map +1 -1
  56. package/dist/server/core/runs/git-credentials.d.ts +43 -0
  57. package/dist/server/core/runs/git-credentials.d.ts.map +1 -0
  58. package/dist/server/core/runs/git-credentials.js +129 -0
  59. package/dist/server/core/runs/git-credentials.js.map +1 -0
  60. package/dist/server/core/runs/index.d.ts +2 -1
  61. package/dist/server/core/runs/index.d.ts.map +1 -1
  62. package/dist/server/core/runs/index.js +2 -1
  63. package/dist/server/core/runs/index.js.map +1 -1
  64. package/dist/server/core/runs/input-gate.d.ts +34 -0
  65. package/dist/server/core/runs/input-gate.d.ts.map +1 -0
  66. package/dist/server/core/runs/input-gate.js +56 -0
  67. package/dist/server/core/runs/input-gate.js.map +1 -0
  68. package/dist/server/core/runs/lifecycle.d.ts +2 -1
  69. package/dist/server/core/runs/lifecycle.d.ts.map +1 -1
  70. package/dist/server/core/runs/lifecycle.js +27 -8
  71. package/dist/server/core/runs/lifecycle.js.map +1 -1
  72. package/dist/server/core/runs/policy.d.ts +8 -0
  73. package/dist/server/core/runs/policy.d.ts.map +1 -1
  74. package/dist/server/core/runs/policy.js +10 -0
  75. package/dist/server/core/runs/policy.js.map +1 -1
  76. package/dist/server/core/runs/ports.d.ts +30 -3
  77. package/dist/server/core/runs/ports.d.ts.map +1 -1
  78. package/dist/server/core/runs/ports.js.map +1 -1
  79. package/dist/server/core/runs/run-requests.d.ts +3 -0
  80. package/dist/server/core/runs/run-requests.d.ts.map +1 -1
  81. package/dist/server/core/runs/run-requests.js +5 -0
  82. package/dist/server/core/runs/run-requests.js.map +1 -1
  83. package/dist/server/core/runs/run.service.d.ts +5 -1
  84. package/dist/server/core/runs/run.service.d.ts.map +1 -1
  85. package/dist/server/core/runs/run.service.js +51 -3
  86. package/dist/server/core/runs/run.service.js.map +1 -1
  87. package/dist/server/core/runs/run.store.d.ts +5 -0
  88. package/dist/server/core/runs/run.store.d.ts.map +1 -1
  89. package/dist/server/core/runs/run.store.js +7 -0
  90. package/dist/server/core/runs/run.store.js.map +1 -1
  91. package/dist/server/core/runs/runner-view.d.ts +1 -0
  92. package/dist/server/core/runs/runner-view.d.ts.map +1 -1
  93. package/dist/server/core/runs/runner-view.js +2 -1
  94. package/dist/server/core/runs/runner-view.js.map +1 -1
  95. package/dist/server/core/runs/transitions.d.ts +1 -1
  96. package/dist/server/core/runs/transitions.d.ts.map +1 -1
  97. package/dist/server/core/runs/transitions.js +39 -5
  98. package/dist/server/core/runs/transitions.js.map +1 -1
  99. package/dist/server/kernel/redaction.d.ts +2 -0
  100. package/dist/server/kernel/redaction.d.ts.map +1 -1
  101. package/dist/server/kernel/redaction.js +17 -0
  102. package/dist/server/kernel/redaction.js.map +1 -1
  103. package/dist/server/routes/runners/dist.js +1 -1
  104. package/dist/server/routes/runners/dist.js.map +1 -1
  105. package/dist/server/routes/runners/runs.d.ts +1 -1
  106. package/dist/server/routes/runners/runs.d.ts.map +1 -1
  107. package/dist/server/routes/runners/runs.js +23 -3
  108. package/dist/server/routes/runners/runs.js.map +1 -1
  109. package/dist/server/routes/schemas.d.ts.map +1 -1
  110. package/dist/server/routes/schemas.js +17 -2
  111. package/dist/server/routes/schemas.js.map +1 -1
  112. package/dist/server/runners/runner.store.d.ts.map +1 -1
  113. package/dist/server/runners/runner.store.js +13 -3
  114. package/dist/server/runners/runner.store.js.map +1 -1
  115. package/dist/server/runners/workspaces.d.ts +7 -4
  116. package/dist/server/runners/workspaces.d.ts.map +1 -1
  117. package/dist/server/runners/workspaces.js +123 -26
  118. package/dist/server/runners/workspaces.js.map +1 -1
  119. package/dist/server/tokens.d.ts +2 -1
  120. package/dist/server/tokens.d.ts.map +1 -1
  121. package/dist/server/tokens.js +1 -0
  122. package/dist/server/tokens.js.map +1 -1
  123. package/dist/shared/models.js +1 -1
  124. package/dist/shared/models.js.map +1 -1
  125. package/dist/shared/runners.d.ts +6 -2
  126. package/dist/shared/runners.d.ts.map +1 -1
  127. package/dist/shared/runners.js.map +1 -1
  128. package/dist/shared/runs.d.ts +20 -0
  129. package/dist/shared/runs.d.ts.map +1 -1
  130. package/dist/shared/runs.js.map +1 -1
  131. package/package.json +4 -4
  132. package/skills/nocobase-app-plugin-agents/references/extension-points.md +7 -1
  133. package/skills/nocobase-app-plugin-agents/references/runners.md +6 -0
@@ -13,7 +13,10 @@
13
13
  *
14
14
  * - Repository access is asked per run (`forRun`, in the claim's transaction) once the run has repositories to check
15
15
  * out. Its credentials are minted in `prepare` (a network call is fine there), handed to the runner in the payload
16
- * and never stored; the claim remembers them as secrets, so nothing the run reports carries them.
16
+ * and never stored; the claim remembers them as secrets, so nothing the run reports carries them. When the runner
17
+ * asks for credentials on demand (the `gitCredentials` feature, `RepoAccessContext.onDemand`), a provider that can
18
+ * `issue` one lists its repositories in `RunGit.onDemand` instead and mints nothing at the claim: the runner asks
19
+ * for each credential whenever git needs one, for as long as it holds the run (`git-credentials.ts`).
17
20
  *
18
21
  * Inside the claim's transaction a provider reads through the claim's connection only: on SQLite that transaction
19
22
  * holds the one connection there is, so anything else (a person's permissions, another plugin's services) would wait
@@ -104,6 +107,19 @@ export async function mountsFor(conn, registry, context, prepared) {
104
107
  }
105
108
  return { mounts, resumeNotes };
106
109
  }
110
+ /**
111
+ * What a provider throws from `issue` when it cannot give a credential, with a message safe to show the run's people
112
+ * and the agent (no credential, no internal detail): `unavailable` when its code host is down or slow and asking again
113
+ * later may work, `denied` when it will not issue one (no access to the repository, an installation gone).
114
+ */
115
+ export class RepoAccessError extends Error {
116
+ name = 'RepoAccessError';
117
+ kind;
118
+ constructor(kind, message) {
119
+ super(message);
120
+ this.kind = kind;
121
+ }
122
+ }
107
123
  export function createRepoAccessRegistry() {
108
124
  const providers = new Map();
109
125
  return {
@@ -121,7 +137,9 @@ export function createRepoAccessRegistry() {
121
137
  }
122
138
  /**
123
139
  * The run's git, from every provider: the first author given, every trailer and credential in order (one credential
124
- * per URL, the first).
140
+ * per URL, the first). With `context.onDemand`, the URLs any provider lists in `onDemand` (only repositories of the
141
+ * run) are asked for on demand, and no credential of the claim is handed out for them; without it, `onDemand` is
142
+ * dropped.
125
143
  */
126
144
  export async function repoAccessFor(conn, registry, context, prepared) {
127
145
  if (context.repos.length === 0)
@@ -129,6 +147,8 @@ export async function repoAccessFor(conn, registry, context, prepared) {
129
147
  let author;
130
148
  const trailers = [];
131
149
  const credentials = new Map();
150
+ const repoUrls = new Set(context.repos.map((repo) => repo.url));
151
+ const onDemand = new Set();
132
152
  for (const provider of registry?.list() ?? []) {
133
153
  const given = await provider.forRun(conn, context, prepared.get(`repo:${provider.key}`));
134
154
  if (!given)
@@ -140,20 +160,30 @@ export async function repoAccessFor(conn, registry, context, prepared) {
140
160
  for (const credential of given.credentials ?? [])
141
161
  if (!credentials.has(credential.url))
142
162
  credentials.set(credential.url, credential);
163
+ if (context.onDemand)
164
+ for (const url of given.onDemand ?? [])
165
+ if (repoUrls.has(url))
166
+ onDemand.add(url);
143
167
  }
144
- if (!author && trailers.length === 0 && credentials.size === 0)
168
+ for (const url of onDemand)
169
+ credentials.delete(url);
170
+ if (!author &&
171
+ trailers.length === 0 &&
172
+ credentials.size === 0 &&
173
+ onDemand.size === 0)
145
174
  return null;
146
175
  return {
147
176
  ...(author ? { author } : {}),
148
177
  ...(trailers.length > 0 ? { trailers } : {}),
149
178
  ...(credentials.size > 0 ? { credentials: [...credentials.values()] } : {}),
179
+ ...(onDemand.size > 0 ? { onDemand: [...onDemand] } : {}),
150
180
  };
151
181
  }
152
182
  /**
153
183
  * Runs every provider's `prepare` for `run`, outside any transaction. A provider whose preparation fails gets
154
184
  * undefined, and is told so by its own absent answer; the claim goes on.
155
185
  */
156
- export async function prepareExtensions(run, sections, mounts, onError, repoAccess) {
186
+ export async function prepareExtensions(run, sections, mounts, onError, repoAccess, repoOptions = { onDemand: false }) {
157
187
  const prepared = new Map();
158
188
  const hooks = [
159
189
  ...(sections?.list() ?? []).flatMap((provider) => provider.prepare
@@ -166,11 +196,17 @@ export async function prepareExtensions(run, sections, mounts, onError, repoAcce
166
196
  [`mount:${provider.name}`, provider.prepare],
167
197
  ]
168
198
  : []),
169
- ...(repoAccess?.list() ?? []).flatMap((provider) => provider.prepare
170
- ? [
171
- [`repo:${provider.key}`, provider.prepare],
172
- ]
173
- : []),
199
+ ...(repoAccess?.list() ?? []).flatMap((provider) => {
200
+ const prepare = provider.prepare;
201
+ return prepare
202
+ ? [
203
+ [
204
+ `repo:${provider.key}`,
205
+ (each) => prepare(each, repoOptions),
206
+ ],
207
+ ]
208
+ : [];
209
+ }),
174
210
  ];
175
211
  for (const [key, prepare] of hooks)
176
212
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../../server/core/runs/extensions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../../server/core/runs/extensions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Repository credentials on demand (`RUNNER_ROUTES.gitCredential`, the `gitCredentials` feature): a runner asks for the
3
+ * credential of one of its run's repositories whenever git needs one, instead of keeping the one a claim handed out
4
+ * for the whole run, which a long run outlives.
5
+ *
6
+ * The answer is given only while the asking runner holds the run (`reports.holds`), for the attempt it names, under a
7
+ * lease that has not run out, and for a URL the claim listed in `RunGit.onDemand` (`agRuns.gitCredentialUrls`),
8
+ * compared exactly: case, a trailing `.git` and anything else the runner sends must match what it was given. Anything
9
+ * else is refused, so a run that ended, went back to the queue or was taken by another attempt gets nothing.
10
+ *
11
+ * The application issues the credential (`RepoAccessProvider.issue`), outside any transaction, within
12
+ * `ISSUE_TIMEOUT_MS`; whether a cached one is still good enough is its decision. Every credential handed out is added
13
+ * to the run's remembered secrets, so what the run reports afterwards is redacted of it too. A failure is answered
14
+ * with a reason the runner can act on and a message safe to show: `REPO_ACCESS_UNAVAILABLE` (try again later) or
15
+ * `REPO_ACCESS_DENIED` (the application will not issue one).
16
+ */
17
+ import { type GitCredential, type GitCredentialRequest } from '@nocobase/agent-protocol';
18
+ import type { Clock } from '../../kernel/clock.js';
19
+ import { type SecretMemory } from '../../kernel/redaction.js';
20
+ import type { TxRunner } from '../../kernel/tx.js';
21
+ import type { Runner } from '../../../shared/runners.js';
22
+ import { type RepoAccessRegistry } from './extensions.js';
23
+ import type { RunnerReports } from './lifecycle.js';
24
+ import { type RunRecord } from './run.store.js';
25
+ /** How long the server waits for the application to issue a credential before answering `REPO_ACCESS_UNAVAILABLE`. */
26
+ export declare const ISSUE_TIMEOUT_MS = 15000;
27
+ export interface GitCredentialService {
28
+ issue(runner: Pick<Runner, 'id'>, runId: string, request: GitCredentialRequest): Promise<GitCredential>;
29
+ }
30
+ export interface GitCredentialDeps {
31
+ readonly tx: TxRunner;
32
+ readonly clock: Clock;
33
+ readonly reports: Pick<RunnerReports, 'holds'>;
34
+ readonly repoAccess: RepoAccessRegistry;
35
+ readonly secrets?: SecretMemory;
36
+ /** Told what went wrong when a provider failed in a way it did not explain (`RepoAccessError`). */
37
+ readonly onError?: (message: string, error: unknown) => void;
38
+ readonly timeoutMs?: number;
39
+ }
40
+ /** The URLs a claim listed for on-demand credentials, as stored on the run. */
41
+ export declare function gitCredentialUrls(run: Pick<RunRecord, 'gitCredentialUrls'>): string[];
42
+ export declare function createGitCredentialService(deps: GitCredentialDeps): GitCredentialService;
43
+ //# sourceMappingURL=git-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-credentials.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/git-credentials.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAEL,KAAK,kBAAkB,EAExB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAwB,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEtE,sHAAsH;AACtH,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,MAAM,WAAW,oBAAoB;IACnC,KAAK,CACH,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,aAAa,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,mGAAmG;IACnG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,GACxC,MAAM,EAAE,CAEV;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,iBAAiB,GACtB,oBAAoB,CAwJtB"}
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Repository credentials on demand (`RUNNER_ROUTES.gitCredential`, the `gitCredentials` feature): a runner asks for the
3
+ * credential of one of its run's repositories whenever git needs one, instead of keeping the one a claim handed out
4
+ * for the whole run, which a long run outlives.
5
+ *
6
+ * The answer is given only while the asking runner holds the run (`reports.holds`), for the attempt it names, under a
7
+ * lease that has not run out, and for a URL the claim listed in `RunGit.onDemand` (`agRuns.gitCredentialUrls`),
8
+ * compared exactly: case, a trailing `.git` and anything else the runner sends must match what it was given. Anything
9
+ * else is refused, so a run that ended, went back to the queue or was taken by another attempt gets nothing.
10
+ *
11
+ * The application issues the credential (`RepoAccessProvider.issue`), outside any transaction, within
12
+ * `ISSUE_TIMEOUT_MS`; whether a cached one is still good enough is its decision. Every credential handed out is added
13
+ * to the run's remembered secrets, so what the run reports afterwards is redacted of it too. A failure is answered
14
+ * with a reason the runner can act on and a message safe to show: `REPO_ACCESS_UNAVAILABLE` (try again later) or
15
+ * `REPO_ACCESS_DENIED` (the application will not issue one).
16
+ */
17
+ import { ProtocolError, } from '@nocobase/agent-protocol';
18
+ import { runSecretsKey } from '../../kernel/redaction.js';
19
+ import { stringArray } from '../../kernel/values.js';
20
+ import { RepoAccessError, } from './extensions.js';
21
+ import { findRunRecord, toRun } from './run.store.js';
22
+ /** How long the server waits for the application to issue a credential before answering `REPO_ACCESS_UNAVAILABLE`. */
23
+ export const ISSUE_TIMEOUT_MS = 15_000;
24
+ /** The URLs a claim listed for on-demand credentials, as stored on the run. */
25
+ export function gitCredentialUrls(run) {
26
+ return stringArray(run.gitCredentialUrls);
27
+ }
28
+ export function createGitCredentialService(deps) {
29
+ const timeoutMs = deps.timeoutMs ?? ISSUE_TIMEOUT_MS;
30
+ const lost = (message, status) => new ProtocolError('LEASE_LOST', message, { status });
31
+ async function withTimeout(issue) {
32
+ const controller = new AbortController();
33
+ let timer;
34
+ const timeout = new Promise((_, reject) => {
35
+ timer = setTimeout(() => {
36
+ controller.abort();
37
+ reject(new RepoAccessError('unavailable', 'The application did not issue a credential in time.'));
38
+ }, timeoutMs);
39
+ });
40
+ try {
41
+ return await Promise.race([issue(controller.signal), timeout]);
42
+ }
43
+ finally {
44
+ clearTimeout(timer);
45
+ }
46
+ }
47
+ function checked(grant, now) {
48
+ const expires = Date.parse(grant.expiresAt);
49
+ if (typeof grant.username !== 'string' ||
50
+ grant.username === '' ||
51
+ typeof grant.password !== 'string' ||
52
+ grant.password === '' ||
53
+ Number.isNaN(expires) ||
54
+ expires <= now.getTime())
55
+ throw new RepoAccessError('unavailable', 'The application issued a credential that is incomplete or already expired.');
56
+ return grant;
57
+ }
58
+ /**
59
+ * The run while `runner` still holds this attempt of it under a live lease and the claim listed `url`; the protocol
60
+ * reason otherwise. Checked before the application is asked and again once it answered, since issuing may take long
61
+ * enough for the run to end, be taken back or move to another attempt.
62
+ */
63
+ async function held(runner, runId, request) {
64
+ await deps.reports.holds(runner, runId);
65
+ const run = await findRunRecord(deps.tx.read(), runId);
66
+ if (!run)
67
+ throw new ProtocolError('RUN_NOT_FOUND', 'No such run.');
68
+ if (Number(run.attempt) !== request.attempt)
69
+ throw lost(`Attempt ${request.attempt} of the run is over; it is on attempt ${Number(run.attempt)}.`, run.status);
70
+ if (run.leaseExpiresAt === null ||
71
+ Date.parse(run.leaseExpiresAt) <= deps.clock.now().getTime())
72
+ throw lost('The run’s lease ran out.', run.status);
73
+ if (!gitCredentialUrls(run).includes(request.url))
74
+ throw new ProtocolError('INVALID_REQUEST', 'This repository is not one the run asks credentials for on demand.', { url: request.url });
75
+ return run;
76
+ }
77
+ /** The first answer of a provider that issues for the URL; null when none does. */
78
+ async function ask(run, runner, request) {
79
+ const providers = deps.repoAccess
80
+ .list()
81
+ .filter((provider) => provider.issue !== undefined);
82
+ try {
83
+ for (const provider of providers) {
84
+ const grant = await withTimeout((signal) => provider.issue({
85
+ run: toRun(run),
86
+ runnerId: runner.id,
87
+ attempt: request.attempt,
88
+ url: request.url,
89
+ refresh: request.refresh === true,
90
+ signal,
91
+ }));
92
+ if (grant)
93
+ return grant;
94
+ }
95
+ return null;
96
+ }
97
+ catch (error) {
98
+ if (error instanceof RepoAccessError)
99
+ throw new ProtocolError(error.kind === 'denied'
100
+ ? 'REPO_ACCESS_DENIED'
101
+ : 'REPO_ACCESS_UNAVAILABLE', error.message, { url: request.url });
102
+ deps.onError?.(`Agents could not issue a repository credential for run ${run.id}.`, error);
103
+ throw new ProtocolError('REPO_ACCESS_UNAVAILABLE', 'The application could not issue a credential for this repository.', { url: request.url });
104
+ }
105
+ }
106
+ return {
107
+ async issue(runner, runId, request) {
108
+ const run = await held(runner, runId, request);
109
+ const grant = await ask(run, runner, request);
110
+ if (!grant)
111
+ throw new ProtocolError('REPO_ACCESS_DENIED', 'The application issues no credential for this repository.', { url: request.url });
112
+ // The run may have ended, been taken back or moved to another attempt while the application issued: then the
113
+ // credential is dropped, never remembered, and the runner told why.
114
+ await held(runner, runId, request);
115
+ let valid;
116
+ try {
117
+ // Checked against the time it came back, not the time it was asked for.
118
+ valid = checked(grant, deps.clock.now());
119
+ }
120
+ catch (error) {
121
+ throw new ProtocolError('REPO_ACCESS_UNAVAILABLE', error instanceof Error ? error.message : String(error), { url: request.url });
122
+ }
123
+ const { username, password, expiresAt } = valid;
124
+ deps.secrets?.add(runSecretsKey(run.id), [password]);
125
+ return { username, password, expiresAt };
126
+ },
127
+ };
128
+ }
129
+ //# sourceMappingURL=git-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-credentials.js","sourceRoot":"","sources":["../../../../server/core/runs/git-credentials.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  export { briefOf, createClaimService, fits, fitsActor, hasTool, onlineEntryOf, pickEntry, isServerHolder, payloadDirs, payloadRequires, skillTargets, variableTargets, type ClaimService, type RenderedBrief, type ServerClaim, type ServerHolder, } from './claim.js';
2
2
  export { resolveAgentCli, type AgentCli } from './policy.js';
3
3
  export { createClaimEligibility, type ClaimEligibility, type EligibilityRequest, } from './eligibility.js';
4
- export { createBriefSectionRegistry, createRepoAccessRegistry, createRunMountRegistry, sessionKeyOf, type BriefSectionProvider, type BriefSectionRegistry, type ExtensionPrepare, type MountContext, type MountOffer, type RepoAccessContext, type RepoAccessProvider, type RepoAccessRegistry, type RunMountProvider, type RunMountRegistry, } from './extensions.js';
4
+ export { createBriefSectionRegistry, createRepoAccessRegistry, createRunMountRegistry, sessionKeyOf, type BriefSectionProvider, type BriefSectionRegistry, type ExtensionPrepare, type MountContext, type MountOffer, RepoAccessError, type RepoAccessContext, type RepoAccessProvider, type RepoAccessRegistry, type RepoCredentialGrant, type RepoCredentialRequest, type RepoPrepareOptions, type RunMountProvider, type RunMountRegistry, } from './extensions.js';
5
+ export { createGitCredentialService, ISSUE_TIMEOUT_MS, type GitCredentialService, } from './git-credentials.js';
5
6
  export { createBriefPreviewer, type BriefPreviewer } from './preview.js';
6
7
  export { findBrief, requestReset } from './workspace.store.js';
7
8
  export { createRunnerReports, type OnlineUsageRecord, type RunnerReports, } from './lifecycle.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,EACf,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EACZ,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,QAAQ,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,EACb,KAAK,WAAW,GACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,EACT,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,KAAK,iBAAiB,EACtB,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,KAAK,gBAAgB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,KAAK,iBAAiB,EACtB,KAAK,YAAY,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/index.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  export { briefOf, createClaimService, fits, fitsActor, hasTool, onlineEntryOf, pickEntry, isServerHolder, payloadDirs, payloadRequires, skillTargets, variableTargets, } from './claim.js';
2
2
  export { resolveAgentCli } from './policy.js';
3
3
  export { createClaimEligibility, } from './eligibility.js';
4
- export { createBriefSectionRegistry, createRepoAccessRegistry, createRunMountRegistry, sessionKeyOf, } from './extensions.js';
4
+ export { createBriefSectionRegistry, createRepoAccessRegistry, createRunMountRegistry, sessionKeyOf, RepoAccessError, } from './extensions.js';
5
+ export { createGitCredentialService, ISSUE_TIMEOUT_MS, } from './git-credentials.js';
5
6
  export { createBriefPreviewer } from './preview.js';
6
7
  export { findBrief, requestReset } from './workspace.store.js';
7
8
  export { createRunnerReports, } from './lifecycle.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/core/runs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,GAKhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,GAWb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAuB,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,mBAAmB,GAGpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,SAAS,GAcV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,GAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,GAQV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAkC,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,cAAc,GAEf,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../server/core/runs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,kBAAkB,EAClB,IAAI,EACJ,SAAS,EACT,OAAO,EACP,aAAa,EACb,SAAS,EACT,cAAc,EACd,WAAW,EACX,eAAe,EACf,YAAY,EACZ,eAAe,GAKhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAiB,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,sBAAsB,GAGvB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,sBAAsB,EACtB,YAAY,EAMZ,eAAe,GAShB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,GAEjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,oBAAoB,EAAuB,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC/D,OAAO,EACL,mBAAmB,GAGpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,UAAU,EACV,qBAAqB,EACrB,SAAS,EACT,SAAS,GAcV,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,cAAc,EACd,aAAa,GAEd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,SAAS,GAQV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,kBAAkB,GAKnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAkC,MAAM,cAAc,CAAC;AAC7E,OAAO,EACL,kBAAkB,EAClB,YAAY,GAEb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,GAGnB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAuB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,cAAc,GAEf,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The subject's admission and input policy (`ContextProvider.admit` and `selectInputs`) applied to a run that is
3
+ * already working: before new input joins it, and before its pending input is delivered.
4
+ */
5
+ import type { RunInput } from '@nocobase/agent-protocol';
6
+ import type { DatabaseConnection } from '@nocobase/db';
7
+ import type { Agent } from '../../../shared/agents.js';
8
+ import { type InputRecord, type RunRecord } from './run.store.js';
9
+ import { type SubjectRegistry } from './ports.js';
10
+ export interface InputGateDeps {
11
+ readonly subjects: SubjectRegistry;
12
+ readonly cliName: string;
13
+ readonly appName: string;
14
+ }
15
+ /**
16
+ * Of `inputs` for `run`, the ones its agent may act on now: none when the subject rejects the agent's work on it, else
17
+ * what the subject selects. Without a policy, all of them.
18
+ */
19
+ export declare function gateInputs(conn: DatabaseConnection, deps: InputGateDeps, run: RunRecord, agent: Agent, inputs: readonly RunInput[]): Promise<readonly RunInput[]>;
20
+ /** Marks the inputs of `ids` handled without delivering them: the run is not to act on them. */
21
+ export declare function dropInputs(conn: DatabaseConnection, ids: readonly string[], now: string): Promise<void>;
22
+ /** A working run's unhandled input, split by whether the run may still act on it. */
23
+ export interface GatedPending {
24
+ /** What the run was already given, and the new input the subject still admits and selects. */
25
+ readonly kept: readonly InputRecord[];
26
+ /** New input the subject no longer lets the run act on. */
27
+ readonly withheld: readonly InputRecord[];
28
+ }
29
+ /**
30
+ * Splits `run`'s unhandled input by the subject's policy. Input already delivered stays with the run, whatever
31
+ * happened since; only input not yet delivered is judged.
32
+ */
33
+ export declare function gatePending(conn: DatabaseConnection, deps: InputGateDeps, run: RunRecord): Promise<GatedPending>;
34
+ //# sourceMappingURL=input-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-gate.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/input-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAEvD,OAAO,EAKL,KAAK,WAAW,EAChB,KAAK,SAAS,EACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAa,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,SAAS,EACd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,SAAS,QAAQ,EAAE,GAC1B,OAAO,CAAC,SAAS,QAAQ,EAAE,CAAC,CAgB9B;AAED,gGAAgG;AAChG,wBAAsB,UAAU,CAC9B,IAAI,EAAE,kBAAkB,EACxB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,qFAAqF;AACrF,MAAM,WAAW,YAAY;IAC3B,8FAA8F;IAC9F,QAAQ,CAAC,IAAI,EAAE,SAAS,WAAW,EAAE,CAAC;IACtC,2DAA2D;IAC3D,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;CAC3C;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,SAAS,GACb,OAAO,CAAC,YAAY,CAAC,CAevB"}
@@ -0,0 +1,56 @@
1
+ import { findAgent } from '../agents/index.js';
2
+ import { inputsRepo, pendingInputs, toInput, toRun, } from './run.store.js';
3
+ import { dialectOf } from './ports.js';
4
+ /**
5
+ * Of `inputs` for `run`, the ones its agent may act on now: none when the subject rejects the agent's work on it, else
6
+ * what the subject selects. Without a policy, all of them.
7
+ */
8
+ export async function gateInputs(conn, deps, run, agent, inputs) {
9
+ const context = deps.subjects.get(run.subjectKind)?.context;
10
+ if (!context || inputs.length === 0)
11
+ return inputs;
12
+ const claim = {
13
+ run: toRun(run),
14
+ agent,
15
+ runner: null,
16
+ inputs,
17
+ cli: deps.cliName,
18
+ appName: deps.appName,
19
+ dialect: dialectOf(agent),
20
+ };
21
+ if (await context.admit?.(conn, claim))
22
+ return [];
23
+ return context.selectInputs
24
+ ? await context.selectInputs(conn, claim)
25
+ : inputs;
26
+ }
27
+ /** Marks the inputs of `ids` handled without delivering them: the run is not to act on them. */
28
+ export async function dropInputs(conn, ids, now) {
29
+ if (ids.length === 0)
30
+ return;
31
+ await inputsRepo(conn).updateMany({
32
+ filter: (f) => f.and([
33
+ f.or(ids.map((id) => f.string('id').eq(id))),
34
+ f.date('handledAt').empty(),
35
+ ]),
36
+ values: { handledAt: now },
37
+ });
38
+ }
39
+ /**
40
+ * Splits `run`'s unhandled input by the subject's policy. Input already delivered stays with the run, whatever
41
+ * happened since; only input not yet delivered is judged.
42
+ */
43
+ export async function gatePending(conn, deps, run) {
44
+ const pending = await pendingInputs(conn, run.id);
45
+ const fresh = pending.filter((input) => !input.deliveredAt);
46
+ const agent = fresh.length > 0 ? await findAgent(conn, run.agentId) : null;
47
+ if (!agent)
48
+ return { kept: pending, withheld: [] };
49
+ const admitted = new Set((await gateInputs(conn, deps, run, agent, fresh.map(toInput))).map((input) => input.id));
50
+ const withheld = fresh.filter((input) => !admitted.has(input.id));
51
+ return {
52
+ kept: pending.filter((input) => !withheld.includes(input)),
53
+ withheld,
54
+ };
55
+ }
56
+ //# sourceMappingURL=input-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"input-gate.js","sourceRoot":"","sources":["../../../../server/core/runs/input-gate.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ import { type Clock } from '../../kernel/clock.js';
9
9
  import type { IdSource } from '../../kernel/ids.js';
10
10
  import { type SecretMemory } from '../../kernel/redaction.js';
11
11
  import type { TxRunner } from '../../kernel/tx.js';
12
+ import { type InputGateDeps } from './input-gate.js';
12
13
  import { type TransitionDeps } from './transitions.js';
13
14
  export interface RunnerReports {
14
15
  /** Resolves while `runner` holds the run; `LEASE_LOST`, `RUN_NOT_ACTIVE` or `RUN_NOT_OWNED` otherwise. */
@@ -42,7 +43,7 @@ export interface OnlineUsageRecord {
42
43
  readonly cacheWriteTokens?: number;
43
44
  readonly reasoningTokens?: number;
44
45
  }
45
- export interface RunnerReportsDeps extends TransitionDeps {
46
+ export interface RunnerReportsDeps extends TransitionDeps, InputGateDeps {
46
47
  readonly tx: TxRunner;
47
48
  readonly ids: IdSource;
48
49
  readonly clock: Clock;
@@ -1 +1 @@
1
- {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/lifecycle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../../server/core/runs/lifecycle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAML,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,cAAc,EAEpB,MAAM,0BAA0B,CAAC;AAMlC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAS,KAAK,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAGL,KAAK,YAAY,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAM,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAGvD,OAAO,EAA2B,KAAK,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAgB9E,OAAO,EAAyB,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAO9E,MAAM,WAAW,aAAa;IAC5B,0GAA0G;IAC1G,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAChE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACzE,KAAK,CACH,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,SAAS,GAAG,cAAc,GAAG,WAAW,CAAC,GACpE,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B;;;OAGG;IACH,WAAW,CACT,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,iBAAiB,GACvB,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,MAAM,CACJ,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3E,QAAQ,CACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,IAAI,CACF,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,SAAS,CACP,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,gBAAgB,GACxB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3B,mFAAmF;IACnF,SAAS,CACP,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,SAAS,EAAE,GAC3B,OAAO,CAAC;QAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC9D;AAED,iDAAiD;AACjD,MAAM,WAAW,iBAAiB;IAChC,gEAAgE;IAChE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,iBAAkB,SAAQ,cAAc,EAAE,aAAa;IACtE,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;CACjC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CA4c1E"}
@@ -10,8 +10,9 @@ import { later } from '../../kernel/clock.js';
10
10
  import { createSecretMemory, runSecretsKey, } from '../../kernel/redaction.js';
11
11
  import { asJson, jsonObject, truncateBytes } from '../../kernel/values.js';
12
12
  import { recordActualModels } from './execution.js';
13
+ import { dropInputs, gatePending } from './input-gate.js';
13
14
  import { everHeld } from './run-tokens.js';
14
- import { eventsRepo, findRunRecord, inputsRepo, isActive, isTerminal, markDelivered, pendingInputs, reposRepo, runsRepo, sessionsRepo, toInput, usageRepo, } from './run.store.js';
15
+ import { eventsRepo, findRunRecord, inputsRepo, isActive, isTerminal, markDelivered, reposRepo, runsRepo, sessionsRepo, toInput, usageRepo, } from './run.store.js';
15
16
  import { finishRun, requeueRun } from './transitions.js';
16
17
  const executionReport = z.object({
17
18
  effort: z.string().trim().min(1).max(200).nullable(),
@@ -44,11 +45,22 @@ export function createRunnerReports(deps) {
44
45
  });
45
46
  return leaseExpiresAt;
46
47
  }
47
- async function deliver(conn, runId) {
48
- const pending = await pendingInputs(conn, runId);
49
- await markDelivered(conn, pending, clock.now().toISOString());
48
+ /**
49
+ * The run's unhandled input, marking what is new delivered. New input passes the subject's policy first, as it would
50
+ * at a claim: what the run's agent may not act on now is marked handled instead and never reaches the runner.
51
+ */
52
+ async function deliver(conn, run) {
53
+ const now = clock.now().toISOString();
54
+ const pending = await settlePending(conn, run, now);
55
+ await markDelivered(conn, pending, now);
50
56
  return pending.map(toInput);
51
57
  }
58
+ /** The run's unhandled input it may act on, marking what it may no longer act on handled. */
59
+ async function settlePending(conn, run, now) {
60
+ const { kept, withheld } = await gatePending(conn, deps, run);
61
+ await dropInputs(conn, withheld.map((input) => input.id), now);
62
+ return kept;
63
+ }
52
64
  /** Records what every ending reports: handled inputs, usage, branches. */
53
65
  async function recordOutcome({ conn }, run, report) {
54
66
  const now = clock.now().toISOString();
@@ -87,6 +99,10 @@ export function createRunnerReports(deps) {
87
99
  branch: repo.branch,
88
100
  pushed: repo.pushed,
89
101
  headSha: repo.headSha ?? null,
102
+ failureReason: repo.failure?.reason ?? null,
103
+ failureDetail: repo.failure === undefined
104
+ ? null
105
+ : redactorOf(run.id).text(repo.failure.message).slice(0, 2000),
90
106
  updatedAt: now,
91
107
  };
92
108
  if (existing)
@@ -157,7 +173,7 @@ export function createRunnerReports(deps) {
157
173
  return {
158
174
  leaseExpiresAt,
159
175
  cancelRequested: run.cancelRequestedAt !== null,
160
- inputs: await deliver(conn, run.id),
176
+ inputs: await deliver(conn, run),
161
177
  };
162
178
  }),
163
179
  start: (runner, runId, request) => tx.run(async (unit) => {
@@ -189,7 +205,7 @@ export function createRunnerReports(deps) {
189
205
  status: current.status,
190
206
  leaseExpiresAt,
191
207
  cancelRequested,
192
- inputs: await deliver(conn, run.id),
208
+ inputs: await deliver(conn, run),
193
209
  };
194
210
  }),
195
211
  events: (runner, runId, request) => tx.run(async (unit) => {
@@ -288,14 +304,15 @@ export function createRunnerReports(deps) {
288
304
  return {
289
305
  status: current.status,
290
306
  cancelRequested: current.cancelRequestedAt !== null,
291
- inputs: await deliver(conn, current.id),
307
+ inputs: await deliver(conn, current),
292
308
  leaseExpiresAt: current.leaseExpiresAt,
293
309
  };
294
310
  }),
295
311
  complete: (runner, runId, request) => tx.run(async (unit) => {
296
312
  const run = await held(unit.conn, runner, runId);
297
313
  const handled = new Set(request.handledInputIds);
298
- const missing = (await pendingInputs(unit.conn, run.id)).filter((input) => !handled.has(input.id));
314
+ // Input the run may no longer act on does not hold it open: the runner would get none of it.
315
+ const missing = (await settlePending(unit.conn, run, clock.now().toISOString())).filter((input) => !handled.has(input.id));
299
316
  if (missing.length > 0)
300
317
  throw new ProtocolError('RUN_INPUT_PENDING', 'The run has input it has not handled; handle it before completing.', {
301
318
  inputIds: missing.map((input) => input.id),
@@ -348,9 +365,11 @@ export function createRunnerReports(deps) {
348
365
  cancelAck: (runner, runId, request) => tx.run(async (unit) => {
349
366
  const run = await held(unit.conn, runner, runId);
350
367
  await recordOutcome(unit, run, request);
368
+ await rememberSession(unit, run, request.sessionId, false);
351
369
  const ended = await finishRun(unit, deps, run, {
352
370
  status: 'cancelled',
353
371
  reason: 'cancelled',
372
+ ...(request.sessionId ? { sessionId: request.sessionId } : {}),
354
373
  });
355
374
  if (!ended)
356
375
  throw new ProtocolError('LEASE_LOST', 'The run moved on; stop it.');