beeos-claw 0.6.86 → 0.6.87
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 +11 -2
- package/dist/runtime/runtime-skills-service.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -358,8 +358,17 @@ Markdown acceptance must use the ordinary request "输出一份md格式给我",
|
|
|
358
358
|
real `.md` file with Markdown content and its file card, one summary, and a
|
|
359
359
|
completed task across live events and history. It must not produce an extra
|
|
360
360
|
HTML attachment. Prompt and guard regression tests do not replace this real
|
|
361
|
-
model acceptance
|
|
362
|
-
|
|
361
|
+
model acceptance. This requested-format correction passed selected-instance
|
|
362
|
+
staging acceptance on 2026-10-19: published `beeos-claw@0.6.86` from source
|
|
363
|
+
`3b8a487596a675491eedc69cef7a871f150fe90d`, image
|
|
364
|
+
`sha256:01932b7c6c820e09f18abab61cd267adb8bd74ed67fab008feb2b33f4c73b2a8`,
|
|
365
|
+
upgraded only `inst_46a590294607d9d4b9a50adb` with a verified upgrade receipt.
|
|
366
|
+
The original task's Run 4 uploaded `waimao-tools.md` as `text/markdown` (4,290
|
|
367
|
+
bytes), downloaded as actual Markdown, and opened its heading and table in iOS.
|
|
368
|
+
That run did not call `render_ui`. A separate real regression generated and
|
|
369
|
+
downloaded a new Markdown file without HTML, then delivered explicitly requested
|
|
370
|
+
HTML while preserving access to the earlier Markdown. Other instances and
|
|
371
|
+
default images were unchanged. See [selected staging evidence](docs/static-html-native-tool-result.md#selected-staging-acceptance).
|
|
363
372
|
|
|
364
373
|
This correction does not add a plain-text-only delivery mode. Without a
|
|
365
374
|
successful file upload or interactive result, the existing guard still requests
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{access,mkdir,rename,rm,writeFile}from"node:fs/promises";import{homedir}from"node:os";import{basename,dirname,join,resolve,sep}from"node:path";import{RuntimeCommandError}from"./runtime-command-dispatcher.js";export class RuntimeSkillsService{deps;constructor(e){this.deps=e}async execute(e,t,i){const a=e,
|
|
1
|
+
import{access,mkdir,rename,rm,writeFile}from"node:fs/promises";import{homedir}from"node:os";import{basename,dirname,isAbsolute,join,relative,resolve,sep}from"node:path";import{RuntimeCommandError}from"./runtime-command-dispatcher.js";export class RuntimeSkillsService{deps;constructor(e){this.deps=e}async execute(e,t,i){const a=e,s=this.requireGateway(),r=a.context.agent.runtimeLocalKey;if("skills.list"===a.name){const e=await s.request("skills.status",{agentId:r}),t=await this.skillsRoot(s,r);return{skills:normalizeSkills(e?.skills,t)}}if("skills.setEnabled"===a.name){const e=a,t=await this.skillsRoot(s,r),i=await s.request("skills.status",{agentId:r}),n=i?.skills?.find(i=>isRecord(i)&&installedDirectoryKey(i,t)===e.params.skillKey),o=isRecord(n)?nativeSkillKey(n):e.params.skillKey;return await s.request("skills.update",{skillKey:o||e.params.skillKey,enabled:e.params.enabled}),{skillKey:e.params.skillKey,enabled:e.params.enabled}}const n=await this.skillsRoot(s,r);if("skills.uninstall"===a.name){const e=validateSkillKey(a.params.skillKey);return await rm(contained(n,e),{recursive:!0,force:!0}),{removed:!0}}const o=a,l=await i.resources.readVerifiedArtifact(o.params.artifact),c=l.manifest?.slug??"";if(!c)throw new RuntimeCommandError("INVALID_PARAMS","skill package declares no manifest slug (manifest.json with schema_version 1 and slug is required)");const m=contained(n,validateSkillKey(c)),d=dirname(m),u=contained(d,`.${basename(m)}.${o.context.operationId}.tmp`),f=contained(d,`.${basename(m)}.${o.context.operationId}.backup`);await mkdir(d,{recursive:!0}),!await exists(m)&&await exists(f)&&await rename(f,m),await rm(u,{recursive:!0,force:!0}),await mkdir(u,{recursive:!0});try{for(const[e,t]of l.workspaceFiles){const i=contained(u,normalizeArtifactPath(e));await mkdir(dirname(i),{recursive:!0}),await writeFile(i,t,{mode:384})}await rm(f,{recursive:!0,force:!0}),await exists(m)&&await rename(m,f),await rename(u,m),await rm(f,{recursive:!0,force:!0})}catch(e){throw await rm(u,{recursive:!0,force:!0}).catch(()=>{}),!await exists(m)&&await exists(f)&&await rename(f,m).catch(()=>{}),new RuntimeCommandError("EXECUTION_FAILED",`skill install write failed (files=${l.workspaceFiles.size}): ${e instanceof Error?e.message:String(e)}`,void 0,{cause:e})}return{installed:!0}}requireGateway(){const e=this.deps.getGateway();if(!e?.isConnected)throw new RuntimeCommandError("GATEWAY_NOT_CONNECTED","Gateway not connected");return e}async skillsRoot(e,t){const i=this.deps.getOpenclawHome?.()??process.env.OPENCLAW_HOME??join(homedir(),".openclaw");if("main"===t)return join(i,"skills");const a=await e.request("agents.list",{}),s=a?.agents?.find(e=>e.id===t)?.workspace;return join(s||join(i,`workspace-${t}`),"skills")}}async function exists(e){try{return await access(e),!0}catch{return!1}}function validateSkillKey(e){if(!/^(?:@?[A-Za-z0-9][A-Za-z0-9._-]{0,63}\/)?[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e))throw new RuntimeCommandError("INVALID_PARAMS","invalid skill key");return e}function normalizeArtifactPath(e){const t=e.replaceAll("\\","/").replace(/^\.\//,"");if(!t||t.startsWith("/")||t.split("/").includes(".."))throw new RuntimeCommandError("INVALID_PARAMS",`invalid skill artifact path: ${e}`);return t}function contained(e,t){const i=resolve(e),a=resolve(i,t);if(a!==i&&!a.startsWith(`${i}${sep}`))throw new RuntimeCommandError("INVALID_PARAMS","skill path escapes workspace");return a}function isRecord(e){return null!==e&&"object"==typeof e}function nativeSkillKey(e){return"string"==typeof e.skillKey?e.skillKey:"string"==typeof e.name?e.name:""}function installedDirectoryKey(e,t){if("string"!=typeof e.filePath||!isAbsolute(e.filePath)||"SKILL.md"!==basename(e.filePath))return;const i=relative(resolve(t),dirname(e.filePath));return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(i)?i:void 0}function normalizeSkills(e,t){return(e??[]).flatMap(e=>{if(!e||"object"!=typeof e)return[];const i=e,a=installedDirectoryKey(i,t),s=a??nativeSkillKey(i);return s?[{skillKey:s,slug:a??("string"==typeof i.slug?i.slug:s),name:"string"==typeof i.name?i.name:s,description:"string"==typeof i.description?i.description:"",enabled:!0!==i.disabled,..."string"==typeof i.emoji?{emoji:i.emoji}:{},..."boolean"==typeof i.bundled?{bundled:i.bundled}:{}}]:[]})}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "beeos-claw",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.87",
|
|
4
4
|
"description": "OpenClaw plugin that bridges the BeeOS platform with the local OpenClaw Gateway, providing file transfer, ACP bridge, and observability.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "BeeOS <dev@beeos.ai>",
|
|
@@ -90,5 +90,5 @@
|
|
|
90
90
|
"brace-expansion": ">=5.0.9",
|
|
91
91
|
"@beeos-ai/beeos-types": "$@beeos-ai/beeos-types"
|
|
92
92
|
},
|
|
93
|
-
"gitHead": "
|
|
93
|
+
"gitHead": "58807754c730eb60e1c7b4278de5bc37ea6e47f1"
|
|
94
94
|
}
|