@rizom/ops 0.2.0-alpha.179 → 0.2.0-alpha.180

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/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- var Jj=Object.defineProperty;var Gj=($)=>$;function zj($,v){this[$]=Gj.bind(null,v)}var dv=($,v)=>{for(var g in v)Jj($,g,{get:v[g],enumerable:!0,configurable:!0,set:zj.bind(v,g)})};import{access as oR,chmod as b4,mkdir as IW,readFile as GW,writeFile as JW}from"fs/promises";import{dirname as xR,join as i4}from"path";import{fileURLToPath as cR}from"url";var R0={name:"@rizom/ops",version:"0.2.0-alpha.179",description:"Operator CLI for managing private brain fleet registry repos",keywords:["brains","ops","cli","deploy","fleet","operator"],license:"Apache-2.0",author:"Yeehaa <yeehaa@rizom.ai> (https://rizom.ai)",bin:{"brains-ops":"./dist/brains-ops.js"},bugs:"https://github.com/rizom-ai/brains/issues",dependencies:{"age-encryption":"^0.3.0"},devDependencies:{"@brains/deploy-support":"workspace:*","@brains/eslint-config":"workspace:*","@brains/typescript-config":"workspace:*","@brains/utils":"workspace:*","@types/bun":"^1.3.14",typescript:"^7.0.2"},engines:{bun:">=1.3.3"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./deploy":{types:"./dist/deploy.d.ts",import:"./dist/deploy.js",bun:"./dist/deploy.js"}},files:["dist","templates"],homepage:"https://github.com/rizom-ai/brains/tree/main/packages/brains-ops#readme",main:"./dist/index.js",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/rizom-ai/brains.git",directory:"packages/brains-ops"},scripts:{build:"bun scripts/build.ts",lint:"eslint . --max-warnings 0","lint:fix":"eslint . --max-warnings 0 --fix",prepublishOnly:"bun scripts/build.ts",test:"bun run build && bun test --timeout 20000","test:smoke":"bun run build && RUN_SMOKE_TESTS=1 bun test --timeout 60000",typecheck:"tsc --noEmit"},type:"module",types:"./dist/index.d.ts"};var aw=`ARG BUN_VERSION=1.3.10
2
+ var Jj=Object.defineProperty;var Gj=($)=>$;function zj($,v){this[$]=Gj.bind(null,v)}var dv=($,v)=>{for(var g in v)Jj($,g,{get:v[g],enumerable:!0,configurable:!0,set:zj.bind(v,g)})};import{access as oR,chmod as b4,mkdir as IW,readFile as GW,writeFile as JW}from"fs/promises";import{dirname as xR,join as i4}from"path";import{fileURLToPath as cR}from"url";var R0={name:"@rizom/ops",version:"0.2.0-alpha.180",description:"Operator CLI for managing private brain fleet registry repos",keywords:["brains","ops","cli","deploy","fleet","operator"],license:"Apache-2.0",author:"Yeehaa <yeehaa@rizom.ai> (https://rizom.ai)",bin:{"brains-ops":"./dist/brains-ops.js"},bugs:"https://github.com/rizom-ai/brains/issues",dependencies:{"age-encryption":"^0.3.0"},devDependencies:{"@brains/deploy-support":"workspace:*","@brains/eslint-config":"workspace:*","@brains/typescript-config":"workspace:*","@brains/utils":"workspace:*","@types/bun":"^1.3.14",typescript:"^7.0.2"},engines:{bun:">=1.3.3"},exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js"},"./deploy":{types:"./dist/deploy.d.ts",import:"./dist/deploy.js",bun:"./dist/deploy.js"}},files:["dist","templates"],homepage:"https://github.com/rizom-ai/brains/tree/main/packages/brains-ops#readme",main:"./dist/index.js",publishConfig:{access:"public"},repository:{type:"git",url:"https://github.com/rizom-ai/brains.git",directory:"packages/brains-ops"},scripts:{build:"bun scripts/build.ts",lint:"eslint . --max-warnings 0","lint:fix":"eslint . --max-warnings 0 --fix",prepublishOnly:"bun scripts/build.ts",test:"bun run build && bun test --timeout 20000","test:smoke":"bun run build && RUN_SMOKE_TESTS=1 bun test --timeout 60000",typecheck:"tsc --noEmit"},type:"module",types:"./dist/index.d.ts"};var aw=`ARG BUN_VERSION=1.3.10
3
3
  FROM oven/bun:\${BUN_VERSION}-slim AS runtime
4
4
 
5
5
  WORKDIR /app
@@ -252,7 +252,7 @@ volumes:
252
252
  .brains-ops/
253
253
  users/*.secrets.yaml
254
254
  `;if($==="deploy/Dockerfile")return vN();if($==="deploy/kamal/deploy.yml")return K0({serviceName:"rover"});if($===".kamal/hooks/pre-deploy")return Qz({deployConfigPath:"deploy/kamal/deploy.yml",brainYamlPath:"${BRAIN_YAML_PATH:-brain.yaml}"});let v=i4(yR,$),g=await GW(v,"utf8");return r7(g)}function r7($){return $.replaceAll("__BRAINS_OPS_VERSION__",R0.version).replaceAll("__BUN_VERSION__",Bun.version)}function g7($,v){return typeof $==="object"&&$!==null&&"code"in $&&$.code===v}import{createHash as I7}from"crypto";import{spawn as U7}from"child_process";var wv=async($,v,g={})=>new Promise((U,r)=>{let I=U7($,v,{stdio:["pipe","inherit","inherit"],env:g.env?{...process.env,...g.env}:process.env,cwd:g.cwd});if(I.on("error",r),I.on("close",(J)=>{if(J===0){U();return}r(Error(`${$} ${v.join(" ")} exited with code ${J??1}`))}),g.stdin)I.stdin.end(g.stdin);else I.stdin.end()});function x4($,v){let g=[...new Set(v.map((r)=>r.trim()).filter(Boolean))].sort();if(g.length===0)return`brain-${$}`;let U=I7("sha256").update(g.join(`
255
- `)).digest("hex").slice(0,12);return`brain-${$}-sites-${U}`}function zW($){if(!$)return[];return[`${$.package}@${$.version}`,...$.theme?.startsWith("@rizom/")?[`${$.theme}@${$.version}`]:[]]}function OW($){let v=new Map;for(let g of $){let U=[...new Set(zW(g.siteOverride))].sort(),r=x4(g.brainVersion,U);v.set(r,{tag:r,brainVersion:g.brainVersion,sitePackages:U})}return[...v.values()].sort((g,U)=>g.tag.localeCompare(U.tag))}async function DW($){let v=$.brainVersionInput?.trim()??"";if(v){let U=($.sitePackagesInput??"").split(/\s+/).filter(Boolean);return[{tag:x4(v,U),brainVersion:v,sitePackages:U}]}let g=[];for(let U of OW($.users))if(!await $.imageExists(U.tag))g.push(U);return g}async function J7($){let v=$.env??process.env,g=$.runCommand??wv,U=$.log??console.log,r=v.BRAIN_VERSION_INPUT?.trim()??"",I=v.SITE_PACKAGES_INPUT?.trim()??"",J=r?[]:(await Tv($.rootDir)).users,G=await DW({users:J,brainVersionInput:r,sitePackagesInput:I,imageExists:async(z)=>{try{return await g("docker",["manifest","inspect",`${$.imageRepository}:${z}`]),!0}catch{return!1}}});for(let z of G)U(`build needed: ${z.tag} (brain ${z.brainVersion}${z.sitePackages.length>0?`, sites ${z.sitePackages.join(" ")}`:""})`);if(G.length===0)U("All declared images already exist; nothing to build.");return $.writeOutput("images_json",JSON.stringify(G.map((z)=>({tag:z.tag,brain_version:z.brainVersion,site_packages:z.sitePackages.join(" ")})))),G}import{mkdir as H7,writeFile as P7}from"fs/promises";import{dirname as k7,join as ZW}from"path";import{mkdtemp as G7,mkdir as z7,readFile as O7,rm as D7,writeFile as Q7}from"fs/promises";import{tmpdir as X7}from"os";import{dirname as w7,join as NW}from"path";function c4($,v){let g=$.indexOf("/");if(g===-1)return{org:v,name:$};return{org:$.slice(0,g),name:$.slice(g+1)}}function QW($,v){let{org:g,name:U}=c4($,v);return`${g}/${U}`}var N7=["name: Your Name Here","Delete this and write your own"];async function YW($,v,g,U,r={}){if(U.length===0)return;let I=r.env??process.env,J=bv($),G=XW(I,J,g.effectiveGitSyncToken),z=r.contentRepoAdminTokenSelector?XW(I,J,r.contentRepoAdminTokenSelector):void 0,O=c4(g.contentRepo,v),Q=r.contentRepoRemoteResolver?.(g,v,G)??W7(O,G);if(!Q)return;let X=await G7(NW(X7(),`brains-ops-content-sync-${g.handle}-`)),N=r.runCommand??wv,w=r.fetchImpl??fetch;try{if(!r.contentRepoRemoteResolver){if(!z)throw Error(`${r.contentRepoAdminTokenSelector??"CONTENT_REPO_ADMIN_TOKEN"} is required to check or create content repos`);await V7(O,z,w)}await N("git",["clone",Q,X]),await Z7(X,N),await N("git",["config","user.name","brains-ops[bot]"],{cwd:X}),await N("git",["config","user.email","41898282+github-actions[bot]@users.noreply.github.com"],{cwd:X});let q=!1;for(let Z of U)if(await Y7(X,Z))q=!0;if(!q)return;await N("git",["add","."],{cwd:X}),await N("git",["commit","-m",`chore(content): seed ${g.handle} anchor profile`],{cwd:X}),await N("git",["push","origin","HEAD:main"],{cwd:X})}finally{await D7(X,{recursive:!0,force:!0})}}async function Y7($,v){let g=NW($,v.path),U=await O7(g,"utf8").catch(()=>{return});if(U===v.content)return!1;if(U!==void 0&&!q7(U))return!1;return await z7(w7(g),{recursive:!0}),await Q7(g,v.content),!0}function q7($){return N7.some((v)=>$.includes(v))}function XW($,v,g){return i$(g,$,v)}function W7($,v){if(!v)return;return`https://x-access-token:${encodeURIComponent(v)}@github.com/${$.org}/${$.name}.git`}async function V7($,v,g){let{org:U,name:r}=$,J=`https://api.github.com/repos/${`${encodeURIComponent(U)}/${encodeURIComponent(r)}`}`,G={Accept:"application/vnd.github+json",Authorization:`Bearer ${v}`,"User-Agent":"brains-ops","X-GitHub-Api-Version":"2022-11-28"},z=await g(J,{headers:G});if(z.ok)return;if(z.status!==404)throw Error(`Failed to check GitHub repo ${U}/${r}: ${z.status} ${await wW(z)}`);let O=await g(`https://api.github.com/orgs/${encodeURIComponent(U)}/repos`,{method:"POST",headers:G,body:JSON.stringify({name:r,private:!0,auto_init:!1})});if(O.ok){console.log(`Created missing content repo ${U}/${r}`);return}if(O.status===422){if((await g(J,{headers:G})).ok)return}throw Error(`Failed to create GitHub repo ${U}/${r}: ${O.status} ${await wW(O)}`)}async function wW($){let v=await $.text();return v.trim().length===0?$.statusText:v}async function Z7($,v){try{await v("git",["checkout","-B","main","origin/main"],{cwd:$})}catch{await v("git",["checkout","-B","main"],{cwd:$})}}function WW($){return async(v)=>({brainYaml:j7(v,$),envFile:A7(v,$),contentRepoFiles:S7(v)})}function j7($,v){let g=[`brain: ${$.model}`,`domain: ${$.domain}`,`preset: ${$.preset}`,...M7($),...u7($),"",K7($),"","plugins:",...$.setup?.delivery==="email"?[" auth-service:",...R7($.setup.email)]:[],...$.playbooks?.onboarding?[" rover-onboarding:"," enabled: true"]:[]," directory-sync:"," git:",` repo: ${VW($,v)}`," authToken: ${GIT_SYNC_TOKEN}",...$.atproto?[" atproto:",` identifier: ${$.atproto.identifier}`," appPassword: ${ATPROTO_APP_PASSWORD}"]:[]];if($.discordEnabled)g.push(" discord:"),g.push(" botToken: ${DISCORD_BOT_TOKEN}");if($.setup?.delivery==="email")g.push(" email-resend:"),g.push(" apiKey: ${SETUP_EMAIL_API_KEY}"),g.push(" from: ${SETUP_EMAIL_FROM}");return g.push(""),g.join(`
255
+ `)).digest("hex").slice(0,12);return`brain-${$}-sites-${U}`}function zW($){if(!$)return[];return[`${$.package}@${$.version}`,...$.theme?.startsWith("@rizom/")?[`${$.theme}@${$.version}`]:[]]}function OW($){let v=new Map;for(let g of $){let U=[...new Set(zW(g.siteOverride))].sort(),r=x4(g.brainVersion,U);v.set(r,{tag:r,brainVersion:g.brainVersion,sitePackages:U})}return[...v.values()].sort((g,U)=>g.tag.localeCompare(U.tag))}async function DW($){let v=$.brainVersionInput?.trim()??"";if(v){let U=($.sitePackagesInput??"").split(/\s+/).filter(Boolean);return[{tag:x4(v,U),brainVersion:v,sitePackages:U}]}let g=[];for(let U of OW($.users))if(!await $.imageExists(U.tag))g.push(U);return g}async function J7($){let v=$.env??process.env,g=$.runCommand??wv,U=$.log??console.log,r=v.BRAIN_VERSION_INPUT?.trim()??"",I=v.SITE_PACKAGES_INPUT?.trim()??"",J=r?[]:(await Tv($.rootDir)).users,G=await DW({users:J,brainVersionInput:r,sitePackagesInput:I,imageExists:async(z)=>{try{return await g("docker",["manifest","inspect",`${$.imageRepository}:${z}`]),!0}catch{return!1}}});for(let z of G)U(`build needed: ${z.tag} (brain ${z.brainVersion}${z.sitePackages.length>0?`, sites ${z.sitePackages.join(" ")}`:""})`);if(G.length===0)U("All declared images already exist; nothing to build.");return $.writeOutput("images_json",JSON.stringify(G.map((z)=>({tag:z.tag,brain_version:z.brainVersion,site_packages:z.sitePackages.join(" ")})))),G}import{mkdir as H7,writeFile as P7}from"fs/promises";import{dirname as k7,join as ZW}from"path";import{mkdtemp as G7,mkdir as z7,readFile as O7,rm as D7,writeFile as Q7}from"fs/promises";import{tmpdir as X7}from"os";import{dirname as w7,join as NW}from"path";function c4($,v){let g=$.indexOf("/");if(g===-1)return{org:v,name:$};return{org:$.slice(0,g),name:$.slice(g+1)}}function QW($,v){let{org:g,name:U}=c4($,v);return`${g}/${U}`}var N7=["name: Your Name Here","Delete this and write your own"];async function YW($,v,g,U,r={}){if(U.length===0)return;let I=r.env??process.env,J=bv($),G=XW(I,J,g.effectiveGitSyncToken),z=r.contentRepoAdminTokenSelector?XW(I,J,r.contentRepoAdminTokenSelector):void 0,O=c4(g.contentRepo,v),Q=r.contentRepoRemoteResolver?.(g,v,G)??W7(O,G);if(!Q)return;let X=await G7(NW(X7(),`brains-ops-content-sync-${g.handle}-`)),N=r.runCommand??wv,w=r.fetchImpl??fetch;try{if(!r.contentRepoRemoteResolver){if(!z)throw Error(`${r.contentRepoAdminTokenSelector??"CONTENT_REPO_ADMIN_TOKEN"} is required to check or create content repos`);await V7(O,z,w)}await N("git",["clone",Q,X]),await Z7(X,N),await N("git",["config","user.name","brains-ops[bot]"],{cwd:X}),await N("git",["config","user.email","41898282+github-actions[bot]@users.noreply.github.com"],{cwd:X});let q=!1;for(let Z of U)if(await Y7(X,Z))q=!0;if(!q)return;await N("git",["add","."],{cwd:X}),await N("git",["commit","-m",`chore(content): seed ${g.handle} anchor profile`],{cwd:X}),await N("git",["push","origin","HEAD:main"],{cwd:X})}finally{await D7(X,{recursive:!0,force:!0})}}async function Y7($,v){let g=NW($,v.path),U=await O7(g,"utf8").catch(()=>{return});if(U===v.content)return!1;if(U!==void 0&&!q7(U))return!1;return await z7(w7(g),{recursive:!0}),await Q7(g,v.content),!0}function q7($){return N7.some((v)=>$.includes(v))}function XW($,v,g){return i$(g,$,v)}function W7($,v){if(!v)return;return`https://x-access-token:${encodeURIComponent(v)}@github.com/${$.org}/${$.name}.git`}async function V7($,v,g){let{org:U,name:r}=$,J=`https://api.github.com/repos/${`${encodeURIComponent(U)}/${encodeURIComponent(r)}`}`,G={Accept:"application/vnd.github+json",Authorization:`Bearer ${v}`,"User-Agent":"brains-ops","X-GitHub-Api-Version":"2022-11-28"},z=await g(J,{headers:G});if(z.ok)return;if(z.status!==404)throw Error(`Failed to check GitHub repo ${U}/${r}: ${z.status} ${await wW(z)}`);let O=await g(`https://api.github.com/orgs/${encodeURIComponent(U)}/repos`,{method:"POST",headers:G,body:JSON.stringify({name:r,private:!0,auto_init:!1})});if(O.ok){console.log(`Created missing content repo ${U}/${r}`);return}if(O.status===422){if((await g(J,{headers:G})).ok)return}throw Error(`Failed to create GitHub repo ${U}/${r}: ${O.status} ${await wW(O)}`)}async function wW($){let v=await $.text();return v.trim().length===0?$.statusText:v}async function Z7($,v){try{await v("git",["checkout","-B","main","origin/main"],{cwd:$})}catch{await v("git",["checkout","-B","main"],{cwd:$})}}function WW($){return async(v)=>({brainYaml:j7(v,$),envFile:A7(v,$),contentRepoFiles:S7(v)})}function j7($,v){let g=[`brain: ${$.model}`,`domain: ${$.domain}`,`preset: ${$.preset}`,...M7($),...u7($),"",K7($),"","plugins:",...$.setup?.delivery==="email"?[" auth-service:",...R7($.setup.email)," notifications:"," defaultRecipient:"," type: email",` address: ${$.setup.email}`]:[],...$.playbooks?.onboarding?[" rover-onboarding:"," enabled: true"]:[]," directory-sync:"," git:",` repo: ${VW($,v)}`," authToken: ${GIT_SYNC_TOKEN}",...$.atproto?[" atproto:",` identifier: ${$.atproto.identifier}`," appPassword: ${ATPROTO_APP_PASSWORD}"]:[]];if($.discordEnabled)g.push(" discord:"),g.push(" botToken: ${DISCORD_BOT_TOKEN}");if($.setup?.delivery==="email")g.push(" email-resend:"),g.push(" apiKey: ${SETUP_EMAIL_API_KEY}"),g.push(" from: ${SETUP_EMAIL_FROM}");return g.push(""),g.join(`
256
256
  `)}function M7($){if(!$.addOverride||$.addOverride.length===0)return[];return["","add:",...$.addOverride.map((v)=>` - ${v}`)]}function u7($){if(!$.siteOverride)return[];return["","site:",` package: ${qW($.siteOverride.package)}`,...$.siteOverride.theme?[` theme: ${qW($.siteOverride.theme)}`]:[]]}function qW($){return JSON.stringify($)}function VW($,v){return QW($.contentRepo,v)}function R7($){return[" setupEmail:",` to: ${$}`," subject: Welcome to Rover \u2014 set up your passkey"," body: |"," Hi,",""," Your Rover is ready.",""," Rover is your own AI \u2014 a private assistant deployed just for you, that holds your notes, links, and ideas, and gets more useful the more you put into it.",""," Set up your passkey:"," {{setupUrl}}",""," This link is single-use. Do not forward it."," It expires at {{expiresAt}}.",""," After setup, open your chat and say hello:"," {{origin}}/chat",""," Sign in with the passkey you just registered. The chat in your browser is where you and Rover will spend most of your time.",""," The onboarding guide shows the way of working \u2014 capture, ask back, shape:"," https://github.com/rizom-ai/brains/blob/main/packages/brains-ops/templates/rover-pilot/docs/user-onboarding.md",""," If this link is expired, does not work, or you did not expect this email, reply to your Rover operator and we will help."]}function K7($){if($.discordEnabled&&$.discordAnchorUserId)return`anchors: ["discord:${$.discordAnchorUserId}"]`;return"anchors: []"}function S7($){return[{path:"anchor-profile/anchor-profile.md",content:T7($)}]}function T7($){let v={kind:"professional",name:$.anchorProfile.name,...$.anchorProfile.description?{description:$.anchorProfile.description}:{},...$.anchorProfile.website?{website:$.anchorProfile.website}:{},...$.anchorProfile.email?{email:$.anchorProfile.email}:{},...$.anchorProfile.socialLinks?{socialLinks:$.anchorProfile.socialLinks}:{}},g=$.anchorProfile.story??"This profile was initialized by brains-ops. Edit it in your content repo.";return`---
257
257
  ${T0(v).trimEnd()}
258
258
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rizom/ops",
3
- "version": "0.2.0-alpha.179",
3
+ "version": "0.2.0-alpha.180",
4
4
  "description": "Operator CLI for managing private brain fleet registry repos",
5
5
  "keywords": [
6
6
  "brains",