taskflow-core 0.2.0 → 0.2.1
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/README.md +247 -862
- package/dist/agents.d.ts +12 -0
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +29 -1
- package/dist/agents.js.map +1 -1
- package/dist/cwd-bridge.d.ts +61 -0
- package/dist/cwd-bridge.d.ts.map +1 -0
- package/dist/cwd-bridge.js +136 -0
- package/dist/cwd-bridge.js.map +1 -0
- package/dist/detached-runner.js +31 -5
- package/dist/detached-runner.js.map +1 -1
- package/dist/exec/driver.d.ts +1 -0
- package/dist/exec/driver.d.ts.map +1 -1
- package/dist/exec/driver.js +15 -2
- package/dist/exec/driver.js.map +1 -1
- package/dist/exec/step-kinds.d.ts.map +1 -1
- package/dist/exec/step-kinds.js +28 -3
- package/dist/exec/step-kinds.js.map +1 -1
- package/dist/exec/step.d.ts +1 -0
- package/dist/exec/step.d.ts.map +1 -1
- package/dist/exec/step.js +18 -0
- package/dist/exec/step.js.map +1 -1
- package/dist/flowir/compile.d.ts.map +1 -1
- package/dist/flowir/compile.js +13 -0
- package/dist/flowir/compile.js.map +1 -1
- package/dist/host/runner-types.d.ts +16 -0
- package/dist/host/runner-types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interpolate.d.ts +4 -0
- package/dist/interpolate.d.ts.map +1 -1
- package/dist/interpolate.js +14 -0
- package/dist/interpolate.js.map +1 -1
- package/dist/resources/authority.d.ts +35 -0
- package/dist/resources/authority.d.ts.map +1 -0
- package/dist/resources/authority.js +67 -0
- package/dist/resources/authority.js.map +1 -0
- package/dist/resources/backend.d.ts +302 -0
- package/dist/resources/backend.d.ts.map +1 -0
- package/dist/resources/backend.js +16 -0
- package/dist/resources/backend.js.map +1 -0
- package/dist/resources/baseline.d.ts +116 -0
- package/dist/resources/baseline.d.ts.map +1 -0
- package/dist/resources/baseline.js +447 -0
- package/dist/resources/baseline.js.map +1 -0
- package/dist/resources/canonical-json.d.ts +7 -0
- package/dist/resources/canonical-json.d.ts.map +1 -0
- package/dist/resources/canonical-json.js +75 -0
- package/dist/resources/canonical-json.js.map +1 -0
- package/dist/resources/errors.d.ts +23 -0
- package/dist/resources/errors.d.ts.map +1 -0
- package/dist/resources/errors.js +89 -0
- package/dist/resources/errors.js.map +1 -0
- package/dist/resources/execution.d.ts +90 -0
- package/dist/resources/execution.d.ts.map +1 -0
- package/dist/resources/execution.js +581 -0
- package/dist/resources/execution.js.map +1 -0
- package/dist/resources/index.d.ts +15 -0
- package/dist/resources/index.d.ts.map +1 -0
- package/dist/resources/index.js +15 -0
- package/dist/resources/index.js.map +1 -0
- package/dist/resources/journal.d.ts +138 -0
- package/dist/resources/journal.d.ts.map +1 -0
- package/dist/resources/journal.js +438 -0
- package/dist/resources/journal.js.map +1 -0
- package/dist/resources/leases.d.ts +51 -0
- package/dist/resources/leases.d.ts.map +1 -0
- package/dist/resources/leases.js +354 -0
- package/dist/resources/leases.js.map +1 -0
- package/dist/resources/permits.d.ts +52 -0
- package/dist/resources/permits.d.ts.map +1 -0
- package/dist/resources/permits.js +240 -0
- package/dist/resources/permits.js.map +1 -0
- package/dist/resources/persistence.d.ts +63 -0
- package/dist/resources/persistence.d.ts.map +1 -0
- package/dist/resources/persistence.js +522 -0
- package/dist/resources/persistence.js.map +1 -0
- package/dist/resources/registry.d.ts +56 -0
- package/dist/resources/registry.d.ts.map +1 -0
- package/dist/resources/registry.js +139 -0
- package/dist/resources/registry.js.map +1 -0
- package/dist/resources/resolve.d.ts +49 -0
- package/dist/resources/resolve.d.ts.map +1 -0
- package/dist/resources/resolve.js +309 -0
- package/dist/resources/resolve.js.map +1 -0
- package/dist/resources/sandbox.d.ts +72 -0
- package/dist/resources/sandbox.d.ts.map +1 -0
- package/dist/resources/sandbox.js +952 -0
- package/dist/resources/sandbox.js.map +1 -0
- package/dist/resources/schema.d.ts +195 -0
- package/dist/resources/schema.d.ts.map +1 -0
- package/dist/resources/schema.js +231 -0
- package/dist/resources/schema.js.map +1 -0
- package/dist/resources/types.d.ts +36 -0
- package/dist/resources/types.d.ts.map +1 -0
- package/dist/resources/types.js +75 -0
- package/dist/resources/types.js.map +1 -0
- package/dist/runner-core.d.ts +29 -0
- package/dist/runner-core.d.ts.map +1 -1
- package/dist/runner-core.js +311 -36
- package/dist/runner-core.js.map +1 -1
- package/dist/runtime/phases/script.d.ts.map +1 -1
- package/dist/runtime/phases/script.js +47 -9
- package/dist/runtime/phases/script.js.map +1 -1
- package/dist/runtime.d.ts +39 -0
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +542 -50
- package/dist/runtime.js.map +1 -1
- package/dist/schema.d.ts +68 -5
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +163 -22
- package/dist/schema.js.map +1 -1
- package/dist/store.d.ts +7 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js.map +1 -1
- package/dist/trace.d.ts +3 -0
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { hasGrantAuthority, readonlyStringSet } from "./authority.js";
|
|
4
|
+
import { workspacePolicyError } from "./errors.js";
|
|
5
|
+
import { accessAllows } from "./schema.js";
|
|
6
|
+
const ROOT_GRANT = Symbol("taskflow.root-grant");
|
|
7
|
+
const brandedRootGrants = new WeakSet();
|
|
8
|
+
export const ROOT_ENFORCEMENT_MODES = ["native-single-root", "native-multi-root", "resolve-only"];
|
|
9
|
+
/** Invalid trusted host policy; detected before an invocation can start. */
|
|
10
|
+
export class RootRegistryConfigurationError extends Error {
|
|
11
|
+
constructor(message) {
|
|
12
|
+
super(message);
|
|
13
|
+
this.name = "RootRegistryConfigurationError";
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function logicalId(value, field) {
|
|
17
|
+
if (typeof value !== "string" || value.length === 0 || value.trim().length === 0 || /[\u0000-\u001f\u007f]/.test(value)) {
|
|
18
|
+
throw new RootRegistryConfigurationError(`${field} must be a non-empty logical identifier`);
|
|
19
|
+
}
|
|
20
|
+
return value.normalize("NFC");
|
|
21
|
+
}
|
|
22
|
+
function validateVersion(version) {
|
|
23
|
+
if (version === undefined)
|
|
24
|
+
return undefined;
|
|
25
|
+
if (!["portable", "path-bound", "unavailable"].includes(version.identityMode)) {
|
|
26
|
+
throw new RootRegistryConfigurationError("root grant version identityMode is invalid");
|
|
27
|
+
}
|
|
28
|
+
if (!Number.isSafeInteger(version.generation) || version.generation < 0) {
|
|
29
|
+
throw new RootRegistryConfigurationError("root grant version generation must be a non-negative safe integer");
|
|
30
|
+
}
|
|
31
|
+
if (!["clean", "write-pending", "dirty-unknown"].includes(version.state)) {
|
|
32
|
+
throw new RootRegistryConfigurationError("root grant version state is invalid");
|
|
33
|
+
}
|
|
34
|
+
for (const [field, value] of [["contentId", version.contentId], ["scopeDigest", version.scopeDigest]]) {
|
|
35
|
+
if (value !== undefined && (typeof value !== "string" || value.length === 0)) {
|
|
36
|
+
throw new RootRegistryConfigurationError(`root grant version ${field} must be a non-empty string`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return Object.freeze({ ...version });
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Host-only RootGrant constructor.
|
|
43
|
+
*
|
|
44
|
+
* The private symbol plus WeakSet identity make grants non-forgeable by JSON,
|
|
45
|
+
* object spread, structural casts, or structured cloning. Trusted delivery
|
|
46
|
+
* code calls this while loading its local root policy.
|
|
47
|
+
*/
|
|
48
|
+
export function createHostRootGrant(input) {
|
|
49
|
+
if (!["read-only", "read-write"].includes(input.maxAccess)) {
|
|
50
|
+
throw new RootRegistryConfigurationError("root grant maxAccess is invalid");
|
|
51
|
+
}
|
|
52
|
+
if (!ROOT_ENFORCEMENT_MODES.includes(input.enforcement)) {
|
|
53
|
+
throw new RootRegistryConfigurationError("root grant enforcement is invalid");
|
|
54
|
+
}
|
|
55
|
+
let physicalRoot;
|
|
56
|
+
try {
|
|
57
|
+
physicalRoot = fs.realpathSync(input.physicalRoot);
|
|
58
|
+
if (!fs.statSync(physicalRoot).isDirectory())
|
|
59
|
+
throw new Error("not-directory");
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
throw new RootRegistryConfigurationError("root grant physicalRoot must resolve to an existing directory");
|
|
63
|
+
}
|
|
64
|
+
const grant = Object.freeze({
|
|
65
|
+
[ROOT_GRANT]: true,
|
|
66
|
+
grantId: logicalId(input.grantId, "grantId"),
|
|
67
|
+
bindingId: logicalId(input.bindingId, "bindingId"),
|
|
68
|
+
resourceDomainId: logicalId(input.resourceDomainId, "resourceDomainId"),
|
|
69
|
+
physicalRoot,
|
|
70
|
+
maxAccess: input.maxAccess,
|
|
71
|
+
version: validateVersion(input.version),
|
|
72
|
+
allowedPrincipals: readonlyStringSet(input.allowedPrincipals, "allowedPrincipals"),
|
|
73
|
+
enforcement: input.enforcement,
|
|
74
|
+
});
|
|
75
|
+
brandedRootGrants.add(grant);
|
|
76
|
+
return grant;
|
|
77
|
+
}
|
|
78
|
+
export function isRootGrant(value) {
|
|
79
|
+
return typeof value === "object" && value !== null && brandedRootGrants.has(value);
|
|
80
|
+
}
|
|
81
|
+
function isWithin(root, candidate) {
|
|
82
|
+
const relative = path.relative(root, candidate);
|
|
83
|
+
return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
84
|
+
}
|
|
85
|
+
function physicalScopesOverlap(a, b) {
|
|
86
|
+
return isWithin(a.physicalRoot, b.physicalRoot) || isWithin(b.physicalRoot, a.physicalRoot);
|
|
87
|
+
}
|
|
88
|
+
class RootRegistryImpl {
|
|
89
|
+
registryId;
|
|
90
|
+
#grants;
|
|
91
|
+
constructor(registryId, grants) {
|
|
92
|
+
this.registryId = registryId;
|
|
93
|
+
this.#grants = grants;
|
|
94
|
+
}
|
|
95
|
+
authorize(grantId, principal, requested) {
|
|
96
|
+
const grant = typeof grantId === "string" ? this.#grants.get(grantId.normalize("NFC")) : undefined;
|
|
97
|
+
if (grant === undefined || !hasGrantAuthority(principal, grant)) {
|
|
98
|
+
return workspacePolicyError("TFWS_UNAUTHORIZED_GRANT", "The invocation is not authorized for the requested root grant");
|
|
99
|
+
}
|
|
100
|
+
if (requested !== "read-only" && requested !== "read-write") {
|
|
101
|
+
return workspacePolicyError("TFWS_ACCESS_ESCALATION", "The requested workspace access is invalid");
|
|
102
|
+
}
|
|
103
|
+
if (!accessAllows(grant.maxAccess, requested)) {
|
|
104
|
+
return workspacePolicyError("TFWS_ACCESS_ESCALATION", "The requested workspace access exceeds the root grant");
|
|
105
|
+
}
|
|
106
|
+
return grant;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Build a registry and reject alias configurations that could split locking,
|
|
111
|
+
* journaling, version, or cache identity for one writable physical resource.
|
|
112
|
+
*/
|
|
113
|
+
export function createRootRegistry(input) {
|
|
114
|
+
const registryId = logicalId(input.registryId, "registryId");
|
|
115
|
+
const grants = new Map();
|
|
116
|
+
for (const grant of input.grants) {
|
|
117
|
+
if (!isRootGrant(grant)) {
|
|
118
|
+
throw new RootRegistryConfigurationError("registry grants must come from createHostRootGrant");
|
|
119
|
+
}
|
|
120
|
+
if (grants.has(grant.grantId)) {
|
|
121
|
+
throw new RootRegistryConfigurationError(`duplicate root grant id '${grant.grantId}'`);
|
|
122
|
+
}
|
|
123
|
+
grants.set(grant.grantId, grant);
|
|
124
|
+
}
|
|
125
|
+
const entries = [...grants.values()];
|
|
126
|
+
for (let i = 0; i < entries.length; i++) {
|
|
127
|
+
for (let j = i + 1; j < entries.length; j++) {
|
|
128
|
+
const a = entries[i];
|
|
129
|
+
const b = entries[j];
|
|
130
|
+
if (a.resourceDomainId !== b.resourceDomainId &&
|
|
131
|
+
(a.maxAccess === "read-write" || b.maxAccess === "read-write") &&
|
|
132
|
+
physicalScopesOverlap(a, b)) {
|
|
133
|
+
throw new RootRegistryConfigurationError(`overlapping grants '${a.grantId}' and '${b.grantId}' require the same resourceDomainId when either is writable`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return new RootRegistryImpl(registryId, grants);
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/resources/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type WorkspacePolicyError } from "./errors.ts";
|
|
2
|
+
import { type HandleRef, type PathIntent, type ScopedCapability } from "./schema.ts";
|
|
3
|
+
declare const RESOLVED_PATH_REF: unique symbol;
|
|
4
|
+
export interface PathArgumentEnvironment {
|
|
5
|
+
/** Flow-authored argument declarations. Legacy declarations have no `type`. */
|
|
6
|
+
definitions: Readonly<Record<string, unknown>>;
|
|
7
|
+
/** Already validated invocation values; defaults are read from definitions if absent. */
|
|
8
|
+
values: Readonly<Record<string, unknown>>;
|
|
9
|
+
}
|
|
10
|
+
export interface CapabilityEnvironment {
|
|
11
|
+
workspaces: ReadonlyMap<string, ScopedCapability>;
|
|
12
|
+
handles?: ReadonlyMap<string, ScopedCapability>;
|
|
13
|
+
runId: string;
|
|
14
|
+
phaseId: string;
|
|
15
|
+
attemptId: string;
|
|
16
|
+
resolutionTokenTtlMs?: number;
|
|
17
|
+
now?: () => number;
|
|
18
|
+
mintResolutionTokenId?: () => string;
|
|
19
|
+
}
|
|
20
|
+
export interface ResolvedPathRef {
|
|
21
|
+
readonly [RESOLVED_PATH_REF]: true;
|
|
22
|
+
readonly resolutionTokenId: string;
|
|
23
|
+
readonly expiresAt: string;
|
|
24
|
+
readonly capability: Readonly<ScopedCapability>;
|
|
25
|
+
readonly logicalSubpath: string;
|
|
26
|
+
readonly physicalPath: string;
|
|
27
|
+
readonly intent: PathIntent;
|
|
28
|
+
}
|
|
29
|
+
export type ResolvePathRefResult = {
|
|
30
|
+
ok: true;
|
|
31
|
+
value: ResolvedPathRef;
|
|
32
|
+
} | {
|
|
33
|
+
ok: false;
|
|
34
|
+
error: WorkspacePolicyError;
|
|
35
|
+
};
|
|
36
|
+
export type ResolveRelativePathResult = {
|
|
37
|
+
ok: true;
|
|
38
|
+
value: string;
|
|
39
|
+
} | {
|
|
40
|
+
ok: false;
|
|
41
|
+
error: WorkspacePolicyError;
|
|
42
|
+
};
|
|
43
|
+
/** Resolve a symbolic expression using only explicitly typed invocation args. */
|
|
44
|
+
export declare function resolveRelativePathExpr(input: unknown, args: PathArgumentEnvironment): ResolveRelativePathResult;
|
|
45
|
+
export declare function handleRefKey(handle: HandleRef): string;
|
|
46
|
+
export declare function resolvePathRef(input: unknown, env: CapabilityEnvironment, args: PathArgumentEnvironment): ResolvePathRefResult;
|
|
47
|
+
export declare function isResolvedPathRef(value: unknown): value is ResolvedPathRef;
|
|
48
|
+
export {};
|
|
49
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/resources/resolve.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwB,KAAK,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EASN,KAAK,SAAS,EAEd,KAAK,UAAU,EAEf,KAAK,gBAAgB,EAErB,MAAM,aAAa,CAAC;AAErB,QAAA,MAAM,iBAAiB,EAAE,OAAO,MAA6C,CAAC;AAG9E,MAAM,WAAW,uBAAuB;IACvC,+EAA+E;IAC/E,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,yFAAyF;IACzF,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,qBAAqB;IACrC,UAAU,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,qBAAqB,CAAC,EAAE,MAAM,MAAM,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,CAAC,iBAAiB,CAAC,EAAE,IAAI,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAChD,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,MAAM,oBAAoB,GAC7B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,eAAe,CAAA;CAAE,GACpC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AAE9C,MAAM,MAAM,yBAAyB,GAClC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,oBAAoB,CAAA;CAAE,CAAC;AA0C9C,iFAAiF;AACjF,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,GAAG,yBAAyB,CAwChH;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAEtD;AAwKD,wBAAgB,cAAc,CAC7B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,qBAAqB,EAC1B,IAAI,EAAE,uBAAuB,GAC3B,oBAAoB,CAyDtB;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E"}
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { workspacePolicyError } from "./errors.js";
|
|
5
|
+
import { accessAllows, lifetimeRank, normalizePortablePathSegment, normalizePortableRelativePath, validatePathRef, validateRelativePathExpr, } from "./schema.js";
|
|
6
|
+
const RESOLVED_PATH_REF = Symbol("taskflow.resolved-path-ref");
|
|
7
|
+
const resolvedPathRefs = new WeakSet();
|
|
8
|
+
function invalidPath(message, logicalWorkspaceId) {
|
|
9
|
+
return workspacePolicyError("TFWS_INVALID_PATH", message, {
|
|
10
|
+
...(logicalWorkspaceId === undefined ? {} : { logicalWorkspaceId }),
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function resolveArg(name, args) {
|
|
14
|
+
const rawSpec = args.definitions[name];
|
|
15
|
+
if (!Object.prototype.hasOwnProperty.call(args.definitions, name)) {
|
|
16
|
+
return { ok: false, error: invalidPath(`Path argument '${name}' must have an explicit typed declaration`) };
|
|
17
|
+
}
|
|
18
|
+
if (typeof rawSpec !== "object" || rawSpec === null || Array.isArray(rawSpec)) {
|
|
19
|
+
return { ok: false, error: invalidPath(`Path argument '${name}' must have an explicit typed declaration`) };
|
|
20
|
+
}
|
|
21
|
+
const spec = rawSpec;
|
|
22
|
+
if (typeof spec.type !== "string") {
|
|
23
|
+
return { ok: false, error: invalidPath(`Path argument '${name}' must have an explicit typed declaration`) };
|
|
24
|
+
}
|
|
25
|
+
const hasInvocationValue = Object.prototype.hasOwnProperty.call(args.values, name);
|
|
26
|
+
const hasDefault = Object.prototype.hasOwnProperty.call(spec, "default");
|
|
27
|
+
if (!hasInvocationValue && !hasDefault) {
|
|
28
|
+
return { ok: false, error: invalidPath(`Path argument '${name}' has no invocation value or typed default`) };
|
|
29
|
+
}
|
|
30
|
+
const value = hasInvocationValue ? args.values[name] : spec.default;
|
|
31
|
+
if (spec.type === "enum") {
|
|
32
|
+
if (!Array.isArray(spec.values) || !spec.values.some((allowed) => Object.is(allowed, value))) {
|
|
33
|
+
return { ok: false, error: invalidPath(`Path argument '${name}' does not match its typed enum declaration`) };
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { ok: true, spec, value };
|
|
37
|
+
}
|
|
38
|
+
/** Resolve a symbolic expression using only explicitly typed invocation args. */
|
|
39
|
+
export function resolveRelativePathExpr(input, args) {
|
|
40
|
+
const parsed = validateRelativePathExpr(input);
|
|
41
|
+
if (!parsed.ok)
|
|
42
|
+
return { ok: false, error: invalidPath(parsed.errors.join("; ")) };
|
|
43
|
+
const expr = parsed.value;
|
|
44
|
+
if ("literalPath" in expr) {
|
|
45
|
+
const normalized = normalizePortableRelativePath(expr.literalPath);
|
|
46
|
+
return normalized.ok
|
|
47
|
+
? { ok: true, value: normalized.value }
|
|
48
|
+
: { ok: false, error: invalidPath(normalized.errors.join("; ")) };
|
|
49
|
+
}
|
|
50
|
+
if ("argPath" in expr) {
|
|
51
|
+
const selected = resolveArg(expr.argPath, args);
|
|
52
|
+
if (!selected.ok)
|
|
53
|
+
return selected;
|
|
54
|
+
if (selected.spec.type !== "relative-path") {
|
|
55
|
+
return { ok: false, error: invalidPath(`argPath '${expr.argPath}' must consume a typed relative-path argument`) };
|
|
56
|
+
}
|
|
57
|
+
const normalized = normalizePortableRelativePath(selected.value);
|
|
58
|
+
return normalized.ok
|
|
59
|
+
? { ok: true, value: normalized.value }
|
|
60
|
+
: { ok: false, error: invalidPath(normalized.errors.join("; ")) };
|
|
61
|
+
}
|
|
62
|
+
const segments = [];
|
|
63
|
+
for (const item of expr.segments) {
|
|
64
|
+
if ("segment" in item) {
|
|
65
|
+
const normalized = normalizePortablePathSegment(item.segment);
|
|
66
|
+
if (!normalized.ok)
|
|
67
|
+
return { ok: false, error: invalidPath(normalized.errors.join("; ")) };
|
|
68
|
+
segments.push(normalized.value);
|
|
69
|
+
continue;
|
|
70
|
+
}
|
|
71
|
+
const selected = resolveArg(item.argSegment, args);
|
|
72
|
+
if (!selected.ok)
|
|
73
|
+
return selected;
|
|
74
|
+
if (!["string", "relative-path", "enum"].includes(String(selected.spec.type))) {
|
|
75
|
+
return { ok: false, error: invalidPath(`argSegment '${item.argSegment}' must consume a typed string-like argument`) };
|
|
76
|
+
}
|
|
77
|
+
const normalized = normalizePortablePathSegment(selected.value);
|
|
78
|
+
if (!normalized.ok)
|
|
79
|
+
return { ok: false, error: invalidPath(normalized.errors.join("; ")) };
|
|
80
|
+
segments.push(normalized.value);
|
|
81
|
+
}
|
|
82
|
+
return { ok: true, value: segments.join("/") };
|
|
83
|
+
}
|
|
84
|
+
export function handleRefKey(handle) {
|
|
85
|
+
return `${handle.producerPhaseId}\0${handle.exportName}`;
|
|
86
|
+
}
|
|
87
|
+
function sourceCapability(ref, env) {
|
|
88
|
+
if ("workspace" in ref && ref.workspace !== undefined) {
|
|
89
|
+
const capability = env.workspaces.get(ref.workspace);
|
|
90
|
+
return capability === undefined
|
|
91
|
+
? {
|
|
92
|
+
ok: false,
|
|
93
|
+
error: workspacePolicyError("TFWS_UNKNOWN_WORKSPACE", `Logical workspace '${ref.workspace}' is not bound`, {
|
|
94
|
+
logicalWorkspaceId: ref.workspace,
|
|
95
|
+
}),
|
|
96
|
+
}
|
|
97
|
+
: { ok: true, value: capability, source: "workspace" };
|
|
98
|
+
}
|
|
99
|
+
const capability = env.handles?.get(handleRefKey(ref.handle));
|
|
100
|
+
return capability === undefined
|
|
101
|
+
? { ok: false, error: workspacePolicyError("TFWS_HANDLE_INVALID", "The workspace handle is unavailable or invalid") }
|
|
102
|
+
: { ok: true, value: capability, source: "handle" };
|
|
103
|
+
}
|
|
104
|
+
function isWithin(root, candidate) {
|
|
105
|
+
const relative = path.relative(root, candidate);
|
|
106
|
+
return relative === "" || (relative !== ".." && !relative.startsWith(`..${path.sep}`) && !path.isAbsolute(relative));
|
|
107
|
+
}
|
|
108
|
+
function checkCapabilityLifetime(capability, env) {
|
|
109
|
+
const lifetime = capability.lifetime;
|
|
110
|
+
if (lifetime.scope === "run" && lifetime.runId !== env.runId) {
|
|
111
|
+
return workspacePolicyError("TFWS_ACCESS_ESCALATION", "The workspace capability belongs to a different run");
|
|
112
|
+
}
|
|
113
|
+
if (lifetime.scope === "phase" &&
|
|
114
|
+
(lifetime.runId !== env.runId || lifetime.phaseId !== env.phaseId || lifetime.attemptId !== env.attemptId)) {
|
|
115
|
+
return workspacePolicyError("TFWS_ACCESS_ESCALATION", "The workspace capability belongs to a different phase attempt");
|
|
116
|
+
}
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
function bindLifetime(requested, parent, env) {
|
|
120
|
+
if (requested.scope === "phase") {
|
|
121
|
+
return { scope: "phase", runId: env.runId, phaseId: env.phaseId, attemptId: env.attemptId };
|
|
122
|
+
}
|
|
123
|
+
if (requested.scope === "run")
|
|
124
|
+
return { scope: "run", runId: env.runId };
|
|
125
|
+
if (parent.scope !== "external")
|
|
126
|
+
throw new Error("external lifetime must have an external parent");
|
|
127
|
+
return {
|
|
128
|
+
scope: "external",
|
|
129
|
+
bindingId: parent.bindingId,
|
|
130
|
+
...(parent.providerInstanceId === undefined ? {} : { providerInstanceId: parent.providerInstanceId }),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function nearestExistingAncestor(candidate) {
|
|
134
|
+
let current = candidate;
|
|
135
|
+
while (true) {
|
|
136
|
+
try {
|
|
137
|
+
fs.lstatSync(current);
|
|
138
|
+
return { ok: true, lexicalPath: current, realPath: fs.realpathSync(current) };
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (error.code !== "ENOENT")
|
|
142
|
+
return { ok: false };
|
|
143
|
+
const parent = path.dirname(current);
|
|
144
|
+
if (parent === current)
|
|
145
|
+
return { ok: false };
|
|
146
|
+
current = parent;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
function resolvePhysicalTarget(root, logicalSubpath, intent, logicalWorkspaceId) {
|
|
151
|
+
let rootReal;
|
|
152
|
+
try {
|
|
153
|
+
rootReal = fs.realpathSync(root);
|
|
154
|
+
if (!fs.statSync(rootReal).isDirectory())
|
|
155
|
+
throw new Error("not-directory");
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return { ok: false, error: invalidPath("The scoped workspace root is unavailable", logicalWorkspaceId) };
|
|
159
|
+
}
|
|
160
|
+
const candidate = logicalSubpath === "" ? rootReal : path.resolve(rootReal, ...logicalSubpath.split("/"));
|
|
161
|
+
if (!isWithin(rootReal, candidate)) {
|
|
162
|
+
return {
|
|
163
|
+
ok: false,
|
|
164
|
+
error: workspacePolicyError("TFWS_PATH_ESCAPE", "The selected path escapes its scoped workspace", {
|
|
165
|
+
logicalWorkspaceId,
|
|
166
|
+
}),
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (intent === "create-file" || intent === "create-directory") {
|
|
170
|
+
try {
|
|
171
|
+
fs.lstatSync(candidate);
|
|
172
|
+
return { ok: false, error: invalidPath("A create intent requires a non-existing target", logicalWorkspaceId) };
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (error.code !== "ENOENT") {
|
|
176
|
+
return { ok: false, error: invalidPath("The create target could not be inspected", logicalWorkspaceId) };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
const ancestor = nearestExistingAncestor(path.dirname(candidate));
|
|
180
|
+
if (!ancestor.ok)
|
|
181
|
+
return { ok: false, error: invalidPath("The create target has no usable ancestor", logicalWorkspaceId) };
|
|
182
|
+
if (!isWithin(rootReal, ancestor.realPath)) {
|
|
183
|
+
return {
|
|
184
|
+
ok: false,
|
|
185
|
+
error: workspacePolicyError("TFWS_PATH_ESCAPE", "The create target's existing ancestor escapes its scoped workspace", {
|
|
186
|
+
logicalWorkspaceId,
|
|
187
|
+
}),
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
try {
|
|
191
|
+
if (!fs.statSync(ancestor.realPath).isDirectory())
|
|
192
|
+
throw new Error("not-directory");
|
|
193
|
+
}
|
|
194
|
+
catch {
|
|
195
|
+
return { ok: false, error: invalidPath("The create target's nearest ancestor is not a directory", logicalWorkspaceId) };
|
|
196
|
+
}
|
|
197
|
+
const suffix = path.relative(ancestor.lexicalPath, candidate);
|
|
198
|
+
const physicalPath = path.resolve(ancestor.realPath, suffix);
|
|
199
|
+
if (!isWithin(rootReal, physicalPath)) {
|
|
200
|
+
return {
|
|
201
|
+
ok: false,
|
|
202
|
+
error: workspacePolicyError("TFWS_PATH_ESCAPE", "The create target escapes its scoped workspace", {
|
|
203
|
+
logicalWorkspaceId,
|
|
204
|
+
}),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
return { ok: true, physicalPath };
|
|
208
|
+
}
|
|
209
|
+
let targetReal;
|
|
210
|
+
let stat;
|
|
211
|
+
try {
|
|
212
|
+
targetReal = fs.realpathSync(candidate);
|
|
213
|
+
stat = fs.statSync(targetReal);
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return { ok: false, error: invalidPath("The selected existing target is unavailable", logicalWorkspaceId) };
|
|
217
|
+
}
|
|
218
|
+
if (!isWithin(rootReal, targetReal)) {
|
|
219
|
+
return {
|
|
220
|
+
ok: false,
|
|
221
|
+
error: workspacePolicyError("TFWS_PATH_ESCAPE", "The selected existing target resolves outside its scoped workspace", {
|
|
222
|
+
logicalWorkspaceId,
|
|
223
|
+
}),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
if (intent === "existing-file" && !stat.isFile()) {
|
|
227
|
+
return { ok: false, error: invalidPath("The selected target is not a regular file", logicalWorkspaceId) };
|
|
228
|
+
}
|
|
229
|
+
if (intent === "existing-directory" && !stat.isDirectory()) {
|
|
230
|
+
return { ok: false, error: invalidPath("The selected target is not a directory", logicalWorkspaceId) };
|
|
231
|
+
}
|
|
232
|
+
if (intent === "executable") {
|
|
233
|
+
if (!stat.isFile())
|
|
234
|
+
return { ok: false, error: invalidPath("The selected executable is not a regular file", logicalWorkspaceId) };
|
|
235
|
+
try {
|
|
236
|
+
fs.accessSync(targetReal, fs.constants.X_OK);
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return { ok: false, error: invalidPath("The selected file is not executable", logicalWorkspaceId) };
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return { ok: true, physicalPath: targetReal };
|
|
243
|
+
}
|
|
244
|
+
export function resolvePathRef(input, env, args) {
|
|
245
|
+
const parsed = validatePathRef(input);
|
|
246
|
+
if (!parsed.ok)
|
|
247
|
+
return { ok: false, error: invalidPath(parsed.errors.join("; ")) };
|
|
248
|
+
const ref = parsed.value;
|
|
249
|
+
const source = sourceCapability(ref, env);
|
|
250
|
+
if (!source.ok)
|
|
251
|
+
return source;
|
|
252
|
+
const capability = source.value;
|
|
253
|
+
const lifetimeError = checkCapabilityLifetime(capability, env);
|
|
254
|
+
if (lifetimeError !== undefined)
|
|
255
|
+
return { ok: false, error: lifetimeError };
|
|
256
|
+
if (!accessAllows(capability.access, ref.access)) {
|
|
257
|
+
return {
|
|
258
|
+
ok: false,
|
|
259
|
+
error: workspacePolicyError("TFWS_ACCESS_ESCALATION", "The requested path access exceeds its workspace capability", {
|
|
260
|
+
logicalWorkspaceId: capability.logicalWorkspaceId,
|
|
261
|
+
}),
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
const requestedLifetime = ref.maxLifetime ?? { scope: "phase" };
|
|
265
|
+
if (lifetimeRank(requestedLifetime) > lifetimeRank(capability.lifetime) || (source.source === "handle" && requestedLifetime.scope === "external")) {
|
|
266
|
+
return {
|
|
267
|
+
ok: false,
|
|
268
|
+
error: workspacePolicyError("TFWS_ACCESS_ESCALATION", "The requested path lifetime exceeds its workspace capability", {
|
|
269
|
+
logicalWorkspaceId: capability.logicalWorkspaceId,
|
|
270
|
+
}),
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
const subpath = ref.subpath === undefined ? { ok: true, value: "" } : resolveRelativePathExpr(ref.subpath, args);
|
|
274
|
+
if (!subpath.ok)
|
|
275
|
+
return subpath;
|
|
276
|
+
const physical = resolvePhysicalTarget(capability.physicalScopeRoot, subpath.value, ref.intent, capability.logicalWorkspaceId);
|
|
277
|
+
if (!physical.ok)
|
|
278
|
+
return physical;
|
|
279
|
+
const logicalPrefix = [capability.logicalPrefix, subpath.value].filter((part) => part.length > 0).join("/");
|
|
280
|
+
const ttlMs = env.resolutionTokenTtlMs ?? 30_000;
|
|
281
|
+
if (!Number.isSafeInteger(ttlMs) || ttlMs <= 0 || ttlMs > 300_000) {
|
|
282
|
+
return { ok: false, error: invalidPath("The resolver token lifetime is invalid", capability.logicalWorkspaceId) };
|
|
283
|
+
}
|
|
284
|
+
const now = env.now?.() ?? Date.now();
|
|
285
|
+
if (!Number.isFinite(now))
|
|
286
|
+
return { ok: false, error: invalidPath("The resolver clock is invalid", capability.logicalWorkspaceId) };
|
|
287
|
+
const attenuatedCapability = Object.freeze({
|
|
288
|
+
...capability,
|
|
289
|
+
logicalPrefix,
|
|
290
|
+
physicalScopeRoot: physical.physicalPath,
|
|
291
|
+
access: ref.access,
|
|
292
|
+
lifetime: bindLifetime(requestedLifetime, capability.lifetime, env),
|
|
293
|
+
});
|
|
294
|
+
const resolved = Object.freeze({
|
|
295
|
+
[RESOLVED_PATH_REF]: true,
|
|
296
|
+
resolutionTokenId: env.mintResolutionTokenId?.() ?? randomUUID(),
|
|
297
|
+
expiresAt: new Date(now + ttlMs).toISOString(),
|
|
298
|
+
capability: attenuatedCapability,
|
|
299
|
+
logicalSubpath: subpath.value,
|
|
300
|
+
physicalPath: physical.physicalPath,
|
|
301
|
+
intent: ref.intent,
|
|
302
|
+
});
|
|
303
|
+
resolvedPathRefs.add(resolved);
|
|
304
|
+
return { ok: true, value: resolved };
|
|
305
|
+
}
|
|
306
|
+
export function isResolvedPathRef(value) {
|
|
307
|
+
return typeof value === "object" && value !== null && resolvedPathRefs.has(value);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/resources/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { type HostProbeTarget, type VerifiedSandboxHostApproval } from "./baseline.ts";
|
|
2
|
+
import type { ConcreteSandboxPreparation, ExecutionOwner, HostBaselinePolicy, MutationPermit, PreparedSandboxPlan, ResolveOnlyPreparation, SandboxActivation, SandboxExecutionTarget, SandboxPlan, SandboxPolicyPlan, WorkspaceBackendCapabilities } from "./backend.ts";
|
|
3
|
+
export interface ConcreteSandboxAdapter {
|
|
4
|
+
/**
|
|
5
|
+
* Prepare and verify this exact concrete policy using the native adapter.
|
|
6
|
+
* Merely echoing WorkspaceBackendCapabilities is not a valid implementation.
|
|
7
|
+
*/
|
|
8
|
+
prepareConcreteSandbox(policy: Readonly<SandboxPolicyPlan>, owner: Readonly<ExecutionOwner>): Promise<ConcreteSandboxPreparation>;
|
|
9
|
+
}
|
|
10
|
+
export interface ResolveOnlyAdapter {
|
|
11
|
+
/** Performs path-only preparation and must return the explicit low-assurance tag. */
|
|
12
|
+
prepareResolveOnly(policy: Readonly<SandboxPolicyPlan>, owner: Readonly<ExecutionOwner>): Promise<ResolveOnlyPreparation>;
|
|
13
|
+
}
|
|
14
|
+
export interface SandboxPolicyFactoryOptions {
|
|
15
|
+
capabilities: WorkspaceBackendCapabilities;
|
|
16
|
+
executionTarget: SandboxExecutionTarget;
|
|
17
|
+
/** Exact process-local host approval minted by the trusted evidence loader.
|
|
18
|
+
* Required for every native target; clone/JSON/spread copies are rejected. */
|
|
19
|
+
sandboxApproval?: VerifiedSandboxHostApproval;
|
|
20
|
+
/** Independently observed live Host/OS/binary/backend tuple. Native execution
|
|
21
|
+
* requires an exact all-field match with the approved target. */
|
|
22
|
+
liveTarget?: HostProbeTarget;
|
|
23
|
+
/** Expected checked-in host-support baseline identity. */
|
|
24
|
+
hostSupportBaselineId?: string;
|
|
25
|
+
/** Complete trusted baseline policies. bodyDigest is recomputed from the
|
|
26
|
+
* canonical full body (excluding bodyDigest) during registration. */
|
|
27
|
+
baselineBindings: readonly HostBaselinePolicy[];
|
|
28
|
+
/** At least 256 bits of process-local host key material. */
|
|
29
|
+
key: Uint8Array;
|
|
30
|
+
keyId: string;
|
|
31
|
+
preparedPlanTtlMs?: number;
|
|
32
|
+
now?: () => Date;
|
|
33
|
+
concreteAdapter?: ConcreteSandboxAdapter;
|
|
34
|
+
resolveOnlyAdapter?: ResolveOnlyAdapter;
|
|
35
|
+
/** Host authorization decision made outside flow data. Default is deny. */
|
|
36
|
+
authorizeResolveOnly?: (owner: Readonly<ExecutionOwner>, policy: Readonly<SandboxPolicyPlan>) => boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface SandboxActivationHooks {
|
|
39
|
+
/** Journal CAS: issued -> active. Required for every plan carrying permits. */
|
|
40
|
+
activateMutationPermits?: (permits: readonly MutationPermit[], owner: Readonly<ExecutionOwner>) => Promise<void>;
|
|
41
|
+
/** Always called after an activation callback was entered. */
|
|
42
|
+
settleMutationPermits?: (permits: readonly MutationPermit[], owner: Readonly<ExecutionOwner>, outcome: "completed" | "failed") => Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
/** Build the path-free portable policy digest specified by the Workspace RFC. */
|
|
45
|
+
export declare function computeSandboxPolicyDigest(plan: Omit<SandboxPolicyPlan, "policyDigest"> | SandboxPolicyPlan, backend: Pick<WorkspaceBackendCapabilities, "backendId" | "backendCapabilityVersion">): string;
|
|
46
|
+
/** Canonical baseline body digest. The digest field itself is excluded; every
|
|
47
|
+
* other policy field, including identity/version, is bound. */
|
|
48
|
+
export declare function computeHostBaselineBodyDigest(baseline: Omit<HostBaselinePolicy, "bodyDigest"> | HostBaselinePolicy): string;
|
|
49
|
+
/** Content address the complete advertised backend capability record. */
|
|
50
|
+
export declare function computeWorkspaceBackendCapabilitiesSha256(capabilities: WorkspaceBackendCapabilities): string;
|
|
51
|
+
/** Attach the computed portable digest without changing the concrete plan inputs. */
|
|
52
|
+
export declare function createSandboxPolicyPlan(plan: Omit<SandboxPolicyPlan, "policyDigest">, backend: Pick<WorkspaceBackendCapabilities, "backendId" | "backendCapabilityVersion">): SandboxPolicyPlan;
|
|
53
|
+
/**
|
|
54
|
+
* Process-local policy factory. It negotiates and authenticates plans, but delegates
|
|
55
|
+
* real native preparation to an adapter and therefore never pretends to be a sandbox.
|
|
56
|
+
*/
|
|
57
|
+
export declare class SandboxPolicyFactory {
|
|
58
|
+
#private;
|
|
59
|
+
constructor(options: SandboxPolicyFactoryOptions);
|
|
60
|
+
capabilities(): WorkspaceBackendCapabilities;
|
|
61
|
+
prepareSandbox(plan: SandboxPolicyPlan, owner: ExecutionOwner): Promise<PreparedSandboxPlan>;
|
|
62
|
+
sealSandbox(prepared: PreparedSandboxPlan, permits: readonly MutationPermit[]): SandboxPlan;
|
|
63
|
+
/**
|
|
64
|
+
* Activate exactly once and keep permit activation/settlement around the actual
|
|
65
|
+
* execution callback. Callers must put native spawn/open inside `execute`.
|
|
66
|
+
*/
|
|
67
|
+
activateOnce<T>(plan: SandboxPlan, hooks: SandboxActivationHooks, execute: (activation: SandboxActivation) => Promise<T>): Promise<T>;
|
|
68
|
+
}
|
|
69
|
+
declare function validateCapabilities(capabilities: WorkspaceBackendCapabilities): void;
|
|
70
|
+
export declare const validateWorkspaceBackendCapabilities: typeof validateCapabilities;
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=sandbox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/resources/sandbox.ts"],"names":[],"mappings":"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"}
|