@gt-fe/eap-sdk 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 +316 -310
- package/dist/lockfile/resolve-dependencies.d.ts +1 -0
- package/dist/lockfile/resolve-dependencies.d.ts.map +1 -1
- package/dist/lockfile/resolve-dependencies.js +3 -0
- package/dist/lockfile/resolve-dependencies.js.map +1 -1
- package/dist/materialization/copy-resource-directory.d.ts +1 -0
- package/dist/materialization/copy-resource-directory.d.ts.map +1 -1
- package/dist/materialization/copy-resource-directory.js +38 -1
- package/dist/materialization/copy-resource-directory.js.map +1 -1
- package/dist/materialization/index.d.ts +1 -0
- package/dist/materialization/index.d.ts.map +1 -1
- package/dist/materialization/index.js +1 -0
- package/dist/materialization/index.js.map +1 -1
- package/dist/materialization/load-agent-runtime.d.ts +19 -0
- package/dist/materialization/load-agent-runtime.d.ts.map +1 -0
- package/dist/materialization/load-agent-runtime.js +128 -0
- package/dist/materialization/load-agent-runtime.js.map +1 -0
- package/dist/materialization/prepare-agent-runtime.d.ts.map +1 -1
- package/dist/materialization/prepare-agent-runtime.js +97 -29
- package/dist/materialization/prepare-agent-runtime.js.map +1 -1
- package/dist/packaging/read-package.d.ts.map +1 -1
- package/dist/packaging/read-package.js +20 -1
- package/dist/packaging/read-package.js.map +1 -1
- package/dist/project/agent-project.d.ts.map +1 -1
- package/dist/project/agent-project.js +10 -0
- package/dist/project/agent-project.js.map +1 -1
- package/dist/resources/configured-local-resources.d.ts +15 -0
- package/dist/resources/configured-local-resources.d.ts.map +1 -0
- package/dist/resources/configured-local-resources.js +75 -0
- package/dist/resources/configured-local-resources.js.map +1 -0
- package/dist/resources/install-agent-dependencies.d.ts.map +1 -1
- package/dist/resources/install-agent-dependencies.js +7 -2
- package/dist/resources/install-agent-dependencies.js.map +1 -1
- package/dist/schema/agent/manifest.d.ts +6 -302
- package/dist/schema/agent/manifest.d.ts.map +1 -1
- package/dist/schema/graph.d.ts +4 -398
- package/dist/schema/graph.d.ts.map +1 -1
- package/dist/schema/graph.js +0 -12
- package/dist/schema/graph.js.map +1 -1
- package/dist/schema/project-config.d.ts +6 -0
- package/dist/schema/project-config.d.ts.map +1 -1
- package/dist/schema/project-config.js +4 -0
- package/dist/schema/project-config.js.map +1 -1
- package/dist/service/create-agent.d.ts.map +1 -1
- package/dist/service/create-agent.js +15 -84
- package/dist/service/create-agent.js.map +1 -1
- package/dist/service/events.d.ts +2 -0
- package/dist/service/events.d.ts.map +1 -1
- package/dist/service/events.js +1 -0
- package/dist/service/events.js.map +1 -1
- package/dist/validation/validate-agent-project.d.ts.map +1 -1
- package/dist/validation/validate-agent-project.js +31 -17
- package/dist/validation/validate-agent-project.js.map +1 -1
- package/package.json +4 -4
|
@@ -14,6 +14,7 @@ export declare function resolveLockedResources(options: {
|
|
|
14
14
|
root: string;
|
|
15
15
|
manifest: AgentManifest;
|
|
16
16
|
lock: EapLock;
|
|
17
|
+
availableLocalResources?: Partial<Record<MaterializedResourceKind, ReadonlySet<string>>>;
|
|
17
18
|
}): ResolvedLockedResource[];
|
|
18
19
|
export declare function findUndeclaredLockedResources(manifest: AgentManifest, lock: EapLock): Array<LockResource & {
|
|
19
20
|
kind: MaterializedResourceKind;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-dependencies.d.ts","sourceRoot":"","sources":["../../src/lockfile/resolve-dependencies.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,6BAA8B,SAAQ,KAAK;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,wBAAwB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;gBAArF,OAAO,EAAE,MAAM,EAAW,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,wBAAwB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,YAAA;CAIlG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"resolve-dependencies.d.ts","sourceRoot":"","sources":["../../src/lockfile/resolve-dependencies.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgC,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvH,OAAO,KAAK,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEnF,qBAAa,6BAA8B,SAAQ,KAAK;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,wBAAwB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;gBAArF,OAAO,EAAE,MAAM,EAAW,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,wBAAwB,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,YAAA;CAIlG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,uBAAuB,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CAC1F,GAAG,sBAAsB,EAAE,CAgC3B;AAcD,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,OAAO,GACZ,KAAK,CAAC,YAAY,GAAG;IAAE,IAAI,EAAE,wBAAwB,CAAA;CAAE,CAAC,CAM1D;AAED,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,wBAAwB,GAC7B,MAAM,EAAE,CAQV"}
|
|
@@ -16,6 +16,9 @@ export function resolveLockedResources(options) {
|
|
|
16
16
|
for (const kind of ['tools', 'skills']) {
|
|
17
17
|
for (const code of declaredResourceCodes(options.manifest, kind)) {
|
|
18
18
|
const entries = options.lock.resources[kind].filter((entry) => entry.code === code);
|
|
19
|
+
const availableFromConfig = options.availableLocalResources?.[kind]?.has(code) === true;
|
|
20
|
+
if (availableFromConfig)
|
|
21
|
+
continue;
|
|
19
22
|
if (entries.length === 0 && kind === 'skills' && findLocalSkillEntryFile(resolve(root, 'skills', code))) {
|
|
20
23
|
continue;
|
|
21
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve-dependencies.js","sourceRoot":"","sources":["../../src/lockfile/resolve-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,4BAA4B,EAAuD,MAAM,oBAAoB,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAChB;IAAtC,YAAY,OAAe,EAAW,QAA2D;QAC/F,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,aAAQ,GAAR,QAAQ,CAAmD;QAE/F,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"resolve-dependencies.js","sourceRoot":"","sources":["../../src/lockfile/resolve-dependencies.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,4BAA4B,EAAuD,MAAM,oBAAoB,CAAC;AACvH,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,MAAM,OAAO,6BAA8B,SAAQ,KAAK;IAChB;IAAtC,YAAY,OAAe,EAAW,QAA2D;QAC/F,KAAK,CAAC,OAAO,CAAC,CAAC;QADqB,aAAQ,GAAR,QAAQ,CAAmD;QAE/F,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CAAC,OAKtC;IACC,MAAM,IAAI,GAAG,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAE9C,KAAK,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAU,EAAE,CAAC;QAChD,KAAK,MAAM,IAAI,IAAI,qBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACpF,MAAM,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;YACxF,IAAI,mBAAmB;gBAAE,SAAS;YAClC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,QAAQ,IAAI,uBAAuB,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC;gBACxG,SAAS;YACX,CAAC;YACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,6BAA6B,CACrC,OAAO,CAAC,MAAM,KAAK,CAAC;oBAClB,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE;oBACvC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,WAAW,EAC9B,EAAE,IAAI,EAAE,IAAI,EAAE,CACf,CAAC;YACJ,CAAC;YACD,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;YAC1B,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACzE,MAAM,YAAY,GAAG,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACxD,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YAClG,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACnC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CACxH,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,UAAkB,EAClB,IAA8B;IAE9B,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,OAAO,uBAAuB,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC;IAC3D,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,uBAAuB,CAAU,CAAC;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/E,OAAO,KAAK,IAAI,UAAU,CAAC,CAAC,CAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAC3C,QAAuB,EACvB,IAAa;IAEb,OAAQ,CAAC,OAAO,EAAE,QAAQ,CAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SACjB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC9E,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CACxC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AACtG,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,QAAuB,EACvB,IAA8B;IAE9B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,SAAS;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,6BAA6B,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC;IACnF,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,6BAA6B,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,sBAAsB,CAAC,IAA8B,EAAE,KAAmB;IACjF,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,KAAK,UAAU;QAC1C,CAAC,CAAC,eAAe,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE;QACtD,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,4BAA4B,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,IAAI,6BAA6B,CACrC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,WAAW,QAAQ,EAAE,EAC1E,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAC3B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,IAAY,EACZ,YAAoB,EACpB,IAA8B,EAC9B,IAAY;IAEZ,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC7D,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,MAAM,IAAI,6BAA6B,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC1B,MAAM,IAAI,6BAA6B,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5G,CAAC;IACH,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IAChC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,6BAA6B,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACzG,CAAC;IACD,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,iBAAiB,CACxB,IAAY,EACZ,KAAa,EACb,IAA8B,EAC9B,IAAY;IAEZ,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,6BAA6B,CAAC,MAAM,KAAK,IAAI,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;QAC5C,MAAM,IAAI,6BAA6B,CAAC,GAAG,KAAK,YAAY,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,IAA8B,EAAE,IAAY;IAC9F,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,6BAA6B,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3G,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-resource-directory.d.ts","sourceRoot":"","sources":["../../src/materialization/copy-resource-directory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copy-resource-directory.d.ts","sourceRoot":"","sources":["../../src/materialization/copy-resource-directory.ts"],"names":[],"mappings":"AAMA,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAM/E;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAQ9D"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { copyFileSync, lstatSync, mkdirSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
3
|
import { basename, relative, resolve } from 'node:path';
|
|
3
4
|
const EXCLUDED_DIRECTORY_NAMES = new Set(['.git', '.eap', 'node_modules', 'coverage']);
|
|
4
5
|
export function copyResourceDirectory(source, destination) {
|
|
@@ -8,6 +9,15 @@ export function copyResourceDirectory(source, destination) {
|
|
|
8
9
|
}
|
|
9
10
|
copyDirectory(source, destination, source);
|
|
10
11
|
}
|
|
12
|
+
export function resourceDirectoryDigest(source) {
|
|
13
|
+
const sourceStat = lstatSync(source);
|
|
14
|
+
if (!sourceStat.isDirectory() || sourceStat.isSymbolicLink()) {
|
|
15
|
+
throw new Error(`Resource source must be a regular directory: ${source}`);
|
|
16
|
+
}
|
|
17
|
+
const hash = createHash('sha256');
|
|
18
|
+
digestDirectory(source, source, hash);
|
|
19
|
+
return hash.digest('hex');
|
|
20
|
+
}
|
|
11
21
|
function copyDirectory(source, destination, root) {
|
|
12
22
|
const stat = lstatSync(source);
|
|
13
23
|
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
@@ -31,7 +41,34 @@ function copyDirectory(source, destination, root) {
|
|
|
31
41
|
copyFileSync(sourcePath, targetPath);
|
|
32
42
|
}
|
|
33
43
|
}
|
|
44
|
+
function digestDirectory(source, root, hash) {
|
|
45
|
+
const stat = lstatSync(source);
|
|
46
|
+
if (!stat.isDirectory() || stat.isSymbolicLink()) {
|
|
47
|
+
throw new Error(`Resource path must be a regular directory: ${source}`);
|
|
48
|
+
}
|
|
49
|
+
const directoryPath = relative(root, source).replace(/\\/g, '/');
|
|
50
|
+
hash.update(`directory:${directoryPath}\0`);
|
|
51
|
+
for (const entry of readdirSync(source, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {
|
|
52
|
+
if (shouldExclude(entry.name, entry.isDirectory()))
|
|
53
|
+
continue;
|
|
54
|
+
const sourcePath = resolve(source, entry.name);
|
|
55
|
+
assertDescendant(root, sourcePath);
|
|
56
|
+
if (entry.isSymbolicLink())
|
|
57
|
+
throw new Error(`Resource directory must not contain symbolic links: ${sourcePath}`);
|
|
58
|
+
if (entry.isDirectory()) {
|
|
59
|
+
digestDirectory(sourcePath, root, hash);
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (!entry.isFile())
|
|
63
|
+
throw new Error(`Resource directory contains an unsupported entry: ${sourcePath}`);
|
|
64
|
+
hash.update(`file:${relative(root, sourcePath).replace(/\\/g, '/')}\0`);
|
|
65
|
+
hash.update(readFileSync(sourcePath));
|
|
66
|
+
hash.update('\0');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
34
69
|
function shouldExclude(name, isDirectory) {
|
|
70
|
+
if (name === '.ready')
|
|
71
|
+
return true;
|
|
35
72
|
if (name === '.env' || name.startsWith('.env.'))
|
|
36
73
|
return true;
|
|
37
74
|
if (name.endsWith('.tmp') || name.startsWith('.tmp'))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copy-resource-directory.js","sourceRoot":"","sources":["../../src/materialization/copy-resource-directory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"copy-resource-directory.js","sourceRoot":"","sources":["../../src/materialization/copy-resource-directory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/materialization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/materialization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/materialization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/materialization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { type LoadedProjectRuntimeConfig } from '../config/index.js';
|
|
2
|
+
import { type EapLock } from '../schema/index.js';
|
|
3
|
+
import type { PreparedAgentRuntime } from './types.js';
|
|
4
|
+
export interface LoadAgentRuntimeOptions {
|
|
5
|
+
runtimeRoot?: string;
|
|
6
|
+
agentCode?: string;
|
|
7
|
+
version?: string;
|
|
8
|
+
}
|
|
9
|
+
export interface LoadedAgentRuntime extends PreparedAgentRuntime {
|
|
10
|
+
manifestPath: string;
|
|
11
|
+
graphPath: string;
|
|
12
|
+
configPath: string;
|
|
13
|
+
lockPath: string;
|
|
14
|
+
config: LoadedProjectRuntimeConfig['config'];
|
|
15
|
+
lock: EapLock;
|
|
16
|
+
}
|
|
17
|
+
/** Loads and verifies the immutable project inputs in a materialized Runtime tree. */
|
|
18
|
+
export declare function loadAgentRuntime(options?: LoadAgentRuntimeOptions): LoadedAgentRuntime;
|
|
19
|
+
//# sourceMappingURL=load-agent-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-agent-runtime.d.ts","sourceRoot":"","sources":["../../src/materialization/load-agent-runtime.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAI/F,OAAO,EAIL,KAAK,OAAO,EACb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAcvD,MAAM,WAAW,uBAAuB;IACtC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAmB,SAAQ,oBAAoB;IAC9D,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IAC7C,IAAI,EAAE,OAAO,CAAC;CACf;AAED,sFAAsF;AACtF,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,uBAA4B,GAAG,kBAAkB,CA2D1F"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { lstatSync, readFileSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { loadProjectRuntimeConfig } from '../config/index.js';
|
|
4
|
+
import { toSha256Hex } from '../digest.js';
|
|
5
|
+
import { readEapLock } from '../lockfile/index.js';
|
|
6
|
+
import { sha256 } from '../resources/resource-files.js';
|
|
7
|
+
import { AgentManifestSchema, DependenciesLockSchema, GraphSchema, } from '../schema/index.js';
|
|
8
|
+
import { resolveAgentRuntimeRoot } from './prepare-agent-runtime.js';
|
|
9
|
+
const REQUIRED_RUNTIME_ARTIFACTS = [
|
|
10
|
+
'agent.manifest.json',
|
|
11
|
+
'graph.json',
|
|
12
|
+
'eap.config.json',
|
|
13
|
+
'eap.lock.yaml',
|
|
14
|
+
'dependencies.lock',
|
|
15
|
+
];
|
|
16
|
+
/** Loads and verifies the immutable project inputs in a materialized Runtime tree. */
|
|
17
|
+
export function loadAgentRuntime(options = {}) {
|
|
18
|
+
const runtimeRoot = assertRegularDirectory(resolveAgentRuntimeRoot({ runtimeRoot: options.runtimeRoot }), 'Runtime root');
|
|
19
|
+
const agentsRoot = assertRegularDirectory(resolve(runtimeRoot, 'agents'), 'Runtime agents directory');
|
|
20
|
+
const agentCode = options.agentCode ?? selectOnlyDirectory(agentsRoot, 'Agent code');
|
|
21
|
+
assertDirectorySegment(agentCode, 'Agent code');
|
|
22
|
+
const agentRoot = assertRegularDirectory(resolve(agentsRoot, agentCode), `Agent directory ${agentCode}`);
|
|
23
|
+
const version = options.version ?? selectOnlyDirectory(agentRoot, 'Agent version');
|
|
24
|
+
assertDirectorySegment(version, 'Agent version');
|
|
25
|
+
const agentDir = assertRegularDirectory(resolve(agentRoot, version), `Agent version directory ${agentCode}@${version}`);
|
|
26
|
+
const artifactPaths = new Map(REQUIRED_RUNTIME_ARTIFACTS.map((name) => [
|
|
27
|
+
name,
|
|
28
|
+
assertRegularFile(resolve(agentDir, name), `Runtime ${name}`),
|
|
29
|
+
]));
|
|
30
|
+
assertRegularFile(resolve(agentDir, 'snapshot.json'), 'Runtime snapshot');
|
|
31
|
+
assertRegularFile(resolve(agentDir, '.ready'), 'Runtime readiness marker');
|
|
32
|
+
const manifestPath = artifactPaths.get('agent.manifest.json');
|
|
33
|
+
const graphPath = artifactPaths.get('graph.json');
|
|
34
|
+
const configPath = artifactPaths.get('eap.config.json');
|
|
35
|
+
const lockPath = artifactPaths.get('eap.lock.yaml');
|
|
36
|
+
const manifest = AgentManifestSchema.parse(readJson(manifestPath, 'Runtime Agent manifest'));
|
|
37
|
+
if (manifest.code !== agentCode || manifest.version !== version) {
|
|
38
|
+
throw new Error(`Runtime Agent identity does not match ${agentCode}@${version}`);
|
|
39
|
+
}
|
|
40
|
+
GraphSchema.parse(readJson(graphPath, 'Runtime Graph'));
|
|
41
|
+
const dependencies = DependenciesLockSchema.parse(readJson(artifactPaths.get('dependencies.lock'), 'Runtime dependencies lock'));
|
|
42
|
+
if (dependencies.agentCode && dependencies.agentCode !== agentCode) {
|
|
43
|
+
throw new Error(`Runtime dependencies.lock Agent identity does not match ${agentCode}`);
|
|
44
|
+
}
|
|
45
|
+
if (dependencies.agentVersion && dependencies.agentVersion !== version) {
|
|
46
|
+
throw new Error(`Runtime dependencies.lock version does not match ${version}`);
|
|
47
|
+
}
|
|
48
|
+
const loadedConfig = loadProjectRuntimeConfig({ root: agentDir });
|
|
49
|
+
const lock = readEapLock(agentDir);
|
|
50
|
+
if (!lock)
|
|
51
|
+
throw new Error(`Runtime eap.lock.yaml is missing: ${lockPath}`);
|
|
52
|
+
verifySnapshotArtifacts(agentDir, artifactPaths);
|
|
53
|
+
return {
|
|
54
|
+
projectRoot: runtimeRoot,
|
|
55
|
+
runtimeRoot,
|
|
56
|
+
agentDir,
|
|
57
|
+
agentCode,
|
|
58
|
+
version,
|
|
59
|
+
resources: [],
|
|
60
|
+
manifestPath,
|
|
61
|
+
graphPath,
|
|
62
|
+
configPath,
|
|
63
|
+
lockPath,
|
|
64
|
+
config: loadedConfig.config,
|
|
65
|
+
lock,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function verifySnapshotArtifacts(agentDir, artifactPaths) {
|
|
69
|
+
const snapshot = readJson(resolve(agentDir, 'snapshot.json'), 'Runtime snapshot');
|
|
70
|
+
if (!Array.isArray(snapshot.artifacts))
|
|
71
|
+
throw new Error('Runtime snapshot artifacts are invalid');
|
|
72
|
+
const digests = new Map(snapshot.artifacts
|
|
73
|
+
.filter((artifact) => (typeof artifact.path === 'string' && typeof artifact.sha256 === 'string'))
|
|
74
|
+
.map((artifact) => [artifact.path, artifact.sha256]));
|
|
75
|
+
for (const [name, path] of artifactPaths) {
|
|
76
|
+
const expected = toSha256Hex(sha256(readFileSync(path)));
|
|
77
|
+
if (digests.get(name) !== expected) {
|
|
78
|
+
throw new Error(`Runtime snapshot digest does not match ${name}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function selectOnlyDirectory(parent, label) {
|
|
83
|
+
const directories = readdirSync(parent, { withFileTypes: true })
|
|
84
|
+
.filter((entry) => entry.isDirectory())
|
|
85
|
+
.map((entry) => entry.name)
|
|
86
|
+
.sort((left, right) => left.localeCompare(right));
|
|
87
|
+
if (directories.length !== 1)
|
|
88
|
+
throw new Error(`Runtime requires exactly one ${label}; found ${directories.length}`);
|
|
89
|
+
return directories[0];
|
|
90
|
+
}
|
|
91
|
+
function assertRegularDirectory(path, label) {
|
|
92
|
+
let stat;
|
|
93
|
+
try {
|
|
94
|
+
stat = lstatSync(path);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw new Error(`${label} is missing: ${path}`);
|
|
98
|
+
}
|
|
99
|
+
if (!stat.isDirectory() || stat.isSymbolicLink())
|
|
100
|
+
throw new Error(`${label} must be a regular directory: ${path}`);
|
|
101
|
+
return path;
|
|
102
|
+
}
|
|
103
|
+
function assertRegularFile(path, label) {
|
|
104
|
+
let stat;
|
|
105
|
+
try {
|
|
106
|
+
stat = lstatSync(path);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
throw new Error(`${label} is missing: ${path}`);
|
|
110
|
+
}
|
|
111
|
+
if (!stat.isFile() || stat.isSymbolicLink())
|
|
112
|
+
throw new Error(`${label} must be a regular file: ${path}`);
|
|
113
|
+
return path;
|
|
114
|
+
}
|
|
115
|
+
function assertDirectorySegment(value, label) {
|
|
116
|
+
if (!value || value === '.' || value === '..' || /[\\/]/.test(value))
|
|
117
|
+
throw new Error(`${label} is not valid: ${value}`);
|
|
118
|
+
}
|
|
119
|
+
function readJson(path, label) {
|
|
120
|
+
try {
|
|
121
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
125
|
+
throw new Error(`${label} is not valid JSON: ${path} (${reason})`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=load-agent-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-agent-runtime.js","sourceRoot":"","sources":["../../src/materialization/load-agent-runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare-agent-runtime.d.ts","sourceRoot":"","sources":["../../src/materialization/prepare-agent-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"prepare-agent-runtime.d.ts","sourceRoot":"","sources":["../../src/materialization/prepare-agent-runtime.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAiCnF,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,oBAAoB,CAAC,CA6E/B;AAkGD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACT,GAAG,MAAM,CAKd"}
|
|
@@ -2,12 +2,20 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { copyFileSync, existsSync, lstatSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import { dirname, relative, resolve, sep } from 'node:path';
|
|
4
4
|
import { toSha256Hex } from '../digest.js';
|
|
5
|
+
import { loadProjectRuntimeConfig } from '../config/index.js';
|
|
5
6
|
import { resolveAgentProject } from '../discovery/index.js';
|
|
6
7
|
import { readEapLock, resolveLockedResources } from '../lockfile/index.js';
|
|
7
8
|
import { validateAgentProject } from '../validation/index.js';
|
|
8
9
|
import { DependenciesLockSchema } from '../schema/index.js';
|
|
10
|
+
import { configuredLocalResourceCodes, discoverConfiguredLocalResources, } from '../resources/configured-local-resources.js';
|
|
9
11
|
import { ensureGeneratedDirectory, ensureGeneratedDirectoryPath, removeDirectoryChild, sha256, validateDirectoryChild, } from '../resources/resource-files.js';
|
|
10
|
-
import { copyResourceDirectory } from './copy-resource-directory.js';
|
|
12
|
+
import { copyResourceDirectory, resourceDirectoryDigest } from './copy-resource-directory.js';
|
|
13
|
+
const RUNTIME_SOURCE_ARTIFACTS = [
|
|
14
|
+
'agent.manifest.json',
|
|
15
|
+
'graph.json',
|
|
16
|
+
'eap.config.json',
|
|
17
|
+
'eap.lock.yaml',
|
|
18
|
+
];
|
|
11
19
|
export async function prepareAgentRuntime(options = {}) {
|
|
12
20
|
const project = resolveAgentProject(options.root ? { root: options.root } : {});
|
|
13
21
|
const destination = resolveRuntimeDestination(project.root, options.outputRoot);
|
|
@@ -17,10 +25,21 @@ export async function prepareAgentRuntime(options = {}) {
|
|
|
17
25
|
throw new Error(`Cannot prepare Agent Runtime: ${message}. Run eap install to restore missing remote resources.`);
|
|
18
26
|
}
|
|
19
27
|
const lock = readEapLock(project.root);
|
|
20
|
-
|
|
28
|
+
if (!lock) {
|
|
29
|
+
throw new Error('Cannot prepare Agent Runtime: eap.lock.yaml is required. Run eap install to create it.');
|
|
30
|
+
}
|
|
31
|
+
const config = loadProjectRuntimeConfig({ root: project.root }).config;
|
|
32
|
+
const configuredLocalResources = discoverConfiguredLocalResources(project.root, config);
|
|
33
|
+
const resources = resolveLockedResources({
|
|
34
|
+
root: project.root,
|
|
35
|
+
manifest: validation.agent.manifest,
|
|
36
|
+
lock,
|
|
37
|
+
availableLocalResources: configuredLocalResourceCodes(configuredLocalResources),
|
|
38
|
+
});
|
|
39
|
+
const runtimeResources = mergeRuntimeResources(resources, configuredLocalResources, validation.agent.manifest);
|
|
21
40
|
const includeDigests = true;
|
|
22
41
|
// Avoid replacing an unchanged Runtime directory that another Windows process may still hold.
|
|
23
|
-
if (canReuseRuntime(destination.runtimeRoot, project,
|
|
42
|
+
if (canReuseRuntime(destination.runtimeRoot, project, runtimeResources, includeDigests)) {
|
|
24
43
|
const reused = {
|
|
25
44
|
projectRoot: project.root,
|
|
26
45
|
runtimeRoot: destination.runtimeRoot,
|
|
@@ -40,9 +59,10 @@ export async function prepareAgentRuntime(options = {}) {
|
|
|
40
59
|
const temporaryRoot = ensureGeneratedDirectoryPath(destination.runtimeParent, [temporaryName]);
|
|
41
60
|
try {
|
|
42
61
|
const agentDir = ensureGeneratedDirectoryPath(temporaryRoot, ['agents', project.agentCode, project.version]);
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
62
|
+
for (const artifact of RUNTIME_SOURCE_ARTIFACTS) {
|
|
63
|
+
copyRegularFile(resolve(project.root, artifact), resolve(agentDir, artifact));
|
|
64
|
+
}
|
|
65
|
+
const snapshot = materializeResources(agentDir, runtimeResources, project.agentCode, project.version, includeDigests);
|
|
46
66
|
writeFileSync(resolve(agentDir, 'snapshot.json'), `${JSON.stringify(snapshot, null, 2)}\n`, 'utf8');
|
|
47
67
|
writeFileSync(resolve(agentDir, '.ready'), '', 'utf8');
|
|
48
68
|
syncAssemblyDocument(project.root, agentDir);
|
|
@@ -75,18 +95,20 @@ function canReuseRuntime(runtimeRoot, project, resources, includeDigests) {
|
|
|
75
95
|
const snapshot = JSON.parse(readFileSync(snapshotPath, 'utf8'));
|
|
76
96
|
if (snapshot.version !== project.version)
|
|
77
97
|
return false;
|
|
78
|
-
const
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
const sourceArtifactDigests = new Map();
|
|
99
|
+
for (const artifact of RUNTIME_SOURCE_ARTIFACTS) {
|
|
100
|
+
const sourceDigest = sha256(readFileSync(resolve(project.root, artifact)));
|
|
101
|
+
sourceArtifactDigests.set(artifact, sourceDigest);
|
|
102
|
+
if (sha256(readFileSync(resolve(agentDir, artifact))) !== sourceDigest)
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
84
105
|
const expectedTools = resources
|
|
85
106
|
.filter((resource) => resource.kind === 'tools')
|
|
86
107
|
.map((resource) => ({
|
|
87
108
|
name: resource.code,
|
|
88
109
|
version: resource.version,
|
|
89
110
|
...(includeDigests ? { sha256: toSha256Hex(sha256(readFileSync(resolve(resource.sourcePath, resource.manifestFile)))) } : {}),
|
|
111
|
+
...(includeDigests ? { contentSha256: resourceDirectoryDigest(resource.sourcePath) } : {}),
|
|
90
112
|
}))
|
|
91
113
|
.sort((left, right) => left.name.localeCompare(right.name) || left.version.localeCompare(right.version));
|
|
92
114
|
const expectedSkills = resources
|
|
@@ -95,6 +117,7 @@ function canReuseRuntime(runtimeRoot, project, resources, includeDigests) {
|
|
|
95
117
|
skillId: resource.code,
|
|
96
118
|
version: resource.version,
|
|
97
119
|
...(includeDigests ? { sha256: toSha256Hex(sha256(readFileSync(resolve(resource.sourcePath, resource.manifestFile)))) } : {}),
|
|
120
|
+
...(includeDigests ? { contentSha256: resourceDirectoryDigest(resource.sourcePath) } : {}),
|
|
98
121
|
}))
|
|
99
122
|
.sort((left, right) => left.skillId.localeCompare(right.skillId) || left.version.localeCompare(right.version));
|
|
100
123
|
if (JSON.stringify(snapshot.tools ?? []) !== JSON.stringify(expectedTools))
|
|
@@ -102,24 +125,33 @@ function canReuseRuntime(runtimeRoot, project, resources, includeDigests) {
|
|
|
102
125
|
if (JSON.stringify(snapshot.skills ?? []) !== JSON.stringify(expectedSkills))
|
|
103
126
|
return false;
|
|
104
127
|
const artifacts = new Map((snapshot.artifacts ?? []).map((artifact) => [artifact.path, artifact.sha256]));
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
128
|
+
for (const artifact of RUNTIME_SOURCE_ARTIFACTS) {
|
|
129
|
+
if (artifacts.get(artifact) !== toSha256Hex(sourceArtifactDigests.get(artifact)))
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
109
132
|
const dependenciesPath = resolve(agentDir, 'dependencies.lock');
|
|
110
133
|
if (!existsSync(dependenciesPath))
|
|
111
134
|
return false;
|
|
112
135
|
if (artifacts.get('dependencies.lock') !== toSha256Hex(sha256(readFileSync(dependenciesPath))))
|
|
113
136
|
return false;
|
|
114
137
|
for (const resource of resources) {
|
|
115
|
-
const
|
|
138
|
+
const materializedDirectory = resolveMaterializedResourceDirectory(agentDir, resource);
|
|
139
|
+
const manifestPath = resolve(materializedDirectory, resource.manifestFile);
|
|
116
140
|
if (!existsSync(manifestPath))
|
|
117
141
|
return false;
|
|
118
142
|
if (includeDigests) {
|
|
119
143
|
const expectedDigest = toSha256Hex(sha256(readFileSync(manifestPath)));
|
|
144
|
+
const sourceContentDigest = resourceDirectoryDigest(resource.sourcePath);
|
|
145
|
+
const materializedContentDigest = resourceDirectoryDigest(materializedDirectory);
|
|
120
146
|
const matches = resource.kind === 'tools'
|
|
121
|
-
? (snapshot.tools ?? []).some((item) => item.name === resource.code
|
|
122
|
-
|
|
147
|
+
? (snapshot.tools ?? []).some((item) => (item.name === resource.code
|
|
148
|
+
&& item.sha256 === expectedDigest
|
|
149
|
+
&& item.contentSha256 === sourceContentDigest
|
|
150
|
+
&& item.contentSha256 === materializedContentDigest))
|
|
151
|
+
: (snapshot.skills ?? []).some((item) => (item.skillId === resource.code
|
|
152
|
+
&& item.sha256 === expectedDigest
|
|
153
|
+
&& item.contentSha256 === sourceContentDigest
|
|
154
|
+
&& item.contentSha256 === materializedContentDigest));
|
|
123
155
|
if (!matches)
|
|
124
156
|
return false;
|
|
125
157
|
}
|
|
@@ -205,27 +237,39 @@ function materializeResources(agentDir, resources, agentCode, version, includeDi
|
|
|
205
237
|
throw new Error(`Materialized ${resource.kind.slice(0, -1)} entry file is missing: ${resource.code}`);
|
|
206
238
|
}
|
|
207
239
|
const destinationDigest = includeDigests ? sha256(readFileSync(destinationManifestPath)) : undefined;
|
|
240
|
+
const contentSha256 = includeDigests ? resourceDirectoryDigest(destination) : undefined;
|
|
208
241
|
writeFileSync(resolve(destination, '.ready'), '', 'utf8');
|
|
209
242
|
const digest = destinationDigest ? toSha256Hex(destinationDigest) : undefined;
|
|
210
|
-
if (resource.kind === 'tools')
|
|
211
|
-
tools.push({
|
|
212
|
-
|
|
213
|
-
|
|
243
|
+
if (resource.kind === 'tools') {
|
|
244
|
+
tools.push({
|
|
245
|
+
name: resource.code,
|
|
246
|
+
version: resource.version,
|
|
247
|
+
...(digest ? { sha256: digest } : {}),
|
|
248
|
+
...(contentSha256 ? { contentSha256 } : {}),
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
else {
|
|
252
|
+
skills.push({
|
|
253
|
+
skillId: resource.code,
|
|
254
|
+
version: resource.version,
|
|
255
|
+
...(digest ? { sha256: digest } : {}),
|
|
256
|
+
...(contentSha256 ? { contentSha256 } : {}),
|
|
257
|
+
});
|
|
258
|
+
}
|
|
214
259
|
}
|
|
215
|
-
const
|
|
216
|
-
const graphPath = resolve(agentDir, 'graph.json');
|
|
260
|
+
const lockableResources = resources.filter((resource) => isDependenciesLockCode(resource.code));
|
|
217
261
|
const dependenciesLock = DependenciesLockSchema.parse({
|
|
218
262
|
lockVersion: 1,
|
|
219
263
|
agentCode,
|
|
220
264
|
agentVersion: version,
|
|
221
|
-
toolRefs:
|
|
265
|
+
toolRefs: lockableResources
|
|
222
266
|
.filter((resource) => resource.kind === 'tools')
|
|
223
267
|
.map((resource) => ({
|
|
224
268
|
code: resource.code,
|
|
225
269
|
version: resource.version,
|
|
226
270
|
...(includeDigests ? { sha256: toSha256Hex(sha256(readFileSync(resolve(resource.sourcePath, resource.manifestFile)))) } : {}),
|
|
227
271
|
})),
|
|
228
|
-
skillRefs:
|
|
272
|
+
skillRefs: lockableResources
|
|
229
273
|
.filter((resource) => resource.kind === 'skills')
|
|
230
274
|
.map((resource) => ({
|
|
231
275
|
code: resource.code,
|
|
@@ -240,8 +284,10 @@ function materializeResources(agentDir, resources, agentCode, version, includeDi
|
|
|
240
284
|
tools: tools.sort((left, right) => left.name.localeCompare(right.name) || left.version.localeCompare(right.version)),
|
|
241
285
|
skills: skills.sort((left, right) => left.skillId.localeCompare(right.skillId) || left.version.localeCompare(right.version)),
|
|
242
286
|
artifacts: [
|
|
243
|
-
|
|
244
|
-
|
|
287
|
+
...RUNTIME_SOURCE_ARTIFACTS.map((path) => ({
|
|
288
|
+
path,
|
|
289
|
+
sha256: toSha256Hex(sha256(readFileSync(resolve(agentDir, path)))),
|
|
290
|
+
})),
|
|
245
291
|
{ path: 'dependencies.lock', sha256: toSha256Hex(sha256(readFileSync(dependenciesPath))) },
|
|
246
292
|
],
|
|
247
293
|
};
|
|
@@ -252,6 +298,28 @@ function resolveMaterializedResourceDirectory(agentDir, resource) {
|
|
|
252
298
|
function materializedResourceDirectorySegments(resource) {
|
|
253
299
|
return ['preinstall', resource.kind, resource.code];
|
|
254
300
|
}
|
|
301
|
+
function mergeRuntimeResources(lockedResources, configuredResources, manifest) {
|
|
302
|
+
const merged = new Map();
|
|
303
|
+
for (const resource of lockedResources) {
|
|
304
|
+
merged.set(`${resource.kind}:${resource.code}`, resource);
|
|
305
|
+
}
|
|
306
|
+
const versions = new Map([
|
|
307
|
+
...manifest.toolRefs.map((ref) => [`tools:${ref.code}`, ref.version]),
|
|
308
|
+
...manifest.skillRefs.map((ref) => [`skills:${ref.code}`, ref.version]),
|
|
309
|
+
]);
|
|
310
|
+
for (const resource of configuredResources) {
|
|
311
|
+
merged.set(`${resource.kind}:${resource.code}`, {
|
|
312
|
+
...resource,
|
|
313
|
+
version: versions.get(`${resource.kind}:${resource.code}`) ?? '1.0.0',
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
return [...merged.values()].sort((left, right) => (left.kind.localeCompare(right.kind)
|
|
317
|
+
|| left.code.localeCompare(right.code)
|
|
318
|
+
|| left.version.localeCompare(right.version)));
|
|
319
|
+
}
|
|
320
|
+
function isDependenciesLockCode(value) {
|
|
321
|
+
return value.length <= 64 && /^[a-z0-9][a-z0-9_-]*$/.test(value);
|
|
322
|
+
}
|
|
255
323
|
function syncAssemblyDocument(projectRoot, agentDir) {
|
|
256
324
|
const source = resolve(projectRoot, 'assembly.json');
|
|
257
325
|
if (!existsSync(source) || !lstatSync(source).isFile())
|