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 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; this requested-format prompt correction has not been deployed
362
- or accepted on staging yet.
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,r=this.requireGateway(),s=a.context.agent.runtimeLocalKey;if("skills.list"===a.name){const e=await r.request("skills.status",{agentId:s});return{skills:normalizeSkills(e?.skills)}}if("skills.setEnabled"===a.name){const e=a;return await r.request("skills.update",{skillKey:e.params.skillKey,enabled:e.params.enabled}),{skillKey:e.params.skillKey,enabled:e.params.enabled}}const n=await this.skillsRoot(r,s);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`),p=contained(d,`.${basename(m)}.${o.context.operationId}.backup`);await mkdir(d,{recursive:!0}),!await exists(m)&&await exists(p)&&await rename(p,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(p,{recursive:!0,force:!0}),await exists(m)&&await rename(m,p),await rename(u,m),await rm(p,{recursive:!0,force:!0})}catch(e){throw await rm(u,{recursive:!0,force:!0}).catch(()=>{}),!await exists(m)&&await exists(p)&&await rename(p,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",{}),r=a?.agents?.find(e=>e.id===t)?.workspace;return join(r||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 normalizeSkills(e){return(e??[]).flatMap(e=>{if(!e||"object"!=typeof e)return[];const t=e,i="string"==typeof t.skillKey?t.skillKey:"string"==typeof t.name?t.name:"";return i?[{skillKey:i,slug:"string"==typeof t.slug?t.slug:i,name:"string"==typeof t.name?t.name:i,description:"string"==typeof t.description?t.description:"",enabled:!0!==t.disabled,..."string"==typeof t.emoji?{emoji:t.emoji}:{},..."boolean"==typeof t.bundled?{bundled:t.bundled}:{}}]:[]})}
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.86",
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": "3b8a487596a675491eedc69cef7a871f150fe90d"
93
+ "gitHead": "58807754c730eb60e1c7b4278de5bc37ea6e47f1"
94
94
  }