@noodleseed/one 0.115.0 → 0.116.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/agent-product-skill-doctor.js +19 -4
- package/dist/agent-product-skill-doctor.js.map +1 -1
- package/dist/agent-product-skill-output.d.ts +7 -0
- package/dist/agent-product-skill-output.d.ts.map +1 -0
- package/dist/agent-product-skill-output.js +23 -0
- package/dist/agent-product-skill-output.js.map +1 -0
- package/dist/agent-product-skill-reconcile.d.ts +22 -0
- package/dist/agent-product-skill-reconcile.d.ts.map +1 -0
- package/dist/agent-product-skill-reconcile.js +260 -0
- package/dist/agent-product-skill-reconcile.js.map +1 -0
- package/dist/agent-product-skill-state.d.ts +9 -27
- package/dist/agent-product-skill-state.d.ts.map +1 -1
- package/dist/agent-product-skill-state.js +37 -83
- package/dist/agent-product-skill-state.js.map +1 -1
- package/dist/agent-product-skill.d.ts +15 -11
- package/dist/agent-product-skill.d.ts.map +1 -1
- package/dist/agent-product-skill.js +5 -177
- package/dist/agent-product-skill.js.map +1 -1
- package/dist/agents-doctor.d.ts.map +1 -1
- package/dist/agents-doctor.js +25 -13
- package/dist/agents-doctor.js.map +1 -1
- package/dist/agents.d.ts +3 -1
- package/dist/agents.d.ts.map +1 -1
- package/dist/agents.js +42 -5
- package/dist/agents.js.map +1 -1
- package/dist/commands/catalog-data-bootstrap-pre-auth.d.ts.map +1 -1
- package/dist/commands/catalog-data-bootstrap-pre-auth.js +14 -0
- package/dist/commands/catalog-data-bootstrap-pre-auth.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.d.ts +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.js +24 -0
- package/node_modules/@noodle-borg/agent-kit/dist/behavior-skills.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/index.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.d.ts +36 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.d.ts.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.js +116 -0
- package/node_modules/@noodle-borg/agent-kit/dist/product-skill-ownership.js.map +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.js +14 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-agent-guide-ref.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +8 -2
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodleseed/assistant/package.json +1 -1
- package/package.json +1 -1
|
@@ -52,10 +52,17 @@ function inspectTarget(input) {
|
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
54
|
if (read.kind === 'absent') {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
55
|
+
const extras = unexpectedProductSkillPaths({
|
|
56
|
+
project: input.project,
|
|
57
|
+
target: input.target,
|
|
58
|
+
skillSlug: input.skillSlug,
|
|
59
|
+
expectedPaths: input.files.map((file) => file.path),
|
|
58
60
|
});
|
|
61
|
+
const exact = extras.length === 0 &&
|
|
62
|
+
input.files.every((file) => {
|
|
63
|
+
const path = join(input.project, file.path);
|
|
64
|
+
return !existsSync(path) || readFileSync(path, 'utf8') === file.content;
|
|
65
|
+
});
|
|
59
66
|
return {
|
|
60
67
|
name,
|
|
61
68
|
level: 'WARN',
|
|
@@ -94,14 +101,22 @@ function inspectTarget(input) {
|
|
|
94
101
|
message: 'generated app skill files are missing; preview noodle agents setup before --write',
|
|
95
102
|
};
|
|
96
103
|
}
|
|
104
|
+
if (read.migrationRequired) {
|
|
105
|
+
return {
|
|
106
|
+
name,
|
|
107
|
+
level: 'WARN',
|
|
108
|
+
code: 'agent_skill_stale',
|
|
109
|
+
message: 'ownership record schema is outdated; preview explicit app-skill regeneration before migration',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
97
112
|
const expected = createProductSkillState({
|
|
98
113
|
target: input.target,
|
|
99
114
|
artifact: input.artifact,
|
|
100
115
|
bundle: {
|
|
116
|
+
schemaVersion: 1,
|
|
101
117
|
rendererVersion: input.rendererVersion,
|
|
102
118
|
bundleSha256: input.bundleSha256,
|
|
103
119
|
},
|
|
104
|
-
skillSlug: input.skillSlug,
|
|
105
120
|
files: input.files,
|
|
106
121
|
});
|
|
107
122
|
if (!sameState(state, expected)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-product-skill-doctor.js","sourceRoot":"","sources":["../src/agent-product-skill-doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EACL,2BAA2B,EAC3B,uBAAuB,EACvB,6BAA6B,EAE7B,qBAAqB,EACrB,2BAA2B,GAC5B,MAAM,gCAAgC,CAAC;AASxC,MAAM,UAAU,yBAAyB,CAAC,KAIzC;IACC,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO;YACL;gBACE,IAAI,EAAE,+BAA+B;gBACrC,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,WAAW,CAAC,OAAO;aAC7B;SACF,CAAC;IACJ,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACrE,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IACvF,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAClC,aAAa,CAAC;QACZ,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM;QACN,QAAQ,EAAE,WAAW,CAAC,QAAQ;QAC9B,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;QACxE,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,eAAe;QACnD,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,YAAY;QAC7C,SAAS,EAAE,WAAW,CAAC,SAAS;KACjC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAQtB;IACC,MAAM,IAAI,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC9D,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,IAAI;YACJ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,mBAAmB;YACzB,OAAO,EAAE,oDAAoD;SAC9D,CAAC;IACJ,CAAC;IACD,IAAI,CAAC;QACH,2BAA2B,CAAC;YAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SAC5C,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI;gBACJ,KAAK,EAAE,MAAM;gBACb,IAAI,EAAE,2BAA2B;gBACjC,OAAO,EAAE,mEAAmE;aAC7E,CAAC;QACJ,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"agent-product-skill-doctor.js","sourceRoot":"","sources":["../src/agent-product-skill-doctor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ProductSkillSetupReport } from './agent-product-skill.js';
|
|
2
|
+
export declare function productSkillRecoveryNext(issue: ProductSkillSetupReport['issues'][number] | undefined): string;
|
|
3
|
+
export declare function nextAgentSetupCommand(args: {
|
|
4
|
+
readonly write: boolean;
|
|
5
|
+
readonly replaceModifiedAppSkill: boolean;
|
|
6
|
+
}, productSkill: ProductSkillSetupReport | undefined): string | undefined;
|
|
7
|
+
//# sourceMappingURL=agent-product-skill-output.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-product-skill-output.d.ts","sourceRoot":"","sources":["../src/agent-product-skill-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAExE,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS,GAC3D,MAAM,CAQR;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAA;CAAE,EAC5E,YAAY,EAAE,uBAAuB,GAAG,SAAS,GAChD,MAAM,GAAG,SAAS,CAepB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function productSkillRecoveryNext(issue) {
|
|
2
|
+
if (issue?.code === 'agent_skill_modified' && issue.recovery === 'replace_modified_app_skill') {
|
|
3
|
+
return 'Review the modified app-skill files, then preview noodle agents setup --regenerate-app-skill --replace-modified-app-skill.';
|
|
4
|
+
}
|
|
5
|
+
if (issue?.code === 'agent_skill_invalid_state') {
|
|
6
|
+
return 'Review the app-skill ownership record without deleting local app files.';
|
|
7
|
+
}
|
|
8
|
+
return 'Review noodle agents setup, then rerun the exact previewed write when safe.';
|
|
9
|
+
}
|
|
10
|
+
export function nextAgentSetupCommand(args, productSkill) {
|
|
11
|
+
const issue = productSkill?.issues[0];
|
|
12
|
+
if (issue?.code === 'agent_skill_modified' && issue.recovery === 'replace_modified_app_skill') {
|
|
13
|
+
return 'noodle agents setup --regenerate-app-skill --replace-modified-app-skill';
|
|
14
|
+
}
|
|
15
|
+
if (issue !== undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
const pendingRegeneration = productSkill?.targets.some((target) => target.requiresRegeneration && !target.applied && target.issue === undefined);
|
|
18
|
+
if (pendingRegeneration) {
|
|
19
|
+
return `noodle agents setup --write --regenerate-app-skill${args.replaceModifiedAppSkill ? ' --replace-modified-app-skill' : ''}`;
|
|
20
|
+
}
|
|
21
|
+
return args.write ? undefined : 'noodle agents setup --write';
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=agent-product-skill-output.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-product-skill-output.js","sourceRoot":"","sources":["../src/agent-product-skill-output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,wBAAwB,CACtC,KAA4D;IAE5D,IAAI,KAAK,EAAE,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,QAAQ,KAAK,4BAA4B,EAAE,CAAC;QAC9F,OAAO,4HAA4H,CAAC;IACtI,CAAC;IACD,IAAI,KAAK,EAAE,IAAI,KAAK,2BAA2B,EAAE,CAAC;QAChD,OAAO,yEAAyE,CAAC;IACnF,CAAC;IACD,OAAO,6EAA6E,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,IAA4E,EAC5E,YAAiD;IAEjD,MAAM,KAAK,GAAG,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,IAAI,KAAK,sBAAsB,IAAI,KAAK,CAAC,QAAQ,KAAK,4BAA4B,EAAE,CAAC;QAC9F,OAAO,yEAAyE,CAAC;IACnF,CAAC;IACD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,MAAM,mBAAmB,GAAG,YAAY,EAAE,OAAO,CAAC,IAAI,CACpD,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,oBAAoB,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,CACzF,CAAC;IACF,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO,qDACL,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,EACnE,EAAE,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC;AAChE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AgentTarget, RenderedProductSkillBundleV1 } from '@noodle-borg/agent-kit';
|
|
2
|
+
import type { AppPackageArtifactV1 } from '@noodle-borg/compiler';
|
|
3
|
+
import type { ProductSkillSetupReport, ProductSkillTargetReport } from './agent-product-skill.js';
|
|
4
|
+
export interface ProductSkillReconcileInput {
|
|
5
|
+
readonly project: string;
|
|
6
|
+
readonly target: AgentTarget;
|
|
7
|
+
readonly write: boolean;
|
|
8
|
+
readonly regenerateAppSkill: boolean;
|
|
9
|
+
readonly replaceModifiedAppSkill: boolean;
|
|
10
|
+
readonly artifact: AppPackageArtifactV1;
|
|
11
|
+
readonly bundle: RenderedProductSkillBundleV1;
|
|
12
|
+
readonly skillSlug: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function reconcileProductSkillTarget(input: ProductSkillReconcileInput): ProductSkillTargetReport;
|
|
15
|
+
export declare function orphanedProductSkillSetupReport(input: {
|
|
16
|
+
readonly project: string;
|
|
17
|
+
readonly targets: readonly AgentTarget[];
|
|
18
|
+
readonly write: boolean;
|
|
19
|
+
readonly regenerateAppSkill?: boolean;
|
|
20
|
+
readonly replaceModifiedAppSkill?: boolean;
|
|
21
|
+
}): ProductSkillSetupReport | undefined;
|
|
22
|
+
//# sourceMappingURL=agent-product-skill-reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-product-skill-reconcile.d.ts","sourceRoot":"","sources":["../src/agent-product-skill-reconcile.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EACX,4BAA4B,EAE7B,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,KAAK,EAGV,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,0BAA0B,CAAC;AAelC,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,0BAA0B,GAChC,wBAAwB,CA2H1B;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC5C,GAAG,uBAAuB,GAAG,SAAS,CA2FtC"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { assertProductSkillPathsSafe, createProductSkillState, inspectProductSkillStateFiles, productSkillStatePath, readProductSkillState, removeProductSkillFiles, removeProductSkillState, unexpectedProductSkillPaths, writeProductSkillState, } from './agent-product-skill-state.js';
|
|
4
|
+
import { atomicWriteProjectFile } from './agent-skills-state.js';
|
|
5
|
+
export function reconcileProductSkillTarget(input) {
|
|
6
|
+
const files = targetFiles(input.bundle, input.target);
|
|
7
|
+
const statePath = productSkillStatePath(input.target);
|
|
8
|
+
try {
|
|
9
|
+
assertProductSkillPathsSafe({
|
|
10
|
+
project: input.project,
|
|
11
|
+
target: input.target,
|
|
12
|
+
paths: files.map((file) => file.path),
|
|
13
|
+
});
|
|
14
|
+
const read = readProductSkillState(input.project, input.target);
|
|
15
|
+
if (read.kind === 'invalid') {
|
|
16
|
+
return invalidTarget(input.target, statePath, files, 'ownership record is malformed');
|
|
17
|
+
}
|
|
18
|
+
if (read.kind === 'absent')
|
|
19
|
+
return adoptOrCreateTarget(input, files, statePath);
|
|
20
|
+
const state = read.state;
|
|
21
|
+
assertProductSkillPathsSafe({
|
|
22
|
+
project: input.project,
|
|
23
|
+
target: input.target,
|
|
24
|
+
paths: state.files.map((file) => file.path),
|
|
25
|
+
});
|
|
26
|
+
const extras = unexpectedProductSkillPaths({
|
|
27
|
+
project: input.project,
|
|
28
|
+
target: input.target,
|
|
29
|
+
skillSlug: state.app.skillSlug,
|
|
30
|
+
expectedPaths: state.files.map((file) => file.path),
|
|
31
|
+
});
|
|
32
|
+
if (extras.length > 0) {
|
|
33
|
+
return blockedTarget(input.target, statePath, files, `unowned file collision: ${extras[0]}`);
|
|
34
|
+
}
|
|
35
|
+
const disk = inspectProductSkillStateFiles(input.project, state);
|
|
36
|
+
const replaceModified = input.regenerateAppSkill && input.replaceModifiedAppSkill;
|
|
37
|
+
if (disk.modified && !replaceModified) {
|
|
38
|
+
return blockedTarget(input.target, statePath, files, 'generated files differ from their recorded hashes', { recovery: 'replace_modified_app_skill' });
|
|
39
|
+
}
|
|
40
|
+
const oldPaths = new Set(state.files.map((file) => file.path));
|
|
41
|
+
const layoutChanged = state.app.name !== input.artifact.app.name ||
|
|
42
|
+
state.app.skillSlug !== input.skillSlug ||
|
|
43
|
+
!samePaths(state.files, files);
|
|
44
|
+
if (layoutChanged) {
|
|
45
|
+
const nextExtras = unexpectedProductSkillPaths({
|
|
46
|
+
project: input.project,
|
|
47
|
+
target: input.target,
|
|
48
|
+
skillSlug: input.skillSlug,
|
|
49
|
+
expectedPaths: files.map((file) => file.path),
|
|
50
|
+
});
|
|
51
|
+
if (nextExtras.length > 0) {
|
|
52
|
+
return blockedTarget(input.target, statePath, files, `unowned destination collision: ${nextExtras[0]}`);
|
|
53
|
+
}
|
|
54
|
+
const collision = files.find((file) => {
|
|
55
|
+
const path = join(input.project, file.path);
|
|
56
|
+
return (!oldPaths.has(file.path) &&
|
|
57
|
+
existsSync(path) &&
|
|
58
|
+
readFileSync(path, 'utf8') !== file.content);
|
|
59
|
+
});
|
|
60
|
+
if (collision !== undefined) {
|
|
61
|
+
return blockedTarget(input.target, statePath, files, `unowned destination collision: ${collision.path}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const desiredPaths = new Set(files.map((file) => file.path));
|
|
65
|
+
const actions = state.files
|
|
66
|
+
.filter((file) => !desiredPaths.has(file.path))
|
|
67
|
+
.map((file) => ({ path: file.path, action: 'removed' }));
|
|
68
|
+
actions.push(...files.map((file) => {
|
|
69
|
+
const path = join(input.project, file.path);
|
|
70
|
+
if (!existsSync(path))
|
|
71
|
+
return { path: file.path, action: 'created' };
|
|
72
|
+
return readFileSync(path, 'utf8') === file.content
|
|
73
|
+
? { path: file.path, action: 'unchanged' }
|
|
74
|
+
: { path: file.path, action: 'updated' };
|
|
75
|
+
}));
|
|
76
|
+
const nextState = createProductSkillState({
|
|
77
|
+
target: input.target,
|
|
78
|
+
artifact: input.artifact,
|
|
79
|
+
bundle: input.bundle,
|
|
80
|
+
files,
|
|
81
|
+
});
|
|
82
|
+
const changed = read.migrationRequired ||
|
|
83
|
+
actions.some((action) => action.action !== 'unchanged') ||
|
|
84
|
+
!sameState(state, nextState);
|
|
85
|
+
const apply = changed && input.write && input.regenerateAppSkill;
|
|
86
|
+
if (apply)
|
|
87
|
+
writeTarget(input.project, input.target, files, actions, nextState);
|
|
88
|
+
return {
|
|
89
|
+
target: input.target,
|
|
90
|
+
status: changed && read.migrationRequired && !layoutChanged && !disk.modified
|
|
91
|
+
? 'stale'
|
|
92
|
+
: changed
|
|
93
|
+
? 'updated'
|
|
94
|
+
: 'unchanged',
|
|
95
|
+
statePath,
|
|
96
|
+
applied: apply,
|
|
97
|
+
requiresRegeneration: changed,
|
|
98
|
+
stateAction: read.migrationRequired ? 'migrated' : changed ? 'updated' : 'unchanged',
|
|
99
|
+
files: actions,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (cause) {
|
|
103
|
+
return invalidTarget(input.target, statePath, files, errorMessage(cause));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
export function orphanedProductSkillSetupReport(input) {
|
|
107
|
+
const reports = [];
|
|
108
|
+
let app;
|
|
109
|
+
for (const target of input.targets) {
|
|
110
|
+
try {
|
|
111
|
+
const read = readProductSkillState(input.project, target);
|
|
112
|
+
if (read.kind === 'absent')
|
|
113
|
+
continue;
|
|
114
|
+
if (read.kind === 'invalid') {
|
|
115
|
+
reports.push(invalidTarget(target, productSkillStatePath(target), [], 'ownership record is malformed'));
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const state = read.state;
|
|
119
|
+
app ??= state.app;
|
|
120
|
+
assertProductSkillPathsSafe({
|
|
121
|
+
project: input.project,
|
|
122
|
+
target,
|
|
123
|
+
paths: state.files.map((file) => file.path),
|
|
124
|
+
});
|
|
125
|
+
const extras = unexpectedProductSkillPaths({
|
|
126
|
+
project: input.project,
|
|
127
|
+
target,
|
|
128
|
+
skillSlug: state.app.skillSlug,
|
|
129
|
+
expectedPaths: state.files.map((file) => file.path),
|
|
130
|
+
});
|
|
131
|
+
if (extras.length > 0) {
|
|
132
|
+
reports.push(blockedTarget(target, productSkillStatePath(target), [], `unowned file collision: ${extras[0]}`));
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const disk = inspectProductSkillStateFiles(input.project, state);
|
|
136
|
+
const replaceModified = input.regenerateAppSkill === true && input.replaceModifiedAppSkill === true;
|
|
137
|
+
if (disk.modified && !replaceModified) {
|
|
138
|
+
reports.push(blockedTarget(target, productSkillStatePath(target), [], 'generated files differ from their recorded hashes', { recovery: 'replace_modified_app_skill' }));
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const actions = state.files.map((file) => ({
|
|
142
|
+
path: file.path,
|
|
143
|
+
action: existsSync(join(input.project, file.path)) ? 'removed' : 'unchanged',
|
|
144
|
+
}));
|
|
145
|
+
const apply = input.write && input.regenerateAppSkill === true;
|
|
146
|
+
if (apply) {
|
|
147
|
+
removeProductSkillFiles({
|
|
148
|
+
project: input.project,
|
|
149
|
+
target,
|
|
150
|
+
paths: state.files.map((file) => file.path),
|
|
151
|
+
});
|
|
152
|
+
removeProductSkillState(input.project, target);
|
|
153
|
+
}
|
|
154
|
+
reports.push({
|
|
155
|
+
target,
|
|
156
|
+
status: 'removed',
|
|
157
|
+
statePath: productSkillStatePath(target),
|
|
158
|
+
applied: apply,
|
|
159
|
+
requiresRegeneration: true,
|
|
160
|
+
stateAction: 'removed',
|
|
161
|
+
files: actions,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (cause) {
|
|
165
|
+
reports.push(invalidTarget(target, productSkillStatePath(target), [], errorMessage(cause)));
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
if (reports.length === 0)
|
|
169
|
+
return undefined;
|
|
170
|
+
const issues = reports.flatMap((target) => target.issue === undefined ? [] : [{ ...target.issue, target: target.target }]);
|
|
171
|
+
return {
|
|
172
|
+
ok: issues.length === 0,
|
|
173
|
+
...(app === undefined ? {} : { app }),
|
|
174
|
+
targets: reports,
|
|
175
|
+
issues,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
function adoptOrCreateTarget(input, files, statePath) {
|
|
179
|
+
const extras = unexpectedProductSkillPaths({
|
|
180
|
+
project: input.project,
|
|
181
|
+
target: input.target,
|
|
182
|
+
skillSlug: input.skillSlug,
|
|
183
|
+
expectedPaths: files.map((file) => file.path),
|
|
184
|
+
});
|
|
185
|
+
const actions = files.map((file) => {
|
|
186
|
+
const path = join(input.project, file.path);
|
|
187
|
+
if (!existsSync(path))
|
|
188
|
+
return { path: file.path, action: 'created' };
|
|
189
|
+
return readFileSync(path, 'utf8') === file.content
|
|
190
|
+
? { path: file.path, action: 'unchanged' }
|
|
191
|
+
: { path: file.path, action: 'skipped', reason: 'unowned file collision' };
|
|
192
|
+
});
|
|
193
|
+
if (extras.length > 0 || actions.some((action) => action.action === 'skipped')) {
|
|
194
|
+
return blockedTarget(input.target, statePath, files, `unowned file collision${extras[0] === undefined ? '' : `: ${extras[0]}`}`);
|
|
195
|
+
}
|
|
196
|
+
const state = createProductSkillState({
|
|
197
|
+
target: input.target,
|
|
198
|
+
artifact: input.artifact,
|
|
199
|
+
bundle: input.bundle,
|
|
200
|
+
files,
|
|
201
|
+
});
|
|
202
|
+
if (input.write)
|
|
203
|
+
writeTarget(input.project, input.target, files, actions, state);
|
|
204
|
+
return {
|
|
205
|
+
target: input.target,
|
|
206
|
+
status: actions.some((action) => action.action === 'created') ? 'created' : 'unchanged',
|
|
207
|
+
statePath,
|
|
208
|
+
applied: input.write,
|
|
209
|
+
requiresRegeneration: false,
|
|
210
|
+
stateAction: 'created',
|
|
211
|
+
files: actions,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
function writeTarget(project, target, files, actions, state) {
|
|
215
|
+
for (const file of files) {
|
|
216
|
+
const action = actions.find((candidate) => candidate.path === file.path)?.action;
|
|
217
|
+
if (action === 'created' || action === 'updated') {
|
|
218
|
+
atomicWriteProjectFile(join(project, file.path), file.content);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
const removed = actions
|
|
222
|
+
.filter((action) => action.action === 'removed')
|
|
223
|
+
.map((action) => action.path);
|
|
224
|
+
if (removed.length > 0)
|
|
225
|
+
removeProductSkillFiles({ project, target, paths: removed });
|
|
226
|
+
writeProductSkillState(project, state);
|
|
227
|
+
}
|
|
228
|
+
function targetFiles(bundle, target) {
|
|
229
|
+
const files = bundle.files.filter((file) => file.target === target);
|
|
230
|
+
if (files.length !== 2) {
|
|
231
|
+
throw new Error(`App Package renderer did not return two ${target} files`);
|
|
232
|
+
}
|
|
233
|
+
return files;
|
|
234
|
+
}
|
|
235
|
+
function samePaths(left, right) {
|
|
236
|
+
return (left.length === right.length && left.every((file, index) => file.path === right[index]?.path));
|
|
237
|
+
}
|
|
238
|
+
function sameState(left, right) {
|
|
239
|
+
return JSON.stringify(left) === JSON.stringify(right);
|
|
240
|
+
}
|
|
241
|
+
function blockedTarget(target, statePath, files, message, issue = {}) {
|
|
242
|
+
const code = issue.code ?? 'agent_skill_modified';
|
|
243
|
+
return {
|
|
244
|
+
target,
|
|
245
|
+
status: 'modified',
|
|
246
|
+
statePath,
|
|
247
|
+
applied: false,
|
|
248
|
+
requiresRegeneration: true,
|
|
249
|
+
stateAction: 'unchanged',
|
|
250
|
+
files: files.map((file) => ({ path: file.path, action: 'skipped', reason: message })),
|
|
251
|
+
issue: { code, message, ...(issue.recovery === undefined ? {} : { recovery: issue.recovery }) },
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function invalidTarget(target, statePath, files, message) {
|
|
255
|
+
return blockedTarget(target, statePath, files, message, { code: 'agent_skill_invalid_state' });
|
|
256
|
+
}
|
|
257
|
+
function errorMessage(cause) {
|
|
258
|
+
return cause instanceof Error ? cause.message : 'unknown app product skill reconciliation error';
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=agent-product-skill-reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-product-skill-reconcile.js","sourceRoot":"","sources":["../src/agent-product-skill-reconcile.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,24 +1,6 @@
|
|
|
1
|
-
import { type AgentTarget, type
|
|
2
|
-
|
|
3
|
-
export
|
|
4
|
-
readonly path: string;
|
|
5
|
-
readonly sha256: string;
|
|
6
|
-
readonly byteLength: number;
|
|
7
|
-
}
|
|
8
|
-
export interface ProductSkillState {
|
|
9
|
-
readonly schemaVersion: 1;
|
|
10
|
-
readonly target: AgentTarget;
|
|
11
|
-
readonly app: {
|
|
12
|
-
readonly name: string;
|
|
13
|
-
readonly skillSlug: string;
|
|
14
|
-
};
|
|
15
|
-
readonly packageSchemaVersion: '1';
|
|
16
|
-
readonly rendererVersion: string;
|
|
17
|
-
readonly sourceManifestSha256: string;
|
|
18
|
-
readonly mcpSurfaceSha256: string;
|
|
19
|
-
readonly bundleSha256: string;
|
|
20
|
-
readonly files: readonly ProductSkillStateFile[];
|
|
21
|
-
}
|
|
1
|
+
import { type AgentTarget, createProductSkillState, type ProductSkillState, type ProductSkillStateFile } from '@noodle-borg/agent-kit';
|
|
2
|
+
export type { ProductSkillState, ProductSkillStateFile };
|
|
3
|
+
export { createProductSkillState };
|
|
22
4
|
export type ProductSkillStateRead = {
|
|
23
5
|
readonly kind: 'absent';
|
|
24
6
|
} | {
|
|
@@ -26,17 +8,17 @@ export type ProductSkillStateRead = {
|
|
|
26
8
|
} | {
|
|
27
9
|
readonly kind: 'valid';
|
|
28
10
|
readonly state: ProductSkillState;
|
|
11
|
+
readonly migrationRequired: boolean;
|
|
29
12
|
};
|
|
30
13
|
export declare function productSkillStatePath(target: AgentTarget): string;
|
|
31
14
|
export declare function readProductSkillState(project: string, target: AgentTarget): ProductSkillStateRead;
|
|
32
15
|
export declare function writeProductSkillState(project: string, state: ProductSkillState): void;
|
|
33
|
-
export declare function
|
|
16
|
+
export declare function removeProductSkillState(project: string, target: AgentTarget): void;
|
|
17
|
+
export declare function removeProductSkillFiles(input: {
|
|
18
|
+
readonly project: string;
|
|
34
19
|
readonly target: AgentTarget;
|
|
35
|
-
readonly
|
|
36
|
-
|
|
37
|
-
readonly skillSlug: string;
|
|
38
|
-
readonly files: readonly RenderedProductSkillFileV1[];
|
|
39
|
-
}): ProductSkillState;
|
|
20
|
+
readonly paths: readonly string[];
|
|
21
|
+
}): void;
|
|
40
22
|
export declare function assertProductSkillPathsSafe(input: {
|
|
41
23
|
readonly project: string;
|
|
42
24
|
readonly target: AgentTarget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-product-skill-state.d.ts","sourceRoot":"","sources":["../src/agent-product-skill-state.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAEhB,
|
|
1
|
+
{"version":3,"file":"agent-product-skill-state.d.ts","sourceRoot":"","sources":["../src/agent-product-skill-state.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,WAAW,EAEhB,uBAAuB,EAEvB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAOhC,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,CAAC;AAEnC,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IACE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;IAClC,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACrC,CAAC;AAEN,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAEjE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,qBAAqB,CAYjG;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI,CAItF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAIlF;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE;IAC7C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GAAG,IAAI,CAsBP;AAED,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC,GAAG,IAAI,CASP;AAED,uGAAuG;AACvG,wBAAgB,2BAA2B,CAAC,KAAK,EAAE;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;CAC3C,GAAG,SAAS,MAAM,EAAE,CAOpB;AAED,wBAAgB,6BAA6B,CAC3C,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,iBAAiB,GACvB;IAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAkB3D"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { existsSync, lstatSync, readdirSync, readFileSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { contentSha256, } from '@noodle-borg/agent-kit';
|
|
1
|
+
import { existsSync, lstatSync, readdirSync, readFileSync, rmdirSync, rmSync } from 'node:fs';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { contentSha256, createProductSkillState, decodeProductSkillState, } from '@noodle-borg/agent-kit';
|
|
4
4
|
import { agentSkillRoot, assertProjectPathSafe, atomicWriteProjectFile, } from './agent-skills-state.js';
|
|
5
|
-
|
|
5
|
+
export { createProductSkillState };
|
|
6
6
|
export function productSkillStatePath(target) {
|
|
7
7
|
return `${agentSkillRoot(target)}/.noodle-app-package.json`;
|
|
8
8
|
}
|
|
@@ -14,8 +14,8 @@ export function readProductSkillState(project, target) {
|
|
|
14
14
|
return { kind: 'absent' };
|
|
15
15
|
try {
|
|
16
16
|
const value = JSON.parse(readFileSync(path, 'utf8'));
|
|
17
|
-
const
|
|
18
|
-
return
|
|
17
|
+
const decoded = decodeProductSkillState(value, target);
|
|
18
|
+
return decoded === undefined ? { kind: 'invalid' } : { kind: 'valid', ...decoded };
|
|
19
19
|
}
|
|
20
20
|
catch {
|
|
21
21
|
return { kind: 'invalid' };
|
|
@@ -26,18 +26,34 @@ export function writeProductSkillState(project, state) {
|
|
|
26
26
|
assertProjectPathSafe(project, path);
|
|
27
27
|
atomicWriteProjectFile(join(project, path), `${JSON.stringify(state, null, 2)}\n`);
|
|
28
28
|
}
|
|
29
|
-
export function
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
29
|
+
export function removeProductSkillState(project, target) {
|
|
30
|
+
const path = productSkillStatePath(target);
|
|
31
|
+
assertProjectPathSafe(project, path);
|
|
32
|
+
rmSync(join(project, path), { force: true });
|
|
33
|
+
}
|
|
34
|
+
export function removeProductSkillFiles(input) {
|
|
35
|
+
assertProductSkillPathsSafe(input);
|
|
36
|
+
for (const path of input.paths)
|
|
37
|
+
rmSync(join(input.project, path), { force: true });
|
|
38
|
+
const root = agentSkillRoot(input.target);
|
|
39
|
+
const directories = new Set(input.paths.flatMap((path) => {
|
|
40
|
+
const parents = [];
|
|
41
|
+
let current = dirname(path);
|
|
42
|
+
while (current !== root && current.startsWith(`${root}/`)) {
|
|
43
|
+
parents.push(current);
|
|
44
|
+
current = dirname(current);
|
|
45
|
+
}
|
|
46
|
+
return parents;
|
|
47
|
+
}));
|
|
48
|
+
for (const directory of [...directories].sort((left, right) => right.length - left.length)) {
|
|
49
|
+
try {
|
|
50
|
+
rmdirSync(join(input.project, directory));
|
|
51
|
+
}
|
|
52
|
+
catch (cause) {
|
|
53
|
+
if (!isFilesystemCode(cause, 'ENOENT') && !isFilesystemCode(cause, 'ENOTEMPTY'))
|
|
54
|
+
throw cause;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
41
57
|
}
|
|
42
58
|
export function assertProductSkillPathsSafe(input) {
|
|
43
59
|
assertProjectPathSafe(input.project, agentSkillRoot(input.target));
|
|
@@ -95,65 +111,6 @@ function collectFiles(fullDir, relativeDir) {
|
|
|
95
111
|
}
|
|
96
112
|
return files;
|
|
97
113
|
}
|
|
98
|
-
function decodeState(value, target) {
|
|
99
|
-
if (!isRecord(value) ||
|
|
100
|
-
!hasExactKeys(value, [
|
|
101
|
-
'schemaVersion',
|
|
102
|
-
'target',
|
|
103
|
-
'app',
|
|
104
|
-
'packageSchemaVersion',
|
|
105
|
-
'rendererVersion',
|
|
106
|
-
'sourceManifestSha256',
|
|
107
|
-
'mcpSurfaceSha256',
|
|
108
|
-
'bundleSha256',
|
|
109
|
-
'files',
|
|
110
|
-
]) ||
|
|
111
|
-
value.schemaVersion !== 1 ||
|
|
112
|
-
value.target !== target ||
|
|
113
|
-
value.packageSchemaVersion !== '1' ||
|
|
114
|
-
typeof value.rendererVersion !== 'string' ||
|
|
115
|
-
value.rendererVersion.trim() === '' ||
|
|
116
|
-
!validDigest(value.sourceManifestSha256) ||
|
|
117
|
-
!validDigest(value.mcpSurfaceSha256) ||
|
|
118
|
-
!validDigest(value.bundleSha256) ||
|
|
119
|
-
!isRecord(value.app) ||
|
|
120
|
-
!hasExactKeys(value.app, ['name', 'skillSlug']) ||
|
|
121
|
-
typeof value.app.name !== 'string' ||
|
|
122
|
-
typeof value.app.skillSlug !== 'string' ||
|
|
123
|
-
!Array.isArray(value.files)) {
|
|
124
|
-
return undefined;
|
|
125
|
-
}
|
|
126
|
-
const files = [];
|
|
127
|
-
const paths = new Set();
|
|
128
|
-
for (const file of value.files) {
|
|
129
|
-
if (!isRecord(file) ||
|
|
130
|
-
!hasExactKeys(file, ['path', 'sha256', 'byteLength']) ||
|
|
131
|
-
typeof file.path !== 'string' ||
|
|
132
|
-
!isTargetFilePath(target, file.path) ||
|
|
133
|
-
paths.has(file.path) ||
|
|
134
|
-
!validDigest(file.sha256) ||
|
|
135
|
-
typeof file.byteLength !== 'number' ||
|
|
136
|
-
!Number.isSafeInteger(file.byteLength) ||
|
|
137
|
-
file.byteLength < 0) {
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
paths.add(file.path);
|
|
141
|
-
files.push({ path: file.path, sha256: file.sha256, byteLength: file.byteLength });
|
|
142
|
-
}
|
|
143
|
-
if (files.length !== 2)
|
|
144
|
-
return undefined;
|
|
145
|
-
return {
|
|
146
|
-
schemaVersion: 1,
|
|
147
|
-
target,
|
|
148
|
-
app: { name: value.app.name, skillSlug: value.app.skillSlug },
|
|
149
|
-
packageSchemaVersion: '1',
|
|
150
|
-
rendererVersion: value.rendererVersion,
|
|
151
|
-
sourceManifestSha256: value.sourceManifestSha256,
|
|
152
|
-
mcpSurfaceSha256: value.mcpSurfaceSha256,
|
|
153
|
-
bundleSha256: value.bundleSha256,
|
|
154
|
-
files,
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
114
|
function isTargetFilePath(target, path) {
|
|
158
115
|
const root = `${agentSkillRoot(target)}/`;
|
|
159
116
|
return (path.startsWith(root) &&
|
|
@@ -161,13 +118,10 @@ function isTargetFilePath(target, path) {
|
|
|
161
118
|
!path.includes('\\') &&
|
|
162
119
|
path.split('/').every((part) => part !== '' && part !== '.' && part !== '..'));
|
|
163
120
|
}
|
|
164
|
-
function validDigest(value) {
|
|
165
|
-
return typeof value === 'string' && SHA256.test(value);
|
|
166
|
-
}
|
|
167
|
-
function hasExactKeys(value, keys) {
|
|
168
|
-
return Object.keys(value).length === keys.length && keys.every((key) => key in value);
|
|
169
|
-
}
|
|
170
121
|
function isRecord(value) {
|
|
171
122
|
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
172
123
|
}
|
|
124
|
+
function isFilesystemCode(value, code) {
|
|
125
|
+
return isRecord(value) && value.code === code;
|
|
126
|
+
}
|
|
173
127
|
//# sourceMappingURL=agent-product-skill-state.js.map
|