@noodleseed/one 0.168.0 → 0.170.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/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/capabilities.d.ts +19 -0
- package/dist/commands/capabilities.d.ts.map +1 -0
- package/dist/commands/capabilities.js +128 -0
- package/dist/commands/capabilities.js.map +1 -0
- package/dist/commands/deployment-delete-ops.d.ts +12 -0
- package/dist/commands/deployment-delete-ops.d.ts.map +1 -0
- package/dist/commands/deployment-delete-ops.js +230 -0
- package/dist/commands/deployment-delete-ops.js.map +1 -0
- package/dist/commands/deployment-delete-recovery.d.ts +35 -0
- package/dist/commands/deployment-delete-recovery.d.ts.map +1 -0
- package/dist/commands/deployment-delete-recovery.js +99 -0
- package/dist/commands/deployment-delete-recovery.js.map +1 -0
- package/dist/commands/deployments-ops.d.ts +2 -1
- package/dist/commands/deployments-ops.d.ts.map +1 -1
- package/dist/commands/deployments-ops.js +5 -1
- package/dist/commands/deployments-ops.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/plugin-mode/plugin-operation-contract.d.ts +2 -2
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +2 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-authoring-refs.js +3 -2
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.d.ts +1 -0
- package/node_modules/@noodle-borg/assistant-gateway/dist/assistant-interactive.js +4 -1
- package/node_modules/@noodle-borg/authoring/dist/assistant.d.ts +2 -2
- package/node_modules/@noodle-borg/authoring/dist/assistant.js +3 -1
- package/node_modules/@noodle-borg/authoring/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/authoring/dist/index.js +1 -0
- package/node_modules/@noodle-borg/authoring/dist/load-authored.js +1 -1
- package/node_modules/@noodle-borg/authoring/dist/recording.d.ts +2 -1
- package/node_modules/@noodle-borg/authoring/dist/recording.js +29 -1
- package/node_modules/@noodle-borg/authoring/dist/server.d.ts +3 -0
- package/node_modules/@noodle-borg/authoring/dist/server.js +5 -1
- package/node_modules/@noodle-borg/authoring/dist/web-capabilities.d.ts +17 -0
- package/node_modules/@noodle-borg/authoring/dist/web-capabilities.js +15 -0
- package/node_modules/@noodle-borg/authoring/package.json +1 -0
- package/node_modules/@noodle-borg/capabilities/dist/index.js +7 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-hosted-observability.js +102 -0
- package/node_modules/@noodle-borg/cli-catalog/dist/catalog-data-tenant-resources.js +27 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/assemble.js +3 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/types.d.ts +2 -0
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.d.ts +2 -1
- package/node_modules/@noodle-borg/compiler/dist/artifact/version.js +2 -1
- package/node_modules/@noodle-borg/compiler/dist/compile.js +2 -0
- package/node_modules/@noodle-borg/compiler/dist/fulfilment-emit.js +18 -3
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.d.ts +34 -0
- package/node_modules/@noodle-borg/compiler/dist/manifest/schema.js +9 -2
- package/node_modules/@noodle-borg/compiler/dist/web-capabilities.js +55 -0
- package/node_modules/@noodle-borg/compiler/package.json +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/ssrf.js +5 -0
- package/node_modules/@noodle-borg/control-plane/dist/delete-deployment.d.ts +44 -0
- package/node_modules/@noodle-borg/control-plane/dist/delete-deployment.js +105 -0
- package/node_modules/@noodle-borg/control-plane/dist/deployment-deletion-contracts.d.ts +20 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.d.ts +2 -0
- package/node_modules/@noodle-borg/control-plane/dist/portable.js +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/bounded-body.js +38 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/first-party.js +2 -3
- package/node_modules/@noodle-borg/knowledge-crawl/dist/html-text.js +10 -2
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/index.js +1 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.d.ts +26 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/page-reader.js +127 -0
- package/node_modules/@noodle-borg/knowledge-crawl/dist/robots.js +48 -23
- package/node_modules/@noodle-borg/knowledge-crawl/package.json +1 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/budget.d.ts +29 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/budget.js +124 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.d.ts +212 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/contracts.js +113 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/errors.d.ts +8 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/errors.js +21 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/executor.d.ts +26 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/executor.js +156 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/limits.d.ts +15 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/limits.js +15 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.d.ts +159 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-contracts.js +69 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.d.ts +5 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/operator-route.js +160 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.d.ts +34 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/policy-store.js +61 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/portable.d.ts +10 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/portable.js +10 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/service.d.ts +83 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/service.js +139 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/urls.d.ts +3 -0
- package/node_modules/@noodle-borg/managed-capabilities/dist/urls.js +30 -0
- package/node_modules/@noodle-borg/managed-capabilities/package.json +49 -0
- package/node_modules/@noodle-borg/module/dist/contract.d.ts +11 -0
- package/node_modules/@noodle-borg/runtime/dist/confirmation.js +29 -0
- package/node_modules/@noodle-borg/runtime/dist/connector/types.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.d.ts +3 -0
- package/node_modules/@noodle-borg/runtime/dist/execute.js +6 -1
- package/node_modules/@noodle-borg/runtime/dist/index.d.ts +2 -1
- package/node_modules/@noodle-borg/runtime/dist/index.js +2 -1
- package/node_modules/@noodle-borg/runtime/dist/interactive.js +10 -1
- package/node_modules/@noodle-borg/runtime/dist/operation-execution.js +3 -0
- package/node_modules/@noodle-borg/runtime/dist/result-meta.d.ts +2 -0
- package/node_modules/@noodle-borg/runtime/dist/result-meta.js +6 -0
- package/node_modules/@noodle-borg/runtime/dist/result.d.ts +4 -0
- package/node_modules/@noodle-borg/runtime/dist/web-capabilities.d.ts +71 -0
- package/node_modules/@noodle-borg/runtime/dist/web-capabilities.js +41 -0
- package/node_modules/@noodle-borg/runtime/package.json +1 -0
- package/node_modules/@noodle-borg/service/dist/deployment-deletion.js +40 -0
- package/node_modules/@noodle-borg/service/dist/local-options.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/local-web-capabilities.js +13 -0
- package/node_modules/@noodle-borg/service/dist/mcp-protocol-runtime.js +21 -0
- package/node_modules/@noodle-borg/service/dist/modules/route-dispatch.js +13 -0
- package/node_modules/@noodle-borg/service/dist/registry-compile.js +9 -0
- package/node_modules/@noodle-borg/service/dist/registry-deletion.js +75 -0
- package/node_modules/@noodle-borg/service/dist/registry-state.js +4 -2
- package/node_modules/@noodle-borg/service/dist/registry-targets.js +4 -0
- package/node_modules/@noodle-borg/service/dist/registry-types.d.ts +1 -0
- package/node_modules/@noodle-borg/service/dist/registry.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/registry.js +10 -23
- package/node_modules/@noodle-borg/service/dist/routes/assistant-agent.js +5 -2
- package/node_modules/@noodle-borg/service/dist/routes/assistant-interactions.js +7 -4
- package/node_modules/@noodle-borg/service/dist/routes/deploy-dispatch.js +15 -1
- package/node_modules/@noodle-borg/service/dist/routes/deployment-delete.js +53 -0
- package/node_modules/@noodle-borg/service/dist/serve-local.js +14 -0
- package/node_modules/@noodle-borg/service/dist/serve-resource-auth.js +10 -0
- package/node_modules/@noodle-borg/service/dist/service.js +7 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/store/in-memory.js +8 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file-deletion.js +64 -0
- package/node_modules/@noodle-borg/service/dist/store/json-file.d.ts +2 -1
- package/node_modules/@noodle-borg/service/dist/store/json-file.js +23 -5
- package/node_modules/@noodle-borg/service/dist/store.d.ts +5 -1
- package/node_modules/@noodle-borg/service/dist/web-capabilities.js +39 -0
- package/node_modules/@noodle-borg/service/package.json +3 -1
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-deletion.d.ts +29 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/deployment-deletion.js +33 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.d.ts +2 -0
- package/node_modules/@noodle-borg/wire-contracts/dist/index.js +2 -0
- package/node_modules/@noodle-borg/wire-contracts/package.json +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { mkdir, open, readFile, rename } from 'node:fs/promises';
|
|
3
|
+
import { dirname, join, resolve } from 'node:path';
|
|
4
|
+
import { DEPLOYMENT_ID_PATTERN } from './validate.js';
|
|
5
|
+
const lifecycleTails = new Map();
|
|
6
|
+
/** All adapters for one local directory join the same process-local lifecycle ordering. */
|
|
7
|
+
export function serializeFileLifecycle(directory, operation) {
|
|
8
|
+
const key = resolve(directory);
|
|
9
|
+
const result = (lifecycleTails.get(key) ?? Promise.resolve()).then(operation, operation);
|
|
10
|
+
const tail = result.then(() => undefined, () => undefined);
|
|
11
|
+
lifecycleTails.set(key, tail);
|
|
12
|
+
void tail.then(() => {
|
|
13
|
+
if (lifecycleTails.get(key) === tail)
|
|
14
|
+
lifecycleTails.delete(key);
|
|
15
|
+
});
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
/** Fail closed on an unreadable deletion journal; missing means no deletions have committed. */
|
|
19
|
+
export async function readDeletedDeploymentIds(directory) {
|
|
20
|
+
let text;
|
|
21
|
+
try {
|
|
22
|
+
text = await readFile(join(directory, 'deleted-deployments.json'), 'utf8');
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
if (error.code === 'ENOENT')
|
|
26
|
+
return new Set();
|
|
27
|
+
throw error;
|
|
28
|
+
}
|
|
29
|
+
const ids = JSON.parse(text);
|
|
30
|
+
if (!Array.isArray(ids) ||
|
|
31
|
+
ids.some((id) => typeof id !== 'string' || !DEPLOYMENT_ID_PATTERN.test(id))) {
|
|
32
|
+
throw new Error('Invalid deployment deletion journal');
|
|
33
|
+
}
|
|
34
|
+
return new Set(ids);
|
|
35
|
+
}
|
|
36
|
+
/** Rename is the logical commit; retained ID tombstones also reject retries that would resurrect records. */
|
|
37
|
+
export async function commitDeletedDeploymentIds(directory, ids) {
|
|
38
|
+
const deleted = new Set(await readDeletedDeploymentIds(directory));
|
|
39
|
+
for (const id of ids)
|
|
40
|
+
deleted.add(id);
|
|
41
|
+
await mkdir(directory, { recursive: true });
|
|
42
|
+
const path = join(directory, 'deleted-deployments.json');
|
|
43
|
+
const temporary = `${path}.${randomUUID()}.tmp`;
|
|
44
|
+
const file = await open(temporary, 'wx', 0o600);
|
|
45
|
+
try {
|
|
46
|
+
await file.writeFile(JSON.stringify([...deleted].sort()));
|
|
47
|
+
await file.sync();
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await file.close();
|
|
51
|
+
}
|
|
52
|
+
await rename(temporary, path);
|
|
53
|
+
// Persist both the commit rename and the metadata directory before removing any deployment files.
|
|
54
|
+
for (const parent of [directory, dirname(directory)]) {
|
|
55
|
+
const handle = await open(parent, 'r');
|
|
56
|
+
try {
|
|
57
|
+
await handle.sync();
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await handle.close();
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=json-file-deletion.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActiveAccessUpdateInput, AppArchiveResult, AppRestorePrecondition, AppRestoreResult, AppSummary, ArtifactStore, DeploymentActivationPrecondition, DeploymentActivationResult, DeploymentListFilter, DeploymentLock, DeploymentLockUpdateResult, DeploymentPolicyPrecondition, DeploymentSummary, DeployRecord, EnvSummary, ProductionEnvironmentChange, TenantAuthConfig, TenantRef } from '../store.js';
|
|
1
|
+
import type { ActiveAccessUpdateInput, AppArchiveResult, AppRestorePrecondition, AppRestoreResult, AppSummary, ArtifactStore, DeploymentActivationPrecondition, DeploymentActivationResult, DeploymentDeleteResult, DeploymentDeleteSelection, DeploymentListFilter, DeploymentLock, DeploymentLockUpdateResult, DeploymentPolicyPrecondition, DeploymentSummary, DeployRecord, EnvSummary, ProductionEnvironmentChange, TenantAuthConfig, TenantRef } from '../store.js';
|
|
2
2
|
/**
|
|
3
3
|
* JSON-file store: one file per deployment at `<dataDir>/deployments/<deploymentId>.json`, written atomically
|
|
4
4
|
* (write a temp file, then `rename` over the target — no partial file is ever read). `deploymentId` is a
|
|
@@ -8,6 +8,7 @@ import type { ActiveAccessUpdateInput, AppArchiveResult, AppRestorePrecondition,
|
|
|
8
8
|
export declare class JsonFileArtifactStore implements ArtifactStore {
|
|
9
9
|
#private;
|
|
10
10
|
constructor(dataDir: string);
|
|
11
|
+
deleteDeployments(ref: TenantRef, selection: DeploymentDeleteSelection): Promise<DeploymentDeleteResult>;
|
|
11
12
|
append(record: DeployRecord, precondition?: DeploymentPolicyPrecondition): Promise<void>;
|
|
12
13
|
get(deploymentId: string): Promise<DeployRecord | undefined>;
|
|
13
14
|
getActiveByTenant(ref: TenantRef): Promise<DeployRecord | undefined>;
|
|
@@ -5,9 +5,11 @@ import { normalizeServerVersion } from '@noodle-borg/module';
|
|
|
5
5
|
import { assertSameAppPackageSnapshot, sanitizeDeployRecordAppPackageSnapshot, } from '../app-package-snapshot.js';
|
|
6
6
|
import { assertCustomerAuthRestorePrecondition, assertUniqueActiveCustomerAuthAudienceBindings, findActiveCustomerAuthAudienceConflict, requiresCustomerAuthProjection, } from '../customer-auth-audience-binding.js';
|
|
7
7
|
import { matchesDeploymentActivation } from '../deployment-activation-precondition.js';
|
|
8
|
+
import { planDeploymentDeletion } from '../deployment-deletion.js';
|
|
8
9
|
import { assertDeploymentActivationUnlocked, assertDeploymentAppendUnlocked, } from '../deployment-lock.js';
|
|
9
10
|
import { assertDeploymentAppendPolicy, assertDeploymentAppendVersion, } from '../deployment-record-version.js';
|
|
10
11
|
import { defaultActiveRecord, sameDeploymentScope, sameTenantRecord, } from '../deployment-versioning.js';
|
|
12
|
+
import { commitDeletedDeploymentIds, readDeletedDeploymentIds, serializeFileLifecycle, } from './json-file-deletion.js';
|
|
11
13
|
import { appArchivedAt, deploymentSummary, matchesDeploymentFilter, paginateAppSummaries, planAppArchive, planAppRestore, planArchivedAppSweep, preserveDeploymentOwnerState, resolveActiveAccessUpdate, resolveProductionEnvironment, summarizeApps, summarizeEnvs, validateDeploymentListFilter, withoutArchiveStamp, } from './records.js';
|
|
12
14
|
import { DEPLOYMENT_ID_PATTERN, validateSlug, validateTenantRef } from './validate.js';
|
|
13
15
|
/**
|
|
@@ -19,11 +21,23 @@ import { DEPLOYMENT_ID_PATTERN, validateSlug, validateTenantRef } from './valida
|
|
|
19
21
|
export class JsonFileArtifactStore {
|
|
20
22
|
#dir;
|
|
21
23
|
#environmentMetadataDir;
|
|
22
|
-
#
|
|
24
|
+
#deletionMetadataDir;
|
|
23
25
|
constructor(dataDir) {
|
|
24
26
|
this.#dir = join(dataDir, 'deployments');
|
|
27
|
+
this.#deletionMetadataDir = join(dataDir, 'deployment-metadata');
|
|
25
28
|
this.#environmentMetadataDir = join(dataDir, 'environment-metadata');
|
|
26
29
|
}
|
|
30
|
+
deleteDeployments(ref, selection) {
|
|
31
|
+
return this.#serializeLifecycle(async () => {
|
|
32
|
+
const result = planDeploymentDeletion(await this.loadAll(), ref, selection);
|
|
33
|
+
if (!result.ok)
|
|
34
|
+
return result;
|
|
35
|
+
await commitDeletedDeploymentIds(this.#deletionMetadataDir, result.deleted.map((record) => record.deploymentId));
|
|
36
|
+
// Logical deletion has committed. Failed physical cleanup remains hidden by the journal on restart.
|
|
37
|
+
await Promise.all(result.deleted.map((record) => rm(join(this.#dir, `${record.deploymentId}.json`), { force: true }).catch(() => undefined)));
|
|
38
|
+
return result;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
27
41
|
append(record, precondition) {
|
|
28
42
|
return this.#serializeLifecycle(() => this.#appendUnlocked(record, precondition));
|
|
29
43
|
}
|
|
@@ -35,6 +49,9 @@ export class JsonFileArtifactStore {
|
|
|
35
49
|
if (!DEPLOYMENT_ID_PATTERN.test(record.deploymentId)) {
|
|
36
50
|
throw new Error(`invalid deploymentId for persistence: "${record.deploymentId}"`);
|
|
37
51
|
}
|
|
52
|
+
if ((await readDeletedDeploymentIds(this.#deletionMetadataDir)).has(record.deploymentId)) {
|
|
53
|
+
throw new Error('Deployment ID has been deleted');
|
|
54
|
+
}
|
|
38
55
|
const records = await this.loadAll();
|
|
39
56
|
assertDeploymentAppendVersion(records, record);
|
|
40
57
|
assertDeploymentAppendPolicy(records, record, precondition);
|
|
@@ -63,6 +80,8 @@ export class JsonFileArtifactStore {
|
|
|
63
80
|
// An invalid id can never be a file we wrote; treat as absent (also closes off any traversal).
|
|
64
81
|
if (!DEPLOYMENT_ID_PATTERN.test(deploymentId))
|
|
65
82
|
return undefined;
|
|
83
|
+
if ((await readDeletedDeploymentIds(this.#deletionMetadataDir)).has(deploymentId))
|
|
84
|
+
return undefined;
|
|
66
85
|
try {
|
|
67
86
|
const text = await readFile(join(this.#dir, `${deploymentId}.json`), 'utf8');
|
|
68
87
|
return sanitizeDeployRecordAppPackageSnapshot(JSON.parse(text));
|
|
@@ -172,9 +191,7 @@ export class JsonFileArtifactStore {
|
|
|
172
191
|
});
|
|
173
192
|
}
|
|
174
193
|
#serializeLifecycle(operation) {
|
|
175
|
-
|
|
176
|
-
this.#lifecycleTail = result.then(() => undefined, () => undefined);
|
|
177
|
-
return result;
|
|
194
|
+
return serializeFileLifecycle(this.#dir, operation);
|
|
178
195
|
}
|
|
179
196
|
async loadAll() {
|
|
180
197
|
let names;
|
|
@@ -199,7 +216,8 @@ export class JsonFileArtifactStore {
|
|
|
199
216
|
// other servers recover. (Visibility of skipped files lands with structured logging, Slice 27.)
|
|
200
217
|
}
|
|
201
218
|
}
|
|
202
|
-
|
|
219
|
+
const deleted = await readDeletedDeploymentIds(this.#deletionMetadataDir);
|
|
220
|
+
return records.filter((record) => !deleted.has(record.deploymentId));
|
|
203
221
|
}
|
|
204
222
|
async listDeployments(filter) {
|
|
205
223
|
const safe = validateDeploymentListFilter(filter);
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { ArtifactCustomerAuthRouting, HostedPackagedAsset } from '@noodle-borg/compiler';
|
|
2
|
-
import type { OrganizationStore } from '@noodle-borg/control-plane/portable';
|
|
2
|
+
import type { DeploymentDeleteSelection, OrganizationStore, DeploymentDeleteResult as PortableDeploymentDeleteResult } from '@noodle-borg/control-plane/portable';
|
|
3
|
+
export type { DeploymentDeleteSelection } from '@noodle-borg/control-plane/portable';
|
|
3
4
|
import type { OrgMembershipSource } from '@noodle-borg/module';
|
|
4
5
|
import type { SealedSecret } from '@noodle-borg/runtime';
|
|
5
6
|
import type { AccessMode } from '@noodle-borg/transport-http';
|
|
@@ -76,6 +77,7 @@ export interface DeployRecord {
|
|
|
76
77
|
/** Immutable rendered package bytes bound to this exact deployment, when the manifest has a guide. */
|
|
77
78
|
readonly appPackageSnapshot?: AppPackageSnapshotV1;
|
|
78
79
|
}
|
|
80
|
+
export type DeploymentDeleteResult = PortableDeploymentDeleteResult<DeployRecord>;
|
|
79
81
|
export interface DeploymentLockMetadata {
|
|
80
82
|
/** ISO-8601 time the version pointer was locked. */
|
|
81
83
|
readonly lockedAt: string;
|
|
@@ -302,6 +304,8 @@ export interface ControlPlaneStore extends OrganizationStore {
|
|
|
302
304
|
* an earlier deployment without changing the tenant-facing URL.
|
|
303
305
|
*/
|
|
304
306
|
export interface ArtifactStore {
|
|
307
|
+
/** Atomically remove exact deployment history or an inventory-guarded whole version. */
|
|
308
|
+
deleteDeployments(ref: TenantRef, selection: DeploymentDeleteSelection): Promise<DeploymentDeleteResult>;
|
|
305
309
|
append(record: DeployRecord, precondition?: DeploymentPolicyPrecondition): Promise<void>;
|
|
306
310
|
loadAll(): Promise<readonly DeployRecord[]>;
|
|
307
311
|
/**
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CapabilityError } from '@noodle-borg/managed-capabilities';
|
|
2
|
+
import { evaluateToolAuthorization } from '@noodle-borg/protocol';
|
|
3
|
+
import { WebCapabilityConnector } from '@noodle-borg/runtime';
|
|
4
|
+
export function deploymentWebConnector(artifact, tenant, deploymentId, service) {
|
|
5
|
+
if (!artifact.server.capabilities?.length)
|
|
6
|
+
return undefined;
|
|
7
|
+
return new WebCapabilityConnector(artifact.server.capabilities, async (declaration, request, call) => {
|
|
8
|
+
if (service === undefined ||
|
|
9
|
+
deploymentId === undefined ||
|
|
10
|
+
call.execution === undefined ||
|
|
11
|
+
call.capabilityBudget === undefined) {
|
|
12
|
+
throw new CapabilityError('capability_unavailable');
|
|
13
|
+
}
|
|
14
|
+
return service.execute(declaration, request, {
|
|
15
|
+
tenant,
|
|
16
|
+
deploymentId,
|
|
17
|
+
executionId: call.execution.id,
|
|
18
|
+
authorized: evaluateToolAuthorization(declaration.authorization === undefined
|
|
19
|
+
? undefined
|
|
20
|
+
: {
|
|
21
|
+
...(declaration.authorization.discovery === 'public'
|
|
22
|
+
? { discovery: 'public' }
|
|
23
|
+
: {}),
|
|
24
|
+
...(declaration.authorization.requiredScopes === undefined
|
|
25
|
+
? {}
|
|
26
|
+
: { requiredScopes: declaration.authorization.requiredScopes }),
|
|
27
|
+
...(declaration.authorization.allowedRoles === undefined
|
|
28
|
+
? {}
|
|
29
|
+
: { allowedRoles: declaration.authorization.allowedRoles }),
|
|
30
|
+
}, call.caller).allow,
|
|
31
|
+
anonymous: call.caller === undefined || call.caller.identityKind === 'anonymous',
|
|
32
|
+
...(call.caller === undefined ? {} : { subject: call.caller.subject }),
|
|
33
|
+
...(call.publicAdmission === undefined ? {} : { network: call.publicAdmission.network }),
|
|
34
|
+
budget: call.capabilityBudget,
|
|
35
|
+
...(call.signal === undefined ? {} : { signal: call.signal }),
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=web-capabilities.js.map
|
|
@@ -37,9 +37,10 @@
|
|
|
37
37
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@noodle-borg/managed-capabilities": "0.0.0",
|
|
40
41
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
41
42
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
42
|
-
"@noodle-borg/agent-kit": "0.
|
|
43
|
+
"@noodle-borg/agent-kit": "0.105.0",
|
|
43
44
|
"@noodle-borg/app-package": "0.0.0",
|
|
44
45
|
"@noodle-borg/assistant-gateway": "0.0.0",
|
|
45
46
|
"@noodle-borg/auth": "0.0.0",
|
|
@@ -51,6 +52,7 @@
|
|
|
51
52
|
"@noodle-borg/developer-mcp": "0.0.0",
|
|
52
53
|
"@noodle-borg/external-credential-provider": "0.0.0",
|
|
53
54
|
"@noodle-borg/knowledge": "0.0.0",
|
|
55
|
+
"@noodle-borg/knowledge-crawl": "0.0.0",
|
|
54
56
|
"@noodle-borg/knowledge-operations": "0.0.0",
|
|
55
57
|
"@noodle-borg/module": "0.0.0",
|
|
56
58
|
"@noodle-borg/module-audit": "0.0.0",
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** Bind destructive version deletion to the complete inventory the operator confirmed. */
|
|
3
|
+
export declare const deploymentVersionDeleteRequestSchema: z.ZodObject<{
|
|
4
|
+
expectedDeploymentIds: z.ZodArray<z.ZodString>;
|
|
5
|
+
}, z.core.$strict>;
|
|
6
|
+
export type DeploymentVersionDeleteRequest = z.infer<typeof deploymentVersionDeleteRequestSchema>;
|
|
7
|
+
export declare const deploymentDeleteResponseSchema: z.ZodObject<{
|
|
8
|
+
target: z.ZodObject<{
|
|
9
|
+
org: z.ZodString;
|
|
10
|
+
app: z.ZodString;
|
|
11
|
+
env: z.ZodString;
|
|
12
|
+
}, z.core.$strict>;
|
|
13
|
+
ok: z.ZodLiteral<true>;
|
|
14
|
+
deletedDeploymentIds: z.ZodArray<z.ZodString>;
|
|
15
|
+
auditRecorded: z.ZodBoolean;
|
|
16
|
+
}, z.core.$strict>;
|
|
17
|
+
/** Additive response reader for clients that can outlive a service revision. */
|
|
18
|
+
export declare const deploymentDeleteClientResponseSchema: z.ZodObject<{
|
|
19
|
+
target: z.ZodObject<{
|
|
20
|
+
org: z.ZodString;
|
|
21
|
+
app: z.ZodString;
|
|
22
|
+
env: z.ZodString;
|
|
23
|
+
}, z.core.$strip>;
|
|
24
|
+
ok: z.ZodLiteral<true>;
|
|
25
|
+
deletedDeploymentIds: z.ZodArray<z.ZodString>;
|
|
26
|
+
auditRecorded: z.ZodBoolean;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export type DeploymentDeleteResponse = z.infer<typeof deploymentDeleteResponseSchema>;
|
|
29
|
+
//# sourceMappingURL=deployment-deletion.d.ts.map
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
const deploymentId = z
|
|
3
|
+
.string()
|
|
4
|
+
.min(1)
|
|
5
|
+
.max(256)
|
|
6
|
+
.regex(/^[a-z0-9-]+$/);
|
|
7
|
+
const ids = z
|
|
8
|
+
.array(deploymentId)
|
|
9
|
+
.min(1)
|
|
10
|
+
.max(10000)
|
|
11
|
+
.refine((values) => new Set(values).size === values.length, 'deployment IDs must be unique');
|
|
12
|
+
const target = {
|
|
13
|
+
org: z.string().min(1),
|
|
14
|
+
app: z.string().min(1),
|
|
15
|
+
env: z.string().min(1),
|
|
16
|
+
};
|
|
17
|
+
/** Bind destructive version deletion to the complete inventory the operator confirmed. */
|
|
18
|
+
export const deploymentVersionDeleteRequestSchema = z.strictObject({ expectedDeploymentIds: ids });
|
|
19
|
+
const result = {
|
|
20
|
+
ok: z.literal(true),
|
|
21
|
+
deletedDeploymentIds: ids,
|
|
22
|
+
auditRecorded: z.boolean(),
|
|
23
|
+
};
|
|
24
|
+
export const deploymentDeleteResponseSchema = z.strictObject({
|
|
25
|
+
...result,
|
|
26
|
+
target: z.strictObject(target),
|
|
27
|
+
});
|
|
28
|
+
/** Additive response reader for clients that can outlive a service revision. */
|
|
29
|
+
export const deploymentDeleteClientResponseSchema = z.object({
|
|
30
|
+
...result,
|
|
31
|
+
target: z.object(target),
|
|
32
|
+
});
|
|
33
|
+
//# sourceMappingURL=deployment-deletion.js.map
|
|
@@ -385,10 +385,12 @@ export declare const configValuesListResponseSchema: z.ZodObject<{
|
|
|
385
385
|
}, z.core.$strip>;
|
|
386
386
|
/** Render a wire-schema failure as one actionable line (first issue, dotted path first). */
|
|
387
387
|
export declare function formatWireError(error: z.ZodError): string;
|
|
388
|
+
export * from '@noodle-borg/managed-capabilities/contracts';
|
|
388
389
|
export * from './application-activity.js';
|
|
389
390
|
export * from './application-connections.js';
|
|
390
391
|
export * from './application-onboarding.js';
|
|
391
392
|
export * from './billing-catalog.js';
|
|
393
|
+
export * from './deployment-deletion.js';
|
|
392
394
|
export * from './operation-coordination.js';
|
|
393
395
|
export { MIXED_CUSTOMER_AUTH_FEATURE_VERSION, type ServiceInfoClientResponse, type ServiceInfoResponse, serviceInfoClientResponseSchema, serviceInfoResponseSchema, } from './service-info.js';
|
|
394
396
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -224,10 +224,12 @@ export function formatWireError(error) {
|
|
|
224
224
|
const path = issue.path.map(String).join('.');
|
|
225
225
|
return path === '' ? issue.message : `"${path}": ${issue.message}`;
|
|
226
226
|
}
|
|
227
|
+
export * from '@noodle-borg/managed-capabilities/contracts';
|
|
227
228
|
export * from './application-activity.js';
|
|
228
229
|
export * from './application-connections.js';
|
|
229
230
|
export * from './application-onboarding.js';
|
|
230
231
|
export * from './billing-catalog.js';
|
|
232
|
+
export * from './deployment-deletion.js';
|
|
231
233
|
export * from './operation-coordination.js';
|
|
232
234
|
export { MIXED_CUSTOMER_AUTH_FEATURE_VERSION, serviceInfoClientResponseSchema, serviceInfoResponseSchema, } from './service-info.js';
|
|
233
235
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@noodleseed/one",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.170.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Noodle CLI by Noodle Seed — author, run, and deploy declarative MCP servers. Embedding the assistant in your own web app is @noodleseed/assistant.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -101,6 +101,7 @@
|
|
|
101
101
|
"@noodle-borg/knowledge",
|
|
102
102
|
"@noodle-borg/knowledge-crawl",
|
|
103
103
|
"@noodle-borg/knowledge-operations",
|
|
104
|
+
"@noodle-borg/managed-capabilities",
|
|
104
105
|
"@noodle-borg/module",
|
|
105
106
|
"@noodle-borg/module-audit",
|
|
106
107
|
"@noodle-borg/oauth-client-registry",
|
|
@@ -235,7 +236,7 @@
|
|
|
235
236
|
"@modelcontextprotocol/client": "2.0.0",
|
|
236
237
|
"@modelcontextprotocol/server": "2.0.0",
|
|
237
238
|
"@noodle-borg/admission-limits": "0.0.0",
|
|
238
|
-
"@noodle-borg/agent-kit": "0.
|
|
239
|
+
"@noodle-borg/agent-kit": "0.105.0",
|
|
239
240
|
"@noodle-borg/app-audit": "0.0.0",
|
|
240
241
|
"@noodle-borg/app-package": "0.0.0",
|
|
241
242
|
"@noodle-borg/assistant-gateway": "0.0.0",
|