@noodleseed/one 0.121.0 → 0.122.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +5 -2
- package/dist/commands/session.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-marketplace-docs.js +4 -4
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js +8 -8
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-submission.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-operations-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/package.json +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.d.ts +30 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.js +21 -6
- package/node_modules/@noodle-borg/developer-mcp/dist/contracts.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.d.ts +2 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/port.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/prompts.js +3 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/prompts.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.js +10 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/resources.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/results.d.ts +4 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/results.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/results.js +5 -19
- package/node_modules/@noodle-borg/developer-mcp/dist/results.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/server.js +3 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/server.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.js +6 -25
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/apps.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.d.ts +16 -3
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.js +22 -19
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/context.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.js +3 -9
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/deployments.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.js +15 -16
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/diagnose.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.js +9 -17
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/operations.js.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.d.ts.map +1 -1
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.js +7 -10
- package/node_modules/@noodle-borg/developer-mcp/dist/tools/rollback.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts +41 -17
- package/node_modules/@noodle-borg/knowledge/dist/budget.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/budget.js +0 -0
- package/node_modules/@noodle-borg/knowledge/dist/budget.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/index.js +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.d.ts +22 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.d.ts.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.js +102 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-budget-store.js.map +1 -0
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts +5 -3
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js +61 -1
- package/node_modules/@noodle-borg/knowledge/dist/postgres-revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts +28 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.d.ts.map +1 -1
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js +39 -0
- package/node_modules/@noodle-borg/knowledge/dist/revision-store.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.d.ts +6 -4
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.js +13 -16
- package/node_modules/@noodle-borg/service/dist/auth/developer-grant-guard.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.d.ts +3 -2
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.js +66 -47
- package/node_modules/@noodle-borg/service/dist/developer-mcp/control-plane-adapter.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.js +15 -16
- package/node_modules/@noodle-borg/service/dist/developer-mcp/mount.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts +0 -2
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.js +0 -16
- package/node_modules/@noodle-borg/service/dist/oauth/consent-claims.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.d.ts +3 -28
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.js +8 -67
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-authorizer.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.d.ts +0 -4
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.js +1 -14
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.d.ts +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.js +45 -36
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-flow.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.d.ts +2 -2
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js +20 -229
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-page.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.d.ts +3 -2
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.js +70 -36
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant-store-postgres.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.d.ts +17 -6
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.js +98 -26
- package/node_modules/@noodle-borg/service/dist/oauth/developer-grant.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +0 -2
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/upstream-consent.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/analytics.js +3 -3
- package/node_modules/@noodle-borg/service/dist/routes/analytics.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/apps.js +6 -27
- package/node_modules/@noodle-borg/service/dist/routes/apps.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js +5 -8
- package/node_modules/@noodle-borg/service/dist/routes/config-values.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts +7 -6
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js +7 -6
- package/node_modules/@noodle-borg/service/dist/routes/control-plane.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deploy-preflight.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js +2 -7
- package/node_modules/@noodle-borg/service/dist/routes/deployment-package.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js +7 -20
- package/node_modules/@noodle-borg/service/dist/routes/deployments.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/diagnostics.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/diagnostics.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/envs.js +4 -8
- package/node_modules/@noodle-borg/service/dist/routes/envs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/logs.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/logs.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js +1 -1
- package/node_modules/@noodle-borg/service/dist/routes/rollback.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js +21 -0
- package/node_modules/@noodle-borg/service/dist/store/postgres-schema.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +1 -1
- package/node_modules/@noodleseed/assistant/package.json +41 -16
- package/package.json +2 -2
|
@@ -1,47 +1,45 @@
|
|
|
1
1
|
import { appInspectionViewSchema, diagnoseAppInputSchema, } from '../contracts.js';
|
|
2
2
|
import { diagnoseEvidence, diagnosisViewSchema, } from '../diagnosis.js';
|
|
3
|
-
import {
|
|
3
|
+
import { portError, successResult, validationError } from '../results.js';
|
|
4
4
|
export async function diagnoseApp(context, input) {
|
|
5
5
|
const parsed = diagnoseAppInputSchema.safeParse(input);
|
|
6
6
|
if (!parsed.success)
|
|
7
7
|
return validationError(context, 'Invalid diagnose_app input.');
|
|
8
|
-
const { app, env } = parsed.data;
|
|
9
|
-
if (!context.ctx.environments.includes(env)) {
|
|
10
|
-
return forbiddenEnvironment(context, env);
|
|
11
|
-
}
|
|
8
|
+
const { org, app, env } = parsed.data;
|
|
12
9
|
let appView;
|
|
13
10
|
try {
|
|
14
|
-
appView = appInspectionViewSchema.parse(await context.controlPlane.inspectApp(context.ctx, { app, env }));
|
|
11
|
+
appView = appInspectionViewSchema.parse(await context.controlPlane.inspectApp(context.ctx, { org, app, env }));
|
|
15
12
|
}
|
|
16
13
|
catch (error) {
|
|
17
|
-
return portError(context, error, env);
|
|
14
|
+
return portError(context, error, org, env);
|
|
18
15
|
}
|
|
19
16
|
const evidence = { app: { active: appView.active } };
|
|
20
17
|
const sources = ['app'];
|
|
21
18
|
const unavailable = [];
|
|
22
19
|
if (appView.latest === undefined || appView.latest.environment !== env) {
|
|
23
|
-
return diagnosisResult(context, app, env, evidence, sources, unavailable);
|
|
20
|
+
return diagnosisResult(context, org, app, env, evidence, sources, unavailable);
|
|
24
21
|
}
|
|
25
22
|
try {
|
|
26
23
|
const deployment = await context.controlPlane.inspectDeployment(context.ctx, {
|
|
24
|
+
org,
|
|
27
25
|
deploymentId: appView.latest.deploymentId,
|
|
28
26
|
});
|
|
29
27
|
evidenceWith(evidence, 'deployment', deployment);
|
|
30
28
|
sources.push('deployment');
|
|
31
29
|
if (deployment.health.state === 'ready') {
|
|
32
|
-
await collectMetrics(context, app, env, evidence, sources, unavailable);
|
|
30
|
+
await collectMetrics(context, org, app, env, evidence, sources, unavailable);
|
|
33
31
|
}
|
|
34
32
|
else {
|
|
35
|
-
await collectLogs(context, app, env, evidence, sources, unavailable);
|
|
33
|
+
await collectLogs(context, org, app, env, evidence, sources, unavailable);
|
|
36
34
|
}
|
|
37
35
|
}
|
|
38
36
|
catch {
|
|
39
37
|
unavailable.push('deployment');
|
|
40
38
|
}
|
|
41
|
-
return diagnosisResult(context, app, env, evidence, sources, unavailable);
|
|
39
|
+
return diagnosisResult(context, org, app, env, evidence, sources, unavailable);
|
|
42
40
|
}
|
|
43
|
-
async function collectMetrics(context, app, env, evidence, sources, unavailable) {
|
|
44
|
-
const input = { app, env, window: '24h' };
|
|
41
|
+
async function collectMetrics(context, org, app, env, evidence, sources, unavailable) {
|
|
42
|
+
const input = { org, app, env, window: '24h' };
|
|
45
43
|
try {
|
|
46
44
|
evidenceWith(evidence, 'metrics', await context.controlPlane.getMetrics(context.ctx, input));
|
|
47
45
|
sources.push('metrics');
|
|
@@ -50,8 +48,8 @@ async function collectMetrics(context, app, env, evidence, sources, unavailable)
|
|
|
50
48
|
unavailable.push('metrics');
|
|
51
49
|
}
|
|
52
50
|
}
|
|
53
|
-
async function collectLogs(context, app, env, evidence, sources, unavailable) {
|
|
54
|
-
const input = { app, env, limit: 50, level: 'error' };
|
|
51
|
+
async function collectLogs(context, org, app, env, evidence, sources, unavailable) {
|
|
52
|
+
const input = { org, app, env, limit: 50, level: 'error' };
|
|
55
53
|
try {
|
|
56
54
|
evidenceWith(evidence, 'logs', await context.controlPlane.getLogs(context.ctx, input));
|
|
57
55
|
sources.push('logs');
|
|
@@ -63,7 +61,7 @@ async function collectLogs(context, app, env, evidence, sources, unavailable) {
|
|
|
63
61
|
function evidenceWith(evidence, key, value) {
|
|
64
62
|
evidence[key] = value;
|
|
65
63
|
}
|
|
66
|
-
function diagnosisResult(context, app, env, evidence, sources, unavailable) {
|
|
64
|
+
function diagnosisResult(context, org, app, env, evidence, sources, unavailable) {
|
|
67
65
|
const data = diagnosisViewSchema.parse({
|
|
68
66
|
app,
|
|
69
67
|
env,
|
|
@@ -73,6 +71,7 @@ function diagnosisResult(context, app, env, evidence, sources, unavailable) {
|
|
|
73
71
|
return successResult({
|
|
74
72
|
...context,
|
|
75
73
|
data,
|
|
74
|
+
org,
|
|
76
75
|
env,
|
|
77
76
|
summary: data.findings.length === 0
|
|
78
77
|
? `${app}/${env} is healthy in the observed evidence.`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/tools/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,uBAAuB,EACvB,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/tools/diagnose.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,uBAAuB,EACvB,sBAAsB,GAGvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAsB,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAM9F,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAA4B,EAAE,KAAc;IAC5E,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,OAAO;QACjB,OAAO,eAAe,CAAgB,OAAO,EAAE,6BAA6B,CAAC,CAAC;IAChF,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;IAEtC,IAAI,OAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,OAAO,GAAG,uBAAuB,CAAC,KAAK,CACrC,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CACtE,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAgB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,QAAQ,GAAsB,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IACxE,MAAM,OAAO,GAAsB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAsB,EAAE,CAAC;IAC1C,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QACvE,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,EAAE;YAC3E,GAAG;YACH,YAAY,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY;SAC1C,CAAC,CAAC;QACH,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3B,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YACxC,MAAM,cAAc,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC/E,CAAC;aAAM,CAAC;YACN,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;AACjF,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,OAA4B,EAC5B,GAAW,EACX,GAAW,EACX,GAAW,EACX,QAA2B,EAC3B,OAA0B,EAC1B,WAA8B;IAE9B,MAAM,KAAK,GAAoB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAChE,IAAI,CAAC;QACH,YAAY,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,OAA4B,EAC5B,GAAW,EACX,GAAW,EACX,GAAW,EACX,QAA2B,EAC3B,OAA0B,EAC1B,WAA8B;IAE9B,MAAM,KAAK,GAAiB,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;IACzE,IAAI,CAAC;QACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACvF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CACnB,QAA2B,EAC3B,GAAM,EACN,KAAwC;IAEvC,QAAyD,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAC1E,CAAC;AAED,SAAS,eAAe,CACtB,OAA4B,EAC5B,GAAW,EACX,GAAW,EACX,GAAW,EACX,QAA2B,EAC3B,OAA0B,EAC1B,WAA8B;IAE9B,MAAM,IAAI,GAAG,mBAAmB,CAAC,KAAK,CAAC;QACrC,GAAG;QACH,GAAG;QACH,QAAQ,EAAE,gBAAgB,CAAC,EAAE,GAAG,QAAQ,EAAE,WAAW,EAAE,CAAC;QACxD,QAAQ,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE;KACnC,CAAC,CAAC;IACH,OAAO,aAAa,CAAC;QACnB,GAAG,OAAO;QACV,IAAI;QACJ,GAAG;QACH,GAAG;QACH,OAAO,EACL,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YACxB,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,uCAAuC;YACtD,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,yBAAyB,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,IAAI,GAAG,GAAG;QAChH,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAC7C,OAAO,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAC7D;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/tools/operations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/tools/operations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAa,KAAK,aAAa,EAAkC,MAAM,eAAe,CAAC;AAE9F,UAAU,qBAAsB,SAAQ,aAAa;IACnD,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;CAC9C;AAED,wBAAsB,OAAO,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;IAmB3E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqB9E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqB9E;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,qBAAqB,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqB9E"}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
1
|
import { eventsViewSchema, getLogsInputSchema, getMetricsInputSchema, getSessionInputSchema, listEventsInputSchema, logsViewSchema, metricsViewSchema, sessionViewSchema, } from '../contracts.js';
|
|
2
|
-
import {
|
|
2
|
+
import { portError, successResult, validationError } from '../results.js';
|
|
3
3
|
export async function getLogs(context, input) {
|
|
4
4
|
const parsed = getLogsInputSchema.safeParse(input);
|
|
5
5
|
if (!parsed.success)
|
|
6
6
|
return validationError(context, 'Invalid get_logs input.');
|
|
7
|
-
if (!context.ctx.environments.includes(parsed.data.env)) {
|
|
8
|
-
return forbiddenEnvironment(context, parsed.data.env);
|
|
9
|
-
}
|
|
10
7
|
try {
|
|
11
8
|
const data = logsViewSchema.parse(await context.controlPlane.getLogs(context.ctx, parsed.data));
|
|
12
9
|
return successResult({
|
|
13
10
|
...context,
|
|
14
11
|
data,
|
|
12
|
+
org: parsed.data.org,
|
|
15
13
|
env: parsed.data.env,
|
|
16
14
|
summary: `${data.events.length} recent log event${data.events.length === 1 ? '' : 's'} for ${parsed.data.app}/${parsed.data.env}.`,
|
|
17
15
|
nextActions: [
|
|
@@ -21,21 +19,19 @@ export async function getLogs(context, input) {
|
|
|
21
19
|
});
|
|
22
20
|
}
|
|
23
21
|
catch (error) {
|
|
24
|
-
return portError(context, error, parsed.data.env);
|
|
22
|
+
return portError(context, error, parsed.data.org, parsed.data.env);
|
|
25
23
|
}
|
|
26
24
|
}
|
|
27
25
|
export async function getMetrics(context, input) {
|
|
28
26
|
const parsed = getMetricsInputSchema.safeParse(input);
|
|
29
27
|
if (!parsed.success)
|
|
30
28
|
return validationError(context, 'Invalid get_metrics input.');
|
|
31
|
-
if (!context.ctx.environments.includes(parsed.data.env)) {
|
|
32
|
-
return forbiddenEnvironment(context, parsed.data.env);
|
|
33
|
-
}
|
|
34
29
|
try {
|
|
35
30
|
const data = metricsViewSchema.parse(await context.controlPlane.getMetrics(context.ctx, parsed.data));
|
|
36
31
|
return successResult({
|
|
37
32
|
...context,
|
|
38
33
|
data,
|
|
34
|
+
org: parsed.data.org,
|
|
39
35
|
env: parsed.data.env,
|
|
40
36
|
summary: `${data.metrics.totals.requests} requests observed${data.truncated ? ' (partial window)' : ''}.`,
|
|
41
37
|
nextActions: [
|
|
@@ -45,21 +41,19 @@ export async function getMetrics(context, input) {
|
|
|
45
41
|
});
|
|
46
42
|
}
|
|
47
43
|
catch (error) {
|
|
48
|
-
return portError(context, error, parsed.data.env);
|
|
44
|
+
return portError(context, error, parsed.data.org, parsed.data.env);
|
|
49
45
|
}
|
|
50
46
|
}
|
|
51
47
|
export async function listEvents(context, input) {
|
|
52
48
|
const parsed = listEventsInputSchema.safeParse(input);
|
|
53
49
|
if (!parsed.success)
|
|
54
50
|
return validationError(context, 'Invalid list_events input.');
|
|
55
|
-
if (!context.ctx.environments.includes(parsed.data.env)) {
|
|
56
|
-
return forbiddenEnvironment(context, parsed.data.env);
|
|
57
|
-
}
|
|
58
51
|
try {
|
|
59
52
|
const data = eventsViewSchema.parse(await context.controlPlane.listEvents(context.ctx, parsed.data));
|
|
60
53
|
return successResult({
|
|
61
54
|
...context,
|
|
62
55
|
data,
|
|
56
|
+
org: parsed.data.org,
|
|
63
57
|
env: parsed.data.env,
|
|
64
58
|
summary: `${data.events.length} request event${data.events.length === 1 ? '' : 's'} matched.`,
|
|
65
59
|
nextActions: [
|
|
@@ -69,21 +63,19 @@ export async function listEvents(context, input) {
|
|
|
69
63
|
});
|
|
70
64
|
}
|
|
71
65
|
catch (error) {
|
|
72
|
-
return portError(context, error, parsed.data.env);
|
|
66
|
+
return portError(context, error, parsed.data.org, parsed.data.env);
|
|
73
67
|
}
|
|
74
68
|
}
|
|
75
69
|
export async function getSession(context, input) {
|
|
76
70
|
const parsed = getSessionInputSchema.safeParse(input);
|
|
77
71
|
if (!parsed.success)
|
|
78
72
|
return validationError(context, 'Invalid get_session input.');
|
|
79
|
-
if (!context.ctx.environments.includes(parsed.data.env)) {
|
|
80
|
-
return forbiddenEnvironment(context, parsed.data.env);
|
|
81
|
-
}
|
|
82
73
|
try {
|
|
83
74
|
const data = sessionViewSchema.parse(await context.controlPlane.getSession(context.ctx, parsed.data));
|
|
84
75
|
return successResult({
|
|
85
76
|
...context,
|
|
86
77
|
data,
|
|
78
|
+
org: parsed.data.org,
|
|
87
79
|
env: parsed.data.env,
|
|
88
80
|
summary: `${data.events.length} chronological event${data.events.length === 1 ? '' : 's'} in session ${data.sessionId}.`,
|
|
89
81
|
nextActions: [
|
|
@@ -93,7 +85,7 @@ export async function getSession(context, input) {
|
|
|
93
85
|
});
|
|
94
86
|
}
|
|
95
87
|
catch (error) {
|
|
96
|
-
return portError(context, error, parsed.data.env);
|
|
88
|
+
return portError(context, error, parsed.data.org, parsed.data.env);
|
|
97
89
|
}
|
|
98
90
|
}
|
|
99
91
|
//# sourceMappingURL=operations.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/tools/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EAErB,qBAAqB,EACrB,cAAc,EAEd,iBAAiB,EAEjB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../src/tools/operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,gBAAgB,EAChB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EAErB,qBAAqB,EACrB,cAAc,EAEd,iBAAiB,EAEjB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,SAAS,EAAsB,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAM9F,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAA8B,EAAE,KAAc;IAC1E,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,eAAe,CAAW,OAAO,EAAE,yBAAyB,CAAC,CAAC;IAC1F,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChG,OAAO,aAAa,CAAC;YACnB,GAAG,OAAO;YACV,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,oBAAoB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG;YAClI,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,cAAc,EAAE;gBACnF,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,uBAAuB,EAAE,IAAI,EAAE,aAAa,EAAE;aAC3E;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAW,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA8B,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,eAAe,CAAc,OAAO,EAAE,4BAA4B,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAClC,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAChE,CAAC;QACF,OAAO,aAAa,CAAC;YACnB,GAAG,OAAO;YACV,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,qBAAqB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG;YACzG,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,wBAAwB,EAAE,IAAI,EAAE,aAAa,EAAE;gBAC3E,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,cAAc,EAAE;aACpF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAc,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA8B,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,eAAe,CAAa,OAAO,EAAE,4BAA4B,CAAC,CAAC;IAC/F,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,CACjC,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAChE,CAAC;QACF,OAAO,aAAa,CAAC;YACnB,GAAG,OAAO;YACV,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,iBAAiB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW;YAC7F,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,6BAA6B,EAAE,IAAI,EAAE,aAAa,EAAE;gBAChF,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,cAAc,EAAE;aACpF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAa,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAA8B,EAAE,KAAc;IAC7E,MAAM,MAAM,GAAG,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,eAAe,CAAc,OAAO,EAAE,4BAA4B,CAAC,CAAC;IAChG,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,CAClC,MAAM,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAChE,CAAC;QACF,OAAO,aAAa,CAAC;YACnB,GAAG,OAAO;YACV,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,uBAAuB,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,eAAe,IAAI,CAAC,SAAS,GAAG;YACxH,WAAW,EAAE;gBACX,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,kCAAkC,EAAE,IAAI,EAAE,UAAU,EAAE;gBAClF,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,+BAA+B,EAAE,IAAI,EAAE,cAAc,EAAE;aACpF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAc,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/tools/rollback.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,
|
|
1
|
+
{"version":3,"file":"rollback.d.ts","sourceRoot":"","sources":["../../src/tools/rollback.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,eAAe,CAAC;AAEvB,UAAU,mBAAoB,SAAQ,aAAa;IACjD,QAAQ,CAAC,YAAY,EAAE,qBAAqB,CAAC;CAC9C;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO;;;;;;;;;;;;;;;;IAqDpF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { rollbackDeploymentInputSchema, rollbackViewSchema, } from '../contracts.js';
|
|
2
|
-
import { errorResult,
|
|
2
|
+
import { errorResult, portError, successResult, validationError, } from '../results.js';
|
|
3
3
|
export async function rollbackDeployment(context, input) {
|
|
4
4
|
if (!context.ctx.capabilities.includes('deployments:rollback')) {
|
|
5
5
|
return errorResult({
|
|
@@ -9,8 +9,8 @@ export async function rollbackDeployment(context, input) {
|
|
|
9
9
|
nextActions: [
|
|
10
10
|
{
|
|
11
11
|
kind: 'read_resource',
|
|
12
|
-
label: 'Review
|
|
13
|
-
resource: 'noodle://developer/capabilities/
|
|
12
|
+
label: 'Review Developer MCP capabilities',
|
|
13
|
+
resource: 'noodle://developer/capabilities/v2',
|
|
14
14
|
},
|
|
15
15
|
],
|
|
16
16
|
});
|
|
@@ -19,24 +19,21 @@ export async function rollbackDeployment(context, input) {
|
|
|
19
19
|
if (!parsed.success) {
|
|
20
20
|
return validationError(context, 'Invalid rollback_deployment input.');
|
|
21
21
|
}
|
|
22
|
-
if (!context.ctx.environments.includes(parsed.data.env)) {
|
|
23
|
-
return forbiddenEnvironment(context, parsed.data.env);
|
|
24
|
-
}
|
|
25
22
|
try {
|
|
26
23
|
const data = rollbackViewSchema.parse(await context.controlPlane.rollbackDeployment(context.ctx, parsed.data));
|
|
27
|
-
if (data.target.app !== parsed.data.app ||
|
|
28
|
-
data.target.env !== parsed.data.env ||
|
|
29
|
-
!context.ctx.environments.includes(data.target.env)) {
|
|
24
|
+
if (data.target.app !== parsed.data.app || data.target.env !== parsed.data.env) {
|
|
30
25
|
return errorResult({
|
|
31
26
|
...context,
|
|
32
27
|
code: 'internal_error',
|
|
33
28
|
message: 'Noodle Cloud returned an out-of-scope rollback response.',
|
|
29
|
+
org: parsed.data.org,
|
|
34
30
|
env: parsed.data.env,
|
|
35
31
|
});
|
|
36
32
|
}
|
|
37
33
|
return successResult({
|
|
38
34
|
...context,
|
|
39
35
|
data,
|
|
36
|
+
org: parsed.data.org,
|
|
40
37
|
env: parsed.data.env,
|
|
41
38
|
summary: data.rollback.alreadyActive
|
|
42
39
|
? `${data.rollback.serverName} deployment ${data.rollback.deploymentId} was already active.`
|
|
@@ -53,7 +50,7 @@ export async function rollbackDeployment(context, input) {
|
|
|
53
50
|
});
|
|
54
51
|
}
|
|
55
52
|
catch (error) {
|
|
56
|
-
return portError(context, error, parsed.data.env);
|
|
53
|
+
return portError(context, error, parsed.data.org, parsed.data.env);
|
|
57
54
|
}
|
|
58
55
|
}
|
|
59
56
|
//# sourceMappingURL=rollback.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/tools/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,
|
|
1
|
+
{"version":3,"file":"rollback.js","sourceRoot":"","sources":["../../src/tools/rollback.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,6BAA6B,EAC7B,kBAAkB,GACnB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,WAAW,EACX,SAAS,EAET,aAAa,EACb,eAAe,GAChB,MAAM,eAAe,CAAC;AAMvB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAA4B,EAAE,KAAc;IACnF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC/D,OAAO,WAAW,CAAe;YAC/B,GAAG,OAAO;YACV,IAAI,EAAE,oBAAoB;YAC1B,OAAO,EAAE,qDAAqD;YAC9D,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,eAAe;oBACrB,KAAK,EAAE,mCAAmC;oBAC1C,QAAQ,EAAE,oCAAoC;iBAC/C;aACF;SACF,CAAC,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,6BAA6B,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,eAAe,CAAe,OAAO,EAAE,oCAAoC,CAAC,CAAC;IACtF,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,kBAAkB,CAAC,KAAK,CACnC,MAAM,OAAO,CAAC,YAAY,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CACxE,CAAC;QACF,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YAC/E,OAAO,WAAW,CAAe;gBAC/B,GAAG,OAAO;gBACV,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,0DAA0D;gBACnE,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;gBACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;aACrB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,aAAa,CAAC;YACnB,GAAG,OAAO;YACV,IAAI;YACJ,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;YACpB,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa;gBAClC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,eAAe,IAAI,CAAC,QAAQ,CAAC,YAAY,sBAAsB;gBAC5F,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,8BAA8B,IAAI,CAAC,QAAQ,CAAC,YAAY,GAAG;YAC1F,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,WAAW;oBACjB,KAAK,EAAE,+BAA+B;oBACtC,IAAI,EAAE,oBAAoB;iBAC3B;gBACD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,yBAAyB,EAAE,IAAI,EAAE,UAAU,EAAE;gBACzE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,8BAA8B,EAAE,IAAI,EAAE,aAAa,EAAE;aAClF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,SAAS,CAAe,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnF,CAAC;AACH,CAAC"}
|
|
@@ -1,35 +1,59 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tenant search budget (ADR 0202 as amended): an org-pooled monthly ceiling
|
|
3
|
-
* retrieval (managed site-search queries), consumed pre-spend
|
|
4
|
-
*
|
|
2
|
+
* Tenant search budget (ADR 0202 as amended): an org-pooled monthly ceiling with per-app
|
|
3
|
+
* sub-caps on metered retrieval (managed site-search queries), consumed pre-spend and
|
|
4
|
+
* atomically — a refused request spends nothing at either granularity. On breach, retrieval
|
|
5
|
+
* is blocked with an honest operator-visible state — never silently degraded.
|
|
5
6
|
*
|
|
6
7
|
* Budgets bound *our* COGS, not the customer's model spend (admission limits own that), so
|
|
7
|
-
* the window is a calendar month keyed by the billing org.
|
|
8
|
+
* the window is a calendar month keyed by the billing org, subdivided per app.
|
|
8
9
|
*/
|
|
10
|
+
export interface SearchBudgetScope {
|
|
11
|
+
readonly org: string;
|
|
12
|
+
readonly app: string;
|
|
13
|
+
}
|
|
14
|
+
export interface SearchBudgetCeilings {
|
|
15
|
+
/** Org-pooled monthly ceiling. Zero blocks all consumption (kill switch). */
|
|
16
|
+
readonly org: number;
|
|
17
|
+
/** Per-app monthly sub-cap. Zero blocks the app (kill switch). */
|
|
18
|
+
readonly app: number;
|
|
19
|
+
}
|
|
9
20
|
export interface SearchBudgetState {
|
|
10
21
|
readonly org: string;
|
|
22
|
+
readonly app: string;
|
|
11
23
|
readonly year: number;
|
|
12
24
|
readonly month: number;
|
|
13
|
-
readonly
|
|
14
|
-
readonly
|
|
25
|
+
readonly orgConsumed: number;
|
|
26
|
+
readonly appConsumed: number;
|
|
27
|
+
readonly orgCeiling: number;
|
|
28
|
+
readonly appCeiling: number;
|
|
29
|
+
}
|
|
30
|
+
export interface SearchBudgetDecision {
|
|
31
|
+
/** False means the request was refused and nothing was spent at either granularity. */
|
|
32
|
+
readonly granted: boolean;
|
|
33
|
+
readonly state: SearchBudgetState;
|
|
15
34
|
}
|
|
16
35
|
export interface SearchBudgetStore {
|
|
17
|
-
/**
|
|
18
|
-
|
|
19
|
-
* the attempt; `state.consumed > state.ceiling` means the request was refused and nothing
|
|
20
|
-
* was spent.
|
|
21
|
-
*/
|
|
22
|
-
consume(org: string, count: number, ceiling: number): Promise<SearchBudgetState>;
|
|
36
|
+
/** Try to consume `count` queries against both ceilings atomically. */
|
|
37
|
+
consume(scope: SearchBudgetScope, count: number, ceilings: SearchBudgetCeilings): Promise<SearchBudgetDecision>;
|
|
23
38
|
/** Current month state without consuming. */
|
|
24
|
-
peek(
|
|
39
|
+
peek(scope: SearchBudgetScope, ceilings: SearchBudgetCeilings): Promise<SearchBudgetState>;
|
|
25
40
|
}
|
|
41
|
+
export declare function budgetWindow(now: () => Date): {
|
|
42
|
+
year: number;
|
|
43
|
+
month: number;
|
|
44
|
+
};
|
|
26
45
|
export declare class InMemorySearchBudgetStore implements SearchBudgetStore {
|
|
27
46
|
private readonly counters;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
47
|
+
private readonly now;
|
|
48
|
+
constructor(now?: () => Date);
|
|
49
|
+
consume(scope: SearchBudgetScope, count: number, ceilings: SearchBudgetCeilings): Promise<SearchBudgetDecision>;
|
|
50
|
+
peek(scope: SearchBudgetScope, ceilings: SearchBudgetCeilings): Promise<SearchBudgetState>;
|
|
51
|
+
private counter;
|
|
52
|
+
private state;
|
|
53
|
+
private appKey;
|
|
54
|
+
private orgKey;
|
|
31
55
|
}
|
|
32
|
-
/** Thrown by callers when a budget
|
|
56
|
+
/** Thrown by callers when a budget decision was refused. */
|
|
33
57
|
export declare class SearchBudgetExhaustedError extends Error {
|
|
34
58
|
readonly state: SearchBudgetState;
|
|
35
59
|
constructor(state: SearchBudgetState);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"budget.d.ts","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,oBAAoB;IACnC,uFAAuF;IACvF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,OAAO,CACL,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACjC,6CAA6C;IAC7C,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAC5F;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAG7E;AAED,qBAAa,yBAA0B,YAAW,iBAAiB;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwE;IACjG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAa;gBAErB,GAAG,GAAE,MAAM,IAAuB;IAIxC,OAAO,CACX,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAgB1B,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAWhG,OAAO,CAAC,OAAO;IAiBf,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;CAGf;AAED,4DAA4D;AAC5D,qBAAa,0BAA2B,SAAQ,KAAK;IACnD,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;gBAEtB,KAAK,EAAE,iBAAiB;CASrC"}
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"budget.js","sourceRoot":"","sources":["../src/budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,7 @@ export * from './ir.js';
|
|
|
20
20
|
export * from './limits.js';
|
|
21
21
|
export * from './manifest-schema.js';
|
|
22
22
|
export * from './ports.js';
|
|
23
|
+
export * from './postgres-budget-store.js';
|
|
23
24
|
export * from './postgres-revision-store.js';
|
|
24
25
|
export * from './revision-store.js';
|
|
25
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
|
|
@@ -20,6 +20,7 @@ export * from './ir.js';
|
|
|
20
20
|
export * from './limits.js';
|
|
21
21
|
export * from './manifest-schema.js';
|
|
22
22
|
export * from './ports.js';
|
|
23
|
+
export * from './postgres-budget-store.js';
|
|
23
24
|
export * from './postgres-revision-store.js';
|
|
24
25
|
export * from './revision-store.js';
|
|
25
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,YAAY,CAAC;AAC3B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable search-budget store: Postgres parity for the org-pooled monthly ceiling with
|
|
3
|
+
* per-app sub-caps (ADR 0202 as amended). Consume is one transaction over two counter rows
|
|
4
|
+
* (the app row and the org-total row `app = ''`), locked in a fixed order, so concurrent
|
|
5
|
+
* requests can never over-grant and a refusal spends nothing at either granularity.
|
|
6
|
+
*/
|
|
7
|
+
import type { Pool } from 'pg';
|
|
8
|
+
import { type SearchBudgetCeilings, type SearchBudgetDecision, type SearchBudgetScope, type SearchBudgetState, type SearchBudgetStore } from './budget.js';
|
|
9
|
+
export declare class PostgresSearchBudgetStore implements SearchBudgetStore {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(pool: Pool, now?: () => Date);
|
|
12
|
+
ensureSchema(): Promise<void>;
|
|
13
|
+
consume(scope: SearchBudgetScope, count: number, ceilings: SearchBudgetCeilings): Promise<SearchBudgetDecision>;
|
|
14
|
+
peek(scope: SearchBudgetScope, ceilings: SearchBudgetCeilings): Promise<SearchBudgetState>;
|
|
15
|
+
/** Ensure the counter row exists, lock it, and return its consumed value. */
|
|
16
|
+
private lockCounter;
|
|
17
|
+
private addToCounter;
|
|
18
|
+
private state;
|
|
19
|
+
private orgKey;
|
|
20
|
+
private appKey;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=postgres-budget-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-budget-store.d.ts","sourceRoot":"","sources":["../src/postgres-budget-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,IAAI,EAAc,MAAM,IAAI,CAAC;AAC3C,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACvB,MAAM,aAAa,CAAC;AAKrB,qBAAa,yBAA0B,YAAW,iBAAiB;;gBAIrD,IAAI,EAAE,IAAI,EAAE,GAAG,GAAE,MAAM,IAAuB;IAKpD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAa7B,OAAO,CACX,KAAK,EAAE,iBAAiB,EACxB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,oBAAoB,GAC7B,OAAO,CAAC,oBAAoB,CAAC;IAgC1B,IAAI,CAAC,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAgBhG,6EAA6E;YAC/D,WAAW;YAqBX,YAAY;IAc1B,OAAO,CAAC,KAAK;IAkBb,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,MAAM;CAGf"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { budgetWindow, } from './budget.js';
|
|
2
|
+
/** The org-total row's app key; real app ids are never empty. */
|
|
3
|
+
const ORG_TOTAL_APP = '';
|
|
4
|
+
export class PostgresSearchBudgetStore {
|
|
5
|
+
#pool;
|
|
6
|
+
#now;
|
|
7
|
+
constructor(pool, now = () => new Date()) {
|
|
8
|
+
this.#pool = pool;
|
|
9
|
+
this.#now = now;
|
|
10
|
+
}
|
|
11
|
+
async ensureSchema() {
|
|
12
|
+
await this.#pool.query(`
|
|
13
|
+
CREATE TABLE IF NOT EXISTS knowledge_search_budgets (
|
|
14
|
+
org text NOT NULL,
|
|
15
|
+
app text NOT NULL,
|
|
16
|
+
year integer NOT NULL,
|
|
17
|
+
month integer NOT NULL,
|
|
18
|
+
consumed bigint NOT NULL DEFAULT 0,
|
|
19
|
+
PRIMARY KEY (org, app, year, month)
|
|
20
|
+
)
|
|
21
|
+
`);
|
|
22
|
+
}
|
|
23
|
+
async consume(scope, count, ceilings) {
|
|
24
|
+
const window = budgetWindow(this.#now);
|
|
25
|
+
if (ceilings.app <= 0 || ceilings.org <= 0) {
|
|
26
|
+
// Kill switch: block before touching the database.
|
|
27
|
+
const state = await this.peek(scope, ceilings);
|
|
28
|
+
return { granted: false, state };
|
|
29
|
+
}
|
|
30
|
+
const client = await this.#pool.connect();
|
|
31
|
+
try {
|
|
32
|
+
await client.query('BEGIN');
|
|
33
|
+
const appConsumed = await this.lockCounter(client, scope.org, scope.app, window);
|
|
34
|
+
const orgConsumed = await this.lockCounter(client, scope.org, ORG_TOTAL_APP, window);
|
|
35
|
+
const granted = appConsumed + count <= ceilings.app && orgConsumed + count <= ceilings.org;
|
|
36
|
+
if (granted) {
|
|
37
|
+
await this.addToCounter(client, scope.org, scope.app, window, count);
|
|
38
|
+
await this.addToCounter(client, scope.org, ORG_TOTAL_APP, window, count);
|
|
39
|
+
await client.query('COMMIT');
|
|
40
|
+
return {
|
|
41
|
+
granted,
|
|
42
|
+
state: this.state(scope, window, ceilings, orgConsumed + count, appConsumed + count),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
await client.query('ROLLBACK');
|
|
46
|
+
return { granted, state: this.state(scope, window, ceilings, orgConsumed, appConsumed) };
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
await client.query('ROLLBACK').catch(() => undefined);
|
|
50
|
+
throw error;
|
|
51
|
+
}
|
|
52
|
+
finally {
|
|
53
|
+
client.release();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
async peek(scope, ceilings) {
|
|
57
|
+
const window = budgetWindow(this.#now);
|
|
58
|
+
const result = await this.#pool.query(`SELECT app, consumed FROM knowledge_search_budgets
|
|
59
|
+
WHERE org = $1 AND app IN ($2, $3) AND year = $4 AND month = $5`, [this.orgKey(scope), this.appKey(scope), ORG_TOTAL_APP, window.year, window.month]);
|
|
60
|
+
let orgConsumed = 0;
|
|
61
|
+
let appConsumed = 0;
|
|
62
|
+
for (const row of result.rows) {
|
|
63
|
+
if (row.app === ORG_TOTAL_APP)
|
|
64
|
+
orgConsumed = Number(row.consumed);
|
|
65
|
+
else
|
|
66
|
+
appConsumed = Number(row.consumed);
|
|
67
|
+
}
|
|
68
|
+
return this.state(scope, window, ceilings, orgConsumed, appConsumed);
|
|
69
|
+
}
|
|
70
|
+
/** Ensure the counter row exists, lock it, and return its consumed value. */
|
|
71
|
+
async lockCounter(client, org, app, window) {
|
|
72
|
+
await client.query(`INSERT INTO knowledge_search_budgets (org, app, year, month, consumed)
|
|
73
|
+
VALUES ($1, $2, $3, $4, 0)
|
|
74
|
+
ON CONFLICT (org, app, year, month) DO NOTHING`, [org.toLowerCase(), app.toLowerCase(), window.year, window.month]);
|
|
75
|
+
const locked = await client.query(`SELECT consumed FROM knowledge_search_budgets
|
|
76
|
+
WHERE org = $1 AND app = $2 AND year = $3 AND month = $4
|
|
77
|
+
FOR UPDATE`, [org.toLowerCase(), app.toLowerCase(), window.year, window.month]);
|
|
78
|
+
return Number(locked.rows[0]?.consumed ?? 0);
|
|
79
|
+
}
|
|
80
|
+
async addToCounter(client, org, app, window, count) {
|
|
81
|
+
await client.query(`UPDATE knowledge_search_budgets SET consumed = consumed + $5
|
|
82
|
+
WHERE org = $1 AND app = $2 AND year = $3 AND month = $4`, [org.toLowerCase(), app.toLowerCase(), window.year, window.month, count]);
|
|
83
|
+
}
|
|
84
|
+
state(scope, window, ceilings, orgConsumed, appConsumed) {
|
|
85
|
+
return {
|
|
86
|
+
org: scope.org,
|
|
87
|
+
app: scope.app,
|
|
88
|
+
...window,
|
|
89
|
+
orgConsumed,
|
|
90
|
+
appConsumed,
|
|
91
|
+
orgCeiling: ceilings.org,
|
|
92
|
+
appCeiling: ceilings.app,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
orgKey(scope) {
|
|
96
|
+
return scope.org.toLowerCase();
|
|
97
|
+
}
|
|
98
|
+
appKey(scope) {
|
|
99
|
+
return scope.app.toLowerCase();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=postgres-budget-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres-budget-store.js","sourceRoot":"","sources":["../src/postgres-budget-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import type { Pool } from 'pg';
|
|
13
13
|
import type { KnowledgeScope } from './ir.js';
|
|
14
|
-
import { type KnowledgeRevision } from './ports.js';
|
|
15
|
-
import type
|
|
14
|
+
import { type KnowledgeRevision, type StagedDocument } from './ports.js';
|
|
15
|
+
import { type DocumentTextCodec, type KnowledgeRevisionStore, type LeaseTicket, type RevisionRecord, type StageRevisionInput } from './revision-store.js';
|
|
16
16
|
export declare class PostgresKnowledgeRevisionStore implements KnowledgeRevisionStore {
|
|
17
17
|
#private;
|
|
18
|
-
constructor(pool: Pool);
|
|
18
|
+
constructor(pool: Pool, codec?: DocumentTextCodec);
|
|
19
19
|
ensureSchema(): Promise<void>;
|
|
20
20
|
stage(input: StageRevisionInput): Promise<KnowledgeRevision>;
|
|
21
21
|
acquireLease(scope: KnowledgeScope, componentName: string, holder: string): Promise<LeaseTicket>;
|
|
@@ -27,6 +27,8 @@ export declare class PostgresKnowledgeRevisionStore implements KnowledgeRevision
|
|
|
27
27
|
active(scope: KnowledgeScope, componentName: string): Promise<KnowledgeRevision | undefined>;
|
|
28
28
|
record(revisionId: string): Promise<RevisionRecord | undefined>;
|
|
29
29
|
delete(revisionId: string): Promise<void>;
|
|
30
|
+
stageDocuments(revisionId: string, documents: readonly StagedDocument[]): Promise<void>;
|
|
31
|
+
documents(revisionId: string): Promise<readonly StagedDocument[]>;
|
|
30
32
|
private rowScope;
|
|
31
33
|
private toRevision;
|
|
32
34
|
}
|