@halcyonlabs/app 0.47.0-halcyon.381 → 0.47.0-halcyon.382
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.d.ts +12 -12
- package/package.json +2 -2
- package/server/dist/builtin-plugins/orbit/dist/assets/moonlet/fixed-runner/linux-x64/manifest.json +5 -5
- package/server/dist/builtin-plugins/orbit/dist/assets/moonlet/fixed-runner/linux-x64/orbit-deploy +0 -0
- package/server/dist/builtin-plugins/orbit/dist/assets/moonlet/revision +1 -1
- package/server/dist/builtin-plugins/orbit/dist/server.js +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -191,10 +191,10 @@ declare const uiPreferenceDefinitions: {
|
|
|
191
191
|
}>>;
|
|
192
192
|
readonly "sidebar.threadGrouping.environment": UiPreferenceDefinition<z$1.ZodUnion<readonly [z$1.ZodLiteral<"auto">, z$1.ZodBoolean]>>;
|
|
193
193
|
readonly "sidebar.chronologicalSort": UiPreferenceDefinition<z$1.ZodEnum<{
|
|
194
|
+
none: "none";
|
|
194
195
|
updated: "updated";
|
|
195
196
|
created: "created";
|
|
196
197
|
alpha: "alpha";
|
|
197
|
-
none: "none";
|
|
198
198
|
}>>;
|
|
199
199
|
readonly "sidebar.sortDirection": UiPreferenceDefinition<z$1.ZodEnum<{
|
|
200
200
|
default: "default";
|
|
@@ -5766,9 +5766,9 @@ declare const hostDaemonCommandRegistry: {
|
|
|
5766
5766
|
}, z$1.core.$strict>, z$1.ZodDiscriminatedUnion<[z$1.ZodObject<{
|
|
5767
5767
|
kind: z$1.ZodLiteral<"wording">;
|
|
5768
5768
|
status: z$1.ZodEnum<{
|
|
5769
|
-
unavailable: "unavailable";
|
|
5770
5769
|
pass: "pass";
|
|
5771
5770
|
revise: "revise";
|
|
5771
|
+
unavailable: "unavailable";
|
|
5772
5772
|
}>;
|
|
5773
5773
|
}, z$1.core.$strict>, z$1.ZodObject<{
|
|
5774
5774
|
kind: z$1.ZodLiteral<"review">;
|
|
@@ -6129,8 +6129,8 @@ declare const hostDaemonCommandRegistry: {
|
|
|
6129
6129
|
skillFilePath: z$1.ZodString;
|
|
6130
6130
|
}, z$1.core.$strict>], "kind">>;
|
|
6131
6131
|
instructionMode: z$1.ZodEnum<{
|
|
6132
|
-
replace: "replace";
|
|
6133
6132
|
append: "append";
|
|
6133
|
+
replace: "replace";
|
|
6134
6134
|
}>;
|
|
6135
6135
|
type: z$1.ZodLiteral<"thread.rewind.prepare">;
|
|
6136
6136
|
leaseId: z$1.ZodString;
|
|
@@ -6278,8 +6278,8 @@ declare const hostDaemonCommandRegistry: {
|
|
|
6278
6278
|
skillFilePath: z$1.ZodString;
|
|
6279
6279
|
}, z$1.core.$strict>], "kind">>;
|
|
6280
6280
|
instructionMode: z$1.ZodEnum<{
|
|
6281
|
-
replace: "replace";
|
|
6282
6281
|
append: "append";
|
|
6282
|
+
replace: "replace";
|
|
6283
6283
|
}>;
|
|
6284
6284
|
type: z$1.ZodLiteral<"thread.start">;
|
|
6285
6285
|
requestId: z$1.ZodString;
|
|
@@ -6742,8 +6742,8 @@ declare const hostDaemonCommandRegistry: {
|
|
|
6742
6742
|
envPassthrough: z$1.ZodArray<z$1.ZodString>;
|
|
6743
6743
|
}, z$1.core.$strict>;
|
|
6744
6744
|
instructionMode: z$1.ZodEnum<{
|
|
6745
|
-
replace: "replace";
|
|
6746
6745
|
append: "append";
|
|
6746
|
+
replace: "replace";
|
|
6747
6747
|
}>;
|
|
6748
6748
|
projectId: z$1.ZodString;
|
|
6749
6749
|
providerId: z$1.ZodString;
|
|
@@ -6958,8 +6958,8 @@ declare const hostDaemonCommandRegistry: {
|
|
|
6958
6958
|
envPassthrough: z$1.ZodArray<z$1.ZodString>;
|
|
6959
6959
|
}, z$1.core.$strict>;
|
|
6960
6960
|
instructionMode: z$1.ZodEnum<{
|
|
6961
|
-
replace: "replace";
|
|
6962
6961
|
append: "append";
|
|
6962
|
+
replace: "replace";
|
|
6963
6963
|
}>;
|
|
6964
6964
|
projectId: z$1.ZodString;
|
|
6965
6965
|
providerId: z$1.ZodString;
|
|
@@ -7865,9 +7865,9 @@ declare const hostDaemonCommandRegistry: {
|
|
|
7865
7865
|
base64: "base64";
|
|
7866
7866
|
utf8: "utf8";
|
|
7867
7867
|
}>;
|
|
7868
|
-
sha256: z$1.ZodString;
|
|
7869
|
-
sizeBytes: z$1.ZodNumber;
|
|
7870
7868
|
mimeType: z$1.ZodOptional<z$1.ZodString>;
|
|
7869
|
+
sizeBytes: z$1.ZodNumber;
|
|
7870
|
+
sha256: z$1.ZodString;
|
|
7871
7871
|
modifiedAtMs: z$1.ZodOptional<z$1.ZodNumber>;
|
|
7872
7872
|
notModified: z$1.ZodLiteral<true>;
|
|
7873
7873
|
}, z$1.core.$strip>]>, "onlineRpc", true>;
|
|
@@ -8132,10 +8132,10 @@ declare const hostDaemonCommandRegistry: {
|
|
|
8132
8132
|
health: z$1.ZodObject<{
|
|
8133
8133
|
status: z$1.ZodEnum<{
|
|
8134
8134
|
unknown: "unknown";
|
|
8135
|
-
ready: "ready";
|
|
8136
8135
|
not_installed: "not_installed";
|
|
8137
8136
|
unauthenticated: "unauthenticated";
|
|
8138
8137
|
expired: "expired";
|
|
8138
|
+
ready: "ready";
|
|
8139
8139
|
unsupported_version: "unsupported_version";
|
|
8140
8140
|
}>;
|
|
8141
8141
|
statusMessage: z$1.ZodNullable<z$1.ZodString>;
|
|
@@ -8183,9 +8183,9 @@ declare const hostDaemonCommandRegistry: {
|
|
|
8183
8183
|
executablePath: z$1.ZodNullable<z$1.ZodString>;
|
|
8184
8184
|
installed: z$1.ZodBoolean;
|
|
8185
8185
|
installSource: z$1.ZodEnum<{
|
|
8186
|
+
external: "external";
|
|
8186
8187
|
notInstalled: "notInstalled";
|
|
8187
8188
|
npmGlobal: "npmGlobal";
|
|
8188
|
-
external: "external";
|
|
8189
8189
|
}>;
|
|
8190
8190
|
currentVersion: z$1.ZodNullable<z$1.ZodString>;
|
|
8191
8191
|
latestVersion: z$1.ZodNullable<z$1.ZodString>;
|
|
@@ -8631,8 +8631,8 @@ declare const hostDaemonCommandRegistry: {
|
|
|
8631
8631
|
message: z$1.ZodNullable<z$1.ZodString>;
|
|
8632
8632
|
state: z$1.ZodNullable<z$1.ZodEnum<{
|
|
8633
8633
|
pending: "pending";
|
|
8634
|
-
activating: "activating";
|
|
8635
8634
|
ready: "ready";
|
|
8635
|
+
activating: "activating";
|
|
8636
8636
|
}>>;
|
|
8637
8637
|
}, z$1.core.$strict>, "onlineRpc", true>;
|
|
8638
8638
|
"server_move.prepare": HostDaemonCommandDescriptor<"server_move.prepare", z$1.ZodObject<{
|
|
@@ -8734,9 +8734,9 @@ declare const providerCliStatusResponseSchema: z$1.ZodRecord<z$1.ZodString, z$1.
|
|
|
8734
8734
|
executablePath: z$1.ZodNullable<z$1.ZodString>;
|
|
8735
8735
|
installed: z$1.ZodBoolean;
|
|
8736
8736
|
installSource: z$1.ZodEnum<{
|
|
8737
|
+
external: "external";
|
|
8737
8738
|
notInstalled: "notInstalled";
|
|
8738
8739
|
npmGlobal: "npmGlobal";
|
|
8739
|
-
external: "external";
|
|
8740
8740
|
}>;
|
|
8741
8741
|
currentVersion: z$1.ZodNullable<z$1.ZodString>;
|
|
8742
8742
|
latestVersion: z$1.ZodNullable<z$1.ZodString>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@halcyonlabs/app",
|
|
3
|
-
"version": "0.47.0-halcyon.
|
|
3
|
+
"version": "0.47.0-halcyon.382",
|
|
4
4
|
"description": "bb app launcher for npx",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"bb",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"node": "^22.19.0 || ^24.0.0 || ^26.0.0"
|
|
106
106
|
},
|
|
107
107
|
"moonletRelease": {
|
|
108
|
-
"summary": "
|
|
108
|
+
"summary": "Core change: repair launcher commands without trusting unmapped owners (#393)"
|
|
109
109
|
},
|
|
110
110
|
"license": "SEE LICENSE IN LICENSE"
|
|
111
111
|
}
|
package/server/dist/builtin-plugins/orbit/dist/assets/moonlet/fixed-runner/linux-x64/manifest.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
|
-
"commit": "
|
|
2
|
+
"commit": "29e69ee44df0f022c80e31f41b68973ade4c1062",
|
|
3
3
|
"file": "orbit-deploy",
|
|
4
4
|
"platform": "linux-x64",
|
|
5
5
|
"provenance": {
|
|
6
|
-
"artifactId":
|
|
7
|
-
"artifactName": "linux-bundle-
|
|
6
|
+
"artifactId": 14054875739,
|
|
7
|
+
"artifactName": "linux-bundle-29e69ee44df0f022c80e31f41b68973ade4c1062",
|
|
8
8
|
"repository": "matt0x6F/personalassistant",
|
|
9
|
-
"runId":
|
|
9
|
+
"runId": 43453638065,
|
|
10
10
|
"workflow": ".github/workflows/moonlet-linux-bundle.yml"
|
|
11
11
|
},
|
|
12
12
|
"schema": 1,
|
|
13
|
-
"sha256": "
|
|
13
|
+
"sha256": "a483741d1a65be7728167eadea192791c2bcdb9258a05eb7f9f7abe4b73c87f7",
|
|
14
14
|
"size": 3175136
|
|
15
15
|
}
|
package/server/dist/builtin-plugins/orbit/dist/assets/moonlet/fixed-runner/linux-x64/orbit-deploy
CHANGED
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
29e69ee44df0f022c80e31f41b68973ade4c1062
|
|
@@ -598,7 +598,7 @@ ${o?`(umask 077; printf '%s firewall-dns-refresh applied sha256=${o}
|
|
|
598
598
|
`)}
|
|
599
599
|
`}function Ioe(e,t,r){return`# Rendered from policy.toml by the host; changes here don't last.
|
|
600
600
|
`+ms({client_user:t,vault:e.vault,capability:e.capability.map(({reach:s,...o})=>{let a=r.get(o.name);return{...o,ports:a?.ports??[],...a?.address?{address:a.address}:{}}}),login:e.login,...e.deploy?{deploy:e.deploy}:{},...e.builder?{builder:e.builder}:{},...e.secret_use?{secret_use:e.secret_use}:{},...e.connector.length?{connector:e.connector}:{}})+`
|
|
601
|
-
`}async function Roe(e){return ds(Hc(e)?await goe(e,"utf8"):"",e)}function ds(e,t="policy"){let r;try{r=wi(e)}catch{throw new Hn(`${t}: invalid policy TOML (file contents withheld)`)}let n=$oe.safeParse(r);if(!n.success)throw new Hn(`${t}: ${n.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join("; ")}`);return n.data}var WP,yoe,woe,voe,F4,H4,boe,aw,_oe,koe,zP,Eoe,Soe,Toe,W4,G4,Aoe,xoe,Ooe,$oe,Hn,Hs=Bt(()=>{"use strict";hv();zc();iw();l4();g0();RP();y0();A4();$4();Pf();BP();q4();RP();WP=je.string().regex(/^[A-Za-z0-9.-]+(\/\d{1,2})?(:\d{1,5})?$/,'a host or address, optionally with /prefix and :port, like "10.0.0.5:6443"'),yoe=je.object({level:je.enum(["internet","allowlist","open"]).default("allowlist"),allow:je.array(WP).default([])}).strict().refine(e=>e.level==="allowlist"||e.allow.length===0,{message:'`allow` only applies to level = "allowlist"'}),woe=je.enum(["read","act","never"]),voe=/^(LD_|DYLD_|GIT_|GH_|NODE_|PYTHON|PERL5|RUBY)|^(BASH_ENV|ENV)$/,F4=1024,H4=je.record(je.string().regex(/^[A-Z][A-Z0-9_]*$/,"an upper-case name").refine(e=>!["PATH","HOME","ORBIT_EXCHANGE"].includes(e)&&!voe.test(e),"a name the broker or git sets, or one that loads code"),je.string().refine(e=>Buffer.byteLength(e,"utf8")<=F4,`up to ${F4} bytes`).regex(/^[^\p{Cc}]*$/u,"one line, no control characters")).default({}),boe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like kube"),kind:je.enum(["cli","ssh"]),program:je.string().min(1).optional(),host:je.string().regex(/^[A-Za-z0-9.-]+$/).optional(),user:je.string().regex(/^[A-Za-z0-9._-]+$/).optional(),host_key:je.string().regex(/^(ssh-ed25519|ecdsa-sha2-nistp(256|384|521)|ssh-rsa) [A-Za-z0-9+/=]{16,}$/,'a public key, like "ssh-ed25519 AAAA\u2026"').optional(),secret:je.object({item:je.string().min(1),field:je.string().min(1),as:je.string().regex(/^(file:[A-Z_][A-Z0-9_]*|ssh-key)$/),orbit_made:je.boolean().optional()}).strict(),read:je.array(je.string()).default([]),act:je.array(je.string()).default([]),never:je.array(je.string()).default([]),default:woe.default("act"),value_flags:je.array(je.string()).default([]),forbid_flags:je.array(je.string().regex(/^-/)).default([]),reach:je.array(WP.regex(/:\d+$/,'a capability destination needs a port, like "10.0.0.5:6443"')).default([]),allow_urls:je.boolean().default(!1),exchange:je.boolean().default(!1),env:H4}).strict().refine(e=>e.name!=="github"||m0(e.env),{message:"ORBIT_GITHUB_AUTO_APPROVE must list watched repositories with valid authors and protected_paths"}).refine(e=>e.name!=="github"||m0(e.env,"ORBIT_GITHUB_AUTO_MERGE"),{message:"ORBIT_GITHUB_AUTO_MERGE must list watched repositories with valid authors and protected_paths"}).refine(e=>e.kind==="cli"?!!e.program&&e.secret.as.startsWith("file:"):!!e.host&&!!e.user&&!!e.host_key&&e.secret.as==="ssh-key",{message:'cli needs `program` and secret as "file:VAR"; ssh needs `host`, `user`, `host_key` and secret as "ssh-key"'}).refine(e=>Object.keys(e.env).length===0||e.kind==="cli"&&!(e.secret.as.slice(5)in e.env),{message:"env is for a cli program's settings, and can't be its secret's variable"}),aw=je.string().min(1).regex(/^[^/?]+$/,'a 1Password name, without "/" or "?"'),_oe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like proton"),item:aw,bridge:je.boolean().default(!1),unit:je.string().regex(/^[A-Za-z0-9@._-]+$/,"a systemd unit name, like orbit-app-proton-mail").optional(),url:je.string().regex(/^https:\/\/[A-Za-z0-9.-]+(:\d+)?\/[^\s?#]*$/,`the sign-in page's https address, without a query, like "https://account.proton.me/mail"`).optional(),app:je.string().regex(/^[A-Za-z0-9.-]+$/,"a bundle id, like ch.protonmail.desktop").optional(),username:aw.default("username"),password:aw.default("password"),otp:aw.optional(),mailbox_password:aw.optional()}).strict().refine(e=>e.bridge?!e.unit&&!e.url&&!e.app:!!e.unit&&!!e.url&&!e.mailbox_password,{message:"a login is an app's (unit and url) or Bridge's (bridge = true, with no unit, url or app; a mailbox_password only here)"}),koe=je.object({name:je.string().min(1).regex(/^[^\u0000-\u001f\u007f]+$/,"the bb machine's name, as bb shows it"),folder:je.string().regex(/^\/[^\0\n]*$/,"an absolute path on that machine")}).strict(),zP=["python*","pypy*","node","nodejs","bun","perl*","ruby*","php*","lua*","java","osascript","sh","bash","dash","zsh","ksh","fish","env","npx","npm","pnpm","yarn","uv","uvx","pipx","busybox","tclsh*"],Eoe=new RegExp(`(^|/)(${zP.map(e=>e.replace("*",".*")).join("|")})$`),Soe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like notes"),kind:je.enum(["local"]).default("local"),command:je.string().regex(/^\/[^\0\n]+$/,"an absolute path on the station, like /usr/local/lib/notes-mcp/server").refine(e=>!Eoe.test(e),"the server itself, not an interpreter (install a script server as its own executable)"),args:je.array(je.string().max(1024).regex(/^[^\p{Cc}]*$/u,"one line, no control characters")).default([]),env:H4,description:je.string().min(1).max(300).regex(/^[^\p{Cc}]*$/u,"one line, no control characters"),os:je.enum(["macos","linux"]).optional(),reach:je.array(WP).default([])}).strict(),Toe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like dossier"),description:je.string().min(1).max(300).regex(/^[^\p{Cc}]*$/u,"one line, no control characters"),os:je.enum(["macos","linux"]).optional()}).strict(),W4=/^[a-z][a-z0-9_]*$/;i(z4,"libraryOptionRefused");G4=je.object({type:je.enum(ow,{message:`one of rclone's remote backends: ${ow.join(", ")}`}),path:je.string().min(1).max(500).regex(/^[^\0\r\n]*$/,"one line"),options:je.record(je.string(),je.string().max(2e3).regex(/^[^\r\n]*$/,"one line")).default({}).superRefine((e,t)=>{for(let r of Object.keys(e)){let n=z4(r);n&&t.addIssue({code:"custom",message:n})}}),item:je.string().min(1).max(200).regex(/^[^\p{Cc}]*$/u,"one line").optional()}).strict(),Aoe=je.string().regex(/^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/,"a GitHub login, like octocat"),xoe=je.object({repo:je.string().regex(/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/,"owner/name").refine(e=>![".",".."].includes(e.split("/")[1]),"owner/name"),approvers:je.array(Aoe).min(1,"one GitHub login or more")}).strict(),Ooe=G4.extend({recipient:je.string().max(2e4).regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----\r?\n[\s\S]+\r?\n-----END PGP PUBLIC KEY BLOCK-----\s*$/,"the owner's OpenPGP public key, armored (gpg --armor --export <you>)")}).strict(),$oe=je.object({vault:je.string().min(1).default("Orbit"),library:G4.optional(),backup:Ooe.optional(),network:yoe.default({level:"allowlist",allow:[]}),capability:je.array(boe).default([]),login:je.array(_oe).default([]),machine:je.array(koe).default([]),mcp:je.array(Soe).default([]),skill:je.array(Toe).default([]),deploy:xoe.optional(),builder:c4.optional(),secret_use:h4.optional(),connector:m4.default([])}).strict().refine(e=>new Set(e.skill.map(t=>t.name)).size===e.skill.length,{message:"skill names must be unique"}).refine(e=>new Set(e.capability.map(t=>t.name)).size===e.capability.length,{message:"capability names must be unique"}).refine(e=>new Set([...e.capability.map(t=>t.name),...e.login.map(t=>t.name),"route","check","vault","deploy","change","builder","model","policy","front-check","scratch-clean","work-clean","work-usage","secret-use-send"]).size===e.capability.length+e.login.length+13,{message:"login names must be unique, and not a capability's or a fixed broker operation's"}).refine(e=>new Set([...e.capability.map(t=>t.name),...e.login.map(t=>t.name),...e.mcp.map(t=>t.name),"cua"]).size===e.capability.length+e.login.length+e.mcp.length+1,{message:"mcp names must be unique, and not a capability's or login's (or cua)"}).refine(e=>e.network.level==="allowlist"||e.mcp.every(t=>t.reach.length===0),{message:'an mcp server\'s `reach` only applies to network level = "allowlist"'});i(V4,"librarySourceConfig");i(Ioe,"renderCapabilities");Hn=class extends Error{static{i(this,"PolicyError")}};i(Roe,"loadPolicy");i(ds,"parsePolicy")});function w0(e,t){return e.mcp.filter(r=>!r.os||r.os===t)}var v0=Bt(()=>{"use strict";Hs();Er();i(w0,"mcpServersFor")});import{readFileSync as b3}from"node:fs";import{join as _3}from"node:path";import{existsSync as hS,readFileSync as g3}from"node:fs";import{dirname as mS,join as Dc}from"node:path";import{fileURLToPath as t1}from"node:url";var r1=Dc("moonlet","recipes","base-macos.toml");function n1(e=mS(t1(import.meta.url))){let t=Dc(e,"assets");return hS(Dc(t,r1))?t:null}i(n1,"bundledAssets");function gS(e=mS(t1(import.meta.url))){let t=e;for(;;){if(hS(Dc(t,r1))&&hS(Dc(t,"plugins","moonlet")))return t;let r=mS(t);if(r===t)return null;t=r}}i(gS,"checkoutRoot");function Jn(){let e=n1()??gS();if(!e)throw new Error("the orbit plugin can't find its files: no dist/assets/ beside it and no checkout above it");return e}i(Jn,"assets");function Xw(e){let t=n1(e);if(!t)return null;try{let r=g3(Dc(t,"moonlet","revision"),"utf8").trim();return/^[0-9a-f]{40}$/.test(r)?r:null}catch{return null}}i(Xw,"bundledRevision");var Yw=i(()=>Dc(Jn(),"plugins","moonlet"),"pluginDir");import{createHash as y3}from"node:crypto";import{z as jc}from"zod";var Zw="guidance",w3=jc.object({path:jc.string().min(1).max(256).refine(e=>!e.startsWith("/")&&!/[\\\u0000-\u001f:]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")),text:jc.string().refine(e=>!e.includes("\0")&&Buffer.from(e,"utf8").toString("utf8")===e)}).strict(),i1=jc.array(w3).min(1).max(128).refine(e=>new Set(e.map(t=>t.path)).size===e.length),v3=jc.object({version:jc.literal(1),origin:jc.string().min(1).max(500),baseline:i1,files:i1}).strict(),s1=i(e=>y3("sha256").update(e).digest("hex"),"sha"),yS=i(e=>JSON.stringify(e.files),"rendered");function Mc(e){let t;try{t=JSON.parse(e)}catch{return{ok:!1,reasons:[{text:"guidance must be a JSON file set"}]}}let r=v3.safeParse(t);return r.success?{ok:!0,body:r.data}:{ok:!1,reasons:[{text:"guidance needs version 1, an origin, and baseline and current file sets with unique relative paths and UTF-8 text"}]}}i(Mc,"parseGuidance");function o1(){return{id:Zw,title:"Guidance",label:"instruction",limits:{bytes:1e6,artifacts:50,writesPerHour:20,writesPerDay:100},draftFrom:"orbit-thread",parse:Mc,trial:{start:i(()=>[],"start"),verify:i((e,t,r)=>({source:"orbit",outcome:t.outcome==="pass"&&r.fills.includes(s1(yS(e)))?"pass":"fail",note:t.outcome==="fail"||r.fills.includes(s1(yS(e)))?t.note:"the candidate's complete file set has not been read by this caller"}),"verify"),verdict:i(e=>{let t=e.find(r=>r.outcome==="fail");return t?{failed:t.note}:e.some(r=>r.outcome==="pass")?"passed":"pending"},"verdict"),activation:"orbit"},render:i((e,t)=>Object.keys(t).length?{ok:!1,reasons:["a guidance read takes no values"]}:{ok:!0,text:yS(e)},"render")}}i(o1,"guidanceKind");function Xu(e,t){let r=t.map(({path:o,bytes:a})=>{let c=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(a);if(!Buffer.from(c).equals(Buffer.from(a)))throw new Error(`guidance source ${o} did not round trip as UTF-8`);return{path:o,text:c}}),n={version:1,origin:e,baseline:r,files:r.map(o=>({...o}))},s=Mc(JSON.stringify(n));if(!s.ok)throw new Error(s.reasons.map(o=>o.text).join("; "));return s.body}i(Xu,"guidanceSnapshot");function Yu(e,t,r,n){let s=`${Zw}/${r}`,o=Mc(JSON.stringify(n));if(!o.ok||JSON.stringify(n.files)!==JSON.stringify(n.baseline))return{state:"refused",reason:"a seed must exactly copy its captured baseline"};let a=e.list({kind:Zw}).find(c=>c.name===r);return a?{state:"existing",artifact:a}:e.draft(t,s,JSON.stringify(o.body),n.origin)}i(Yu,"seedGuidance");function ro(e,t){let r=e.use(`${Zw}/${t}`);if("state"in r)return r;let n=Mc(r.body);return n.ok?{n:r.n,files:n.body.files}:{state:"refused",reason:"the guidance file set could not be read"}}i(ro,"readGuidance");var Qw="setup-finished",wS="prompts/setup-finished.txt";function k3(e,t,r){return e.replace(/\{\{(owner|summary)\}\}/g,(n,s)=>({owner:t,summary:r})[s])}i(k3,"renderSetupFinished");function a1(e,t,r,n,s=()=>b3(_3(Jn(),"assets/orbit-guidance",wS))){let o=`guidance/${Qw}`;if(!e.list({kind:"guidance"}).some(l=>l.name===Qw)){let l=Xu("Exact capture of the effective setup completion message",[{path:wS,bytes:s()}]),u=Yu(e,t,Qw,l);if(u.state!=="trial")throw new Error("Setup guidance could not be captured");let d=e.fill(t,o,{},u.n);if(d.state!=="ok")throw new Error(d.reason);if(d.text!==JSON.stringify(l.files))throw new Error("Setup guidance changed during capture");let f=e.trial(t,o,{outcome:"pass",note:"The complete captured setup message is unchanged through the production reader"});if(f.state!=="ok")throw new Error(f.reason);let p=e.activate(t,o,u.n);if(p.state!=="ok")throw new Error(p.reason)}let a=ro(e,Qw);if("state"in a)throw new Error(a.reason);let c=a.files.find(l=>l.path===wS);if(!c)throw new Error("Setup guidance has no completion message");return k3(c.text,r,n)}i(a1,"setupFinishedMessage");var c1="matt0x6F/personalassistant",l1="integrations.reviews.default";function E3(e){return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'config'").get()?e.prepare("SELECT 1 FROM config LIMIT 1").get()!==void 0:!1}i(E3,"previousReviewConfiguration");function S3(e,t){return e===""||e===c1?e:e!==void 0?"":t?c1:""}i(S3,"initialReviewDefault");function u1(e){return{type:"string",label:"Repositories to review automatically",description:"Space-separated owner/repository names. Only listed repositories in the GitHub ability are watched. Empty watches none. Automatic approval uses its own separate policy list and stays off by default.",default:e}}i(u1,"reviewRepositorySetting");async function d1(e,t){let r=E3(e),n=await t.get(l1),s=S3(n,r);return n===void 0&&await t.set(l1,s),s}i(d1,"loadInitialReviewDefault");import{z as Th}from"zod";import{z as Ut}from"zod";var p1=["CREATE TABLE schedule_health_states (id TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE schedule_health_pending (position INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT UNIQUE NOT NULL, journaled INTEGER NOT NULL, record TEXT NOT NULL)","CREATE INDEX schedule_health_delivery ON schedule_health_pending(journaled,position)","CREATE TABLE schedule_health_meta (id INTEGER PRIMARY KEY CHECK(id=1), sequence INTEGER NOT NULL, imported INTEGER NOT NULL)","INSERT INTO schedule_health_meta VALUES (1,0,0)"],f1=Ut.object({fingerprint:Ut.string(),stuckSince:Ut.number().nullable(),stuckLastRun:Ut.number().nullable(),errors:Ut.boolean(),never:Ut.boolean(),invalid:Ut.string().nullable(),signature:Ut.string()}),h1=Ut.object({id:Ut.string(),at:Ut.number(),text:Ut.string(),zone:Ut.string().default("UTC"),journaled:Ut.boolean().default(!1)}),T3=Ut.object({states:Ut.record(Ut.string(),f1),pending:Ut.array(h1),sequence:Ut.number().int().nonnegative()}),A3=Ut.object({sequence:Ut.number().int().nonnegative(),imported:Ut.number().int()}),x3=Ut.object({id:Ut.string(),record:Ut.string()}),O3=Ut.object({record:Ut.string(),journaled:Ut.number().int()}),$3=Ut.object({count:Ut.number().int().nonnegative()});function m1(e,t){let r=i(()=>A3.parse(e.prepare("SELECT sequence,imported FROM schedule_health_meta WHERE id=1").get()),"metadata"),n=i(d=>{let f=O3.parse(d);return{...h1.parse(JSON.parse(f.record)),journaled:f.journaled===1}},"decodeIncident");function s(d){e.exec("BEGIN IMMEDIATE");try{e.prepare("DELETE FROM schedule_health_states WHERE id NOT IN (SELECT value FROM json_each(?))").run(JSON.stringify(Object.keys(d.states)));let f=e.prepare("INSERT INTO schedule_health_states(id,record) VALUES (?,?) ON CONFLICT(id) DO UPDATE SET record=excluded.record");for(let[m,y]of Object.entries(d.states))f.run(m,JSON.stringify(y));let p=e.prepare("INSERT INTO schedule_health_pending(id,journaled,record) VALUES (?,?,?) ON CONFLICT(id) DO NOTHING");for(let m of d.pending)p.run(m.id,m.journaled?1:0,JSON.stringify(m));e.prepare("UPDATE schedule_health_meta SET sequence=MAX(sequence,?),imported=1 WHERE id=1").run(d.sequence),e.exec("COMMIT")}catch(f){throw e.exec("ROLLBACK"),f}}i(s,"save");async function o(d){r().imported||s(T3.parse(await t()??{states:{},pending:[],sequence:0}));let f=e.prepare("SELECT id,record FROM schedule_health_states WHERE id IN (SELECT value FROM json_each(?))").all(JSON.stringify(d));return{states:Object.fromEntries(f.map(p=>{let m=x3.parse(p);return[m.id,f1.parse(JSON.parse(m.record))]})),pending:[],sequence:r().sequence}}i(o,"read");function a(){let d=e.prepare("SELECT record,journaled FROM schedule_health_pending WHERE journaled=0 ORDER BY position LIMIT 1").get();return d?n(d):null}i(a,"next");function c(d){let f=e.prepare("SELECT record,journaled FROM schedule_health_pending WHERE journaled=1 ORDER BY position LIMIT ?").all(d),{count:p}=$3.parse(e.prepare("SELECT COUNT(*) AS count FROM schedule_health_pending WHERE journaled=1").get());return{incidents:f.map(n),count:p}}i(c,"batch");function l(d){e.prepare("UPDATE schedule_health_pending SET journaled=1 WHERE id=?").run(d)}i(l,"journaled");function u(d){e.prepare("DELETE FROM schedule_health_pending WHERE id IN (SELECT value FROM json_each(?))").run(JSON.stringify(d))}return i(u,"delivered"),{read:o,save:s,next:a,batch:c,journaled:l,delivered:u}}i(m1,"scheduleHealthStorage");import{createHash as g1}from"node:crypto";import{defineRpcContract as I3}from"@get-bb/plugin-sdk";import{z as Ae}from"zod";var cn=Ae.string().regex(/^(?:rec_[a-f0-9]{32}|ORB-[1-9][0-9]{0,8})$/),y1=i(e=>[...e].every(t=>t.charCodeAt(0)>=32&&t.charCodeAt(0)!==127),"noControls"),Zu=Ae.string().min(1).max(300).refine(y1),_S=Ae.array(Ae.string().min(1).max(64).refine(y1)).max(64),vS=Ae.string().max(256e3).refine(e=>Buffer.byteLength(JSON.stringify(e))<=256e3),tv=Ae.string().max(1e6).refine(e=>Buffer.byteLength(JSON.stringify(e))<=1e6),rv=Ae.enum(["backlog","todo","in_progress","in_review","done","canceled"]),kS=Ae.enum(["work","notice","watch"]),Bc=Ae.object({id:cn,key:Zu,kind:kS,title:Ae.string().min(1).max(1e3),description:tv,labels:_S,parent:cn.nullable(),task:Ae.string().regex(/^ORB-[1-9][0-9]{0,8}$/).nullable(),status:rv,createdAt:Ae.number().int().nonnegative(),updatedAt:Ae.number().int().nonnegative()}),w1=Ae.discriminatedUnion("action",[Ae.object({action:Ae.literal("create"),key:Zu,kind:kS,title:Ae.string().min(1).max(1e3),description:vS,labels:_S,parent:cn.nullable()}).strict(),Ae.object({action:Ae.literal("update"),id:cn,key:Zu.optional(),description:vS.optional(),status:rv.optional(),labels:_S.optional(),parent:cn.optional()}).strict(),Ae.object({action:Ae.literal("comment"),id:cn,body:vS.min(1),key:Ae.string().min(1).max(300)}).strict()]),v1=Ae.discriminatedUnion("action",[Ae.object({action:Ae.literal("get"),id:cn}).strict(),Ae.object({action:Ae.literal("find"),key:Zu}).strict(),Ae.object({action:Ae.literal("list"),label:Ae.string().max(64),parent:cn.nullable(),active:Ae.boolean(),after:Ae.number().int().nonnegative(),limit:Ae.number().int().min(1).max(200)}).strict()]),b1=Ae.object({seq:Ae.number().int(),key:Ae.string(),body:tv,actor:Ae.string(),at:Ae.number().int()}),nv=I3({"records.query":{input:v1,output:Ae.object({records:Ae.array(Bc),next:Ae.number().int().nonnegative().nullable()})},"records.change":{input:w1,output:Bc},"records.comments":{input:Ae.object({id:cn,after:Ae.number().int().nonnegative(),limit:Ae.number().int().min(1).max(200)}).strict(),output:Ae.object({comments:Ae.array(b1),next:Ae.number().int().nullable()})}}),_1=["CREATE TABLE event_records (seq INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT UNIQUE NOT NULL, key TEXT UNIQUE NOT NULL, kind TEXT NOT NULL, title TEXT NOT NULL, description TEXT NOT NULL, labels TEXT NOT NULL, parent TEXT, task TEXT, status TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL)","CREATE INDEX event_records_parent ON event_records(parent, seq)","CREATE INDEX event_records_active ON event_records(seq) WHERE kind='watch' OR status NOT IN ('done','canceled')","CREATE TABLE event_record_aliases (address TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE event_record_keys (key TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE event_record_comments (seq INTEGER PRIMARY KEY AUTOINCREMENT, record TEXT NOT NULL, key TEXT NOT NULL, body TEXT NOT NULL, actor TEXT NOT NULL, at INTEGER NOT NULL, UNIQUE(record, key))","CREATE TABLE event_record_imports (task TEXT PRIMARY KEY, record TEXT NOT NULL, snapshot TEXT NOT NULL, copied_at INTEGER NOT NULL, archived_key TEXT)","CREATE TABLE event_record_revisions (seq INTEGER PRIMARY KEY AUTOINCREMENT, task TEXT NOT NULL, snapshot TEXT NOT NULL)","CREATE INDEX event_record_revisions_task ON event_record_revisions(task,seq)"],k1=Ae.object({seq:Ae.number().int(),id:cn,key:Zu,kind:kS,title:Ae.string(),description:Ae.string(),labels:Ae.string(),parent:cn.nullable(),task:Ae.string().nullable(),status:rv,created_at:Ae.number(),updated_at:Ae.number()}),ev=i(e=>e.toLowerCase().startsWith("review:")?e.toLowerCase():e,"normalizeKey");function bS(e){if(!e)return null;let t=k1.parse(e);return Bc.parse({...t,labels:JSON.parse(t.labels),createdAt:t.created_at,updatedAt:t.updated_at})}i(bS,"read");function E1(e,t){let r=i(a=>bS(e.prepare("SELECT r.* FROM event_records r WHERE r.id = ? OR r.id = (SELECT record FROM event_record_aliases WHERE address = ?)").get(cn.parse(a),a)),"get"),n=i(a=>{let c=ev(Zu.parse(a));return bS(e.prepare("SELECT * FROM event_records WHERE key = ? OR id = (SELECT record FROM event_record_keys WHERE key = ?)").get(c,c))},"find");async function s(a){let c=n(a.key);if(c){if(c.kind!==a.kind||c.parent!==(a.parent?r(a.parent)?.id??a.parent:null))throw new Error("This record key already has another kind or parent");return c}let l=null,u=a.parent;if(a.parent){let m=r(a.parent);if(m&&(u=m.id),l=m?m.task:await t.owner(a.parent),!m&&!l)throw new Error("The record parent is unavailable")}else l=await t.task(a.key);Bc.shape.task.parse(l);let d=ev(a.key),f=`rec_${g1("sha256").update(d).digest("hex").slice(0,32)}`,p=t.now();return e.prepare("INSERT INTO event_records (id,key,kind,title,description,labels,parent,task,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,'todo',?,?) ON CONFLICT(key) DO NOTHING").run(f,d,a.kind,a.title,a.description,JSON.stringify(a.labels),u,l,p,p),n(d)}i(s,"create");async function o(a,c){let l=w1.parse(a);if(l.action==="create")return s(l);let u=r(l.id);if(!u)throw new Error("No system record has this identity");if(l.action==="comment"){let y=Ae.object({body:Ae.string()}).optional().parse(e.prepare("SELECT body FROM event_record_comments WHERE record=? AND key=?").get(u.id,l.key));if(y&&y.body!==l.body)throw new Error("The comment key already names a different result");return e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING").run(u.id,l.key,l.body,c,t.now()),u}let d=u.parent,f=u.task;if(l.parent!==void 0){let y=new Set([u.id]),g=r(l.parent),h=g?g.task:await t.owner(l.parent);if(!g&&!h)throw new Error("The record parent is unavailable");for(f=h;g;){if(y.has(g.id))throw new Error("A record cannot be its own ancestor");y.add(g.id),g=g.parent?r(g.parent):null}d=r(l.parent)?.id??l.parent}if(!f&&l.key&&(f=await t.task(l.key)),u.task&&f!==u.task)throw new Error("A system record cannot change the meaning of its owed task");Bc.shape.task.parse(f);let p=l.key?ev(l.key):u.key,m=n(p);if(m&&m.id!==u.id)throw new Error("The event key already names another system record");return e.transaction(()=>{p!==u.key&&e.prepare("INSERT INTO event_record_keys (key,record) VALUES (?,?) ON CONFLICT(key) DO NOTHING").run(u.key,u.id),e.prepare("UPDATE event_records SET key=?,description=?,status=?,labels=?,parent=?,task=?,updated_at=? WHERE id=?").run(p,l.description??u.description,l.status??u.status,JSON.stringify(l.labels?[...new Set([...u.labels,...l.labels])]:u.labels),d,f,Math.max(t.now(),u.updatedAt+1),u.id)})(),r(u.id)}return i(o,"mutate"),{get:r,find:n,async refresh(a){let c=r(a);if(!c)throw new Error("No system record has this identity");let l=c.parent?r(c.parent):null,u=c.task??l?.task??(c.parent&&!l?await t.owner(c.parent):await t.task(c.key));return Bc.shape.task.parse(u),u&&!c.task&&e.prepare("WITH RECURSIVE children(id) AS (SELECT ? UNION SELECT e.id FROM event_records e JOIN children c ON e.parent=c.id WHERE e.task IS NULL) UPDATE event_records SET task=? WHERE id IN (SELECT id FROM children) AND task IS NULL").run(c.id,u),r(c.id)},change:o,query(a){let c=v1.parse(a);if(c.action==="get"||c.action==="find"){let y=c.action==="get"?r(c.id):n(c.key);return{records:y?[y]:[],next:null}}let l=["seq > ?"],u=[c.after];if(c.active&&l.push("(kind='watch' OR status NOT IN ('done','canceled'))"),c.parent){l.push("(parent = ? OR parent IN (SELECT address FROM event_record_aliases WHERE record = ?))");let y=r(c.parent)?.id??c.parent;u.push(y,y)}c.label&&(l.push("EXISTS (SELECT 1 FROM json_each(event_records.labels) WHERE value = ?)"),u.push(c.label));let d=Ae.array(k1).parse(e.prepare(`SELECT * FROM event_records WHERE ${l.join(" AND ")} ORDER BY seq LIMIT ?`).all(...u,c.limit+1)),f=[],p=0,m=c.after;for(let y of d.slice(0,c.limit)){let g=bS(y),h=Buffer.byteLength(JSON.stringify(g));if(f.length&&p+h>7e5)break;f.push(g),p+=h,m=y.seq}return{records:f,next:d.length>f.length?m:null}},comments(a,c=0,l=100){let u=r(a);if(!u)throw new Error("No system record has this identity");Ae.number().int().nonnegative().parse(c),Ae.number().int().min(1).max(200).parse(l);let d=Ae.array(b1).parse(e.prepare("SELECT seq,key,body,actor,at FROM event_record_comments WHERE record=? AND seq>? ORDER BY seq LIMIT ?").all(u.id,c,l+1)),f=[],p=0;for(let m of d.slice(0,l)){let y=Buffer.byteLength(JSON.stringify(m));if(f.length&&p+y>7e5)break;f.push(m),p+=y}return{comments:f,next:d.length>f.length?f.at(-1).seq:null}},import:e.transaction((a,c,l)=>{if(cn.parse(a),Bc.parse(l),e.prepare("SELECT record FROM event_record_imports WHERE task=?").get(a))return;let d=JSON.stringify(c);if(Buffer.byteLength(d)>1e6)throw new Error("The historical task is too large to copy safely");let f=Ae.object({comments:Ae.array(Ae.object({id:Ae.string().min(1).max(200),body:tv,authorName:Ae.string(),threadId:Ae.string().nullable()}))}).parse(c);n(l.key)||e.prepare("INSERT INTO event_records (id,key,kind,title,description,labels,parent,task,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(key) DO NOTHING").run(l.id,ev(l.key),l.kind,l.title,l.description,JSON.stringify(l.labels),l.parent,l.task,l.status,l.createdAt,l.updatedAt);let m=n(l.key);e.prepare("INSERT INTO event_record_aliases (address,record) VALUES (?,?)").run(a,m.id),e.prepare("INSERT INTO event_record_imports (task,record,snapshot,copied_at) VALUES (?,?,?,?)").run(a,m.id,d,t.now());let y=e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING");for(let g of f.comments)y.run(m.id,`legacy:${g.id}`,g.body,g.threadId?`conversation:${g.threadId}`:`history:${g.authorName}`,t.now())}),pendingArchives(){return Ae.array(Ae.object({task:cn,snapshot:Ae.string()})).parse(e.prepare("SELECT i.task,COALESCE((SELECT snapshot FROM event_record_revisions r WHERE r.task=i.task ORDER BY seq DESC LIMIT 1),i.snapshot) AS snapshot FROM event_record_imports i WHERE archived_key IS NULL ORDER BY copied_at,task").all())},captureHistory:e.transaction((a,c)=>{let l=Ae.object({record:Ae.string(),snapshot:Ae.string(),archived_key:Ae.string().nullable()}).parse(e.prepare("SELECT record,snapshot,archived_key FROM event_record_imports WHERE task=?").get(cn.parse(a)));if(l.archived_key)throw new Error("Task history has already moved");let u=JSON.stringify(c);if(Buffer.byteLength(u)>1e6)throw new Error("The historical task is too large to copy safely");let d=Ae.object({task:Ae.object({key:Ae.string(),status:rv,updatedAt:Ae.iso.datetime()}),comments:Ae.array(Ae.object({id:Ae.string(),body:tv,authorName:Ae.string(),threadId:Ae.string().nullable()})),attachments:Ae.array(Ae.object({id:Ae.string()}))}),f=d.parse(JSON.parse(l.snapshot)),p=d.parse(c),m=Ae.object({snapshot:Ae.string()}).optional().parse(e.prepare("SELECT snapshot FROM event_record_revisions WHERE task=? ORDER BY seq DESC LIMIT 1").get(a)),y=d.parse(JSON.parse(m?.snapshot??l.snapshot)).task;if(p.task.key!==f.task.key||f.comments.some(h=>!p.comments.some(w=>w.id===h.id))||f.attachments.some(h=>!p.attachments.some(w=>w.id===h.id)))throw new Error("Task history changed before its final copy");u!==(m?.snapshot??l.snapshot)&&e.prepare("INSERT INTO event_record_revisions (task,snapshot) VALUES (?,?)").run(a,u),e.prepare("UPDATE event_records SET status=?,updated_at=? WHERE id=? AND status=? AND updated_at=?").run(p.task.status,Date.parse(p.task.updatedAt),l.record,y.status,Date.parse(y.updatedAt));let g=e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING");for(let h of p.comments){let w=f.comments.find(E=>E.id===h.id),v=w&&w.body!==h.body?`:${g1("sha256").update(h.body).digest("hex")}`:"";g.run(l.record,`legacy:${h.id}${v}`,h.body,h.threadId?`conversation:${h.threadId}`:`history:${h.authorName}`,t.now())}}),latestCopy(a){return Ae.object({snapshot:Ae.string()}).parse(e.prepare("SELECT COALESCE((SELECT snapshot FROM event_record_revisions r WHERE r.task=i.task ORDER BY seq DESC LIMIT 1),i.snapshot) AS snapshot FROM event_record_imports i WHERE task=?").get(cn.parse(a))).snapshot},copied(a){return e.prepare("SELECT task,record,snapshot,copied_at,archived_key FROM event_record_imports WHERE task=?").get(cn.parse(a))},archived(a,c){Ae.string().regex(/^ORBH-[1-9][0-9]{0,8}$/).parse(c),e.prepare("UPDATE event_record_imports SET archived_key=? WHERE task=?").run(c,cn.parse(a))}}}i(E1,"eventRecords");var S1=["CREATE TABLE standing_questions (id TEXT PRIMARY KEY, station TEXT NOT NULL, request TEXT NOT NULL, intent TEXT NOT NULL, state TEXT NOT NULL, job TEXT NOT NULL, UNIQUE(station,request))","CREATE UNIQUE INDEX standing_waiting ON standing_questions(station) WHERE state='waiting'","CREATE TABLE standing_decisions (id TEXT PRIMARY KEY, station TEXT NOT NULL, receipt TEXT NOT NULL)","CREATE TABLE standing_audit (seq INTEGER PRIMARY KEY AUTOINCREMENT, at INTEGER NOT NULL, station TEXT NOT NULL, event TEXT NOT NULL, decision TEXT NOT NULL, request TEXT NOT NULL, record TEXT NOT NULL)","CREATE UNIQUE INDEX standing_use ON standing_audit(station,request,decision) WHERE event='use'","CREATE UNIQUE INDEX standing_result ON standing_audit(station,request,decision) WHERE event='result'",...["standing_decisions","standing_audit"].flatMap(e=>[`CREATE TRIGGER ${e}_no_update BEFORE UPDATE ON ${e} BEGIN SELECT RAISE(ABORT,'standing history is immutable'); END`,`CREATE TRIGGER ${e}_no_delete BEFORE DELETE ON ${e} BEGIN SELECT RAISE(ABORT,'standing history is immutable'); END`])];import{defineRpcContract as R3}from"@get-bb/plugin-sdk";import{z as ur}from"zod";var O1=[`CREATE TABLE orbit_threads (thread_id TEXT PRIMARY KEY, orbit_thread TEXT NOT NULL, root_seq INTEGER NOT NULL,
|
|
601
|
+
`}async function Roe(e){return ds(Hc(e)?await goe(e,"utf8"):"",e)}function ds(e,t="policy"){let r;try{r=wi(e)}catch{throw new Hn(`${t}: invalid policy TOML (file contents withheld)`)}let n=$oe.safeParse(r);if(!n.success)throw new Hn(`${t}: ${n.error.issues.map(s=>`${s.path.join(".")}: ${s.message}`).join("; ")}`);return n.data}var WP,yoe,woe,voe,F4,H4,boe,aw,_oe,koe,zP,Eoe,Soe,Toe,W4,G4,Aoe,xoe,Ooe,$oe,Hn,Hs=Bt(()=>{"use strict";hv();zc();iw();l4();g0();RP();y0();A4();$4();Pf();BP();q4();RP();WP=je.string().regex(/^[A-Za-z0-9.-]+(\/\d{1,2})?(:\d{1,5})?$/,'a host or address, optionally with /prefix and :port, like "10.0.0.5:6443"'),yoe=je.object({level:je.enum(["internet","allowlist","open"]).default("allowlist"),allow:je.array(WP).default([])}).strict().refine(e=>e.level==="allowlist"||e.allow.length===0,{message:'`allow` only applies to level = "allowlist"'}),woe=je.enum(["read","act","never"]),voe=/^(LD_|DYLD_|GIT_|GH_|NODE_|PYTHON|PERL5|RUBY)|^(BASH_ENV|ENV)$/,F4=1024,H4=je.record(je.string().regex(/^[A-Z][A-Z0-9_]*$/,"an upper-case name").refine(e=>!["PATH","HOME","ORBIT_EXCHANGE"].includes(e)&&!voe.test(e),"a name the broker or git sets, or one that loads code"),je.string().refine(e=>Buffer.byteLength(e,"utf8")<=F4,`up to ${F4} bytes`).regex(/^[^\p{Cc}]*$/u,"one line, no control characters")).default({}),boe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like kube"),kind:je.enum(["cli","ssh"]),program:je.string().min(1).optional(),host:je.string().regex(/^[A-Za-z0-9.-]+$/).optional(),user:je.string().regex(/^[A-Za-z0-9._-]+$/).optional(),host_key:je.string().regex(/^(ssh-ed25519|ecdsa-sha2-nistp(256|384|521)|ssh-rsa) [A-Za-z0-9+/=]{16,}$/,'a public key, like "ssh-ed25519 AAAA\u2026"').optional(),secret:je.object({item:je.string().min(1),field:je.string().min(1),as:je.string().regex(/^(file:[A-Z_][A-Z0-9_]*|ssh-key)$/),orbit_made:je.boolean().optional()}).strict(),read:je.array(je.string()).default([]),act:je.array(je.string()).default([]),never:je.array(je.string()).default([]),default:woe.default("act"),value_flags:je.array(je.string()).default([]),forbid_flags:je.array(je.string().regex(/^-/)).default([]),reach:je.array(WP.regex(/:\d+$/,'a capability destination needs a port, like "10.0.0.5:6443"')).default([]),allow_urls:je.boolean().default(!1),exchange:je.boolean().default(!1),env:H4}).strict().refine(e=>e.name!=="github"||m0(e.env),{message:"ORBIT_GITHUB_AUTO_APPROVE must list watched repositories with valid authors and protected_paths"}).refine(e=>e.name!=="github"||m0(e.env,"ORBIT_GITHUB_AUTO_MERGE"),{message:"ORBIT_GITHUB_AUTO_MERGE must list watched repositories with valid authors and protected_paths"}).refine(e=>e.kind==="cli"?!!e.program&&e.secret.as.startsWith("file:"):!!e.host&&!!e.user&&!!e.host_key&&e.secret.as==="ssh-key",{message:'cli needs `program` and secret as "file:VAR"; ssh needs `host`, `user`, `host_key` and secret as "ssh-key"'}).refine(e=>Object.keys(e.env).length===0||e.kind==="cli"&&!(e.secret.as.slice(5)in e.env),{message:"env is for a cli program's settings, and can't be its secret's variable"}),aw=je.string().min(1).regex(/^[^/?]+$/,'a 1Password name, without "/" or "?"'),_oe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like proton"),item:aw,bridge:je.boolean().default(!1),unit:je.string().regex(/^[A-Za-z0-9@._-]+$/,"a systemd unit name, like orbit-app-proton-mail").optional(),url:je.string().regex(/^https:\/\/[A-Za-z0-9.-]+(:\d+)?\/[^\s?#]*$/,`the sign-in page's https address, without a query, like "https://account.proton.me/mail"`).optional(),app:je.string().regex(/^[A-Za-z0-9.-]+$/,"a bundle id, like ch.protonmail.desktop").optional(),username:aw.default("username"),password:aw.default("password"),otp:aw.optional(),mailbox_password:aw.optional()}).strict().refine(e=>e.bridge?!e.unit&&!e.url&&!e.app:!!e.unit&&!!e.url&&!e.mailbox_password,{message:"a login is an app's (unit and url) or Bridge's (bridge = true, with no unit, url or app; a mailbox_password only here)"}),koe=je.object({name:je.string().min(1).regex(/^[^\u0000-\u001f\u007f]+$/,"the bb machine's name, as bb shows it"),folder:je.string().regex(/^\/[^\0\n]*$/,"an absolute path on that machine")}).strict(),zP=["python*","pypy*","node","nodejs","bun","perl*","ruby*","php*","lua*","java","osascript","sh","bash","dash","zsh","ksh","fish","env","npx","npm","pnpm","yarn","uv","uvx","pipx","busybox","tclsh*"],Eoe=new RegExp(`(^|/)(${zP.map(e=>e.replace("*",".*")).join("|")})$`),Soe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like notes"),kind:je.enum(["local"]).default("local"),command:je.string().regex(/^\/[^\0\n]+$/,"an absolute path on the station, like /usr/local/lib/notes-mcp/server").refine(e=>!Eoe.test(e),"the server itself, not an interpreter (install a script server as its own executable)"),args:je.array(je.string().max(1024).regex(/^[^\p{Cc}]*$/u,"one line, no control characters")).default([]),env:H4,description:je.string().min(1).max(300).regex(/^[^\p{Cc}]*$/u,"one line, no control characters"),os:je.enum(["macos","linux"]).optional(),reach:je.array(WP).default([])}).strict(),Toe=je.object({name:je.string().regex(/^[a-z][a-z0-9-]*$/,"a lowercase name, like dossier"),description:je.string().min(1).max(300).regex(/^[^\p{Cc}]*$/u,"one line, no control characters"),os:je.enum(["macos","linux"]).optional()}).strict(),W4=/^[a-z][a-z0-9_]*$/;i(z4,"libraryOptionRefused");G4=je.object({type:je.enum(ow,{message:`one of rclone's remote backends: ${ow.join(", ")}`}),path:je.string().min(1).max(500).regex(/^[^\0\r\n]*$/,"one line"),options:je.record(je.string(),je.string().max(2e3).regex(/^[^\r\n]*$/,"one line")).default({}).superRefine((e,t)=>{for(let r of Object.keys(e)){let n=z4(r);n&&t.addIssue({code:"custom",message:n})}}),item:je.string().min(1).max(200).regex(/^[^\p{Cc}]*$/u,"one line").optional()}).strict(),Aoe=je.string().regex(/^[A-Za-z0-9](?:[A-Za-z0-9]|-(?=[A-Za-z0-9])){0,38}$/,"a GitHub login, like octocat"),xoe=je.object({repo:je.string().regex(/^[A-Za-z0-9-]+\/[A-Za-z0-9._-]+$/,"owner/name").refine(e=>![".",".."].includes(e.split("/")[1]),"owner/name"),approvers:je.array(Aoe).min(1,"one GitHub login or more")}).strict(),Ooe=G4.extend({recipient:je.string().max(2e4).regex(/^-----BEGIN PGP PUBLIC KEY BLOCK-----\r?\n[\s\S]+\r?\n-----END PGP PUBLIC KEY BLOCK-----\s*$/,"the owner's OpenPGP public key, armored (gpg --armor --export <you>)")}).strict(),$oe=je.object({vault:je.string().min(1).default("Orbit"),library:G4.optional(),backup:Ooe.optional(),network:yoe.default({level:"allowlist",allow:[]}),capability:je.array(boe).default([]),login:je.array(_oe).default([]),machine:je.array(koe).default([]),mcp:je.array(Soe).default([]),skill:je.array(Toe).default([]),deploy:xoe.optional(),builder:c4.optional(),secret_use:h4.optional(),connector:m4.default([])}).strict().refine(e=>new Set(e.skill.map(t=>t.name)).size===e.skill.length,{message:"skill names must be unique"}).refine(e=>new Set(e.capability.map(t=>t.name)).size===e.capability.length,{message:"capability names must be unique"}).refine(e=>new Set([...e.capability.map(t=>t.name),...e.login.map(t=>t.name),"route","check","vault","deploy","change","builder","model","bb","model-peer","policy","front-check","scratch-clean","work-clean","work-usage","secret-use-send"]).size===e.capability.length+e.login.length+15,{message:"login names must be unique, and not a capability's or a fixed broker operation's"}).refine(e=>new Set([...e.capability.map(t=>t.name),...e.login.map(t=>t.name),...e.mcp.map(t=>t.name),"cua"]).size===e.capability.length+e.login.length+e.mcp.length+1,{message:"mcp names must be unique, and not a capability's or login's (or cua)"}).refine(e=>e.network.level==="allowlist"||e.mcp.every(t=>t.reach.length===0),{message:'an mcp server\'s `reach` only applies to network level = "allowlist"'});i(V4,"librarySourceConfig");i(Ioe,"renderCapabilities");Hn=class extends Error{static{i(this,"PolicyError")}};i(Roe,"loadPolicy");i(ds,"parsePolicy")});function w0(e,t){return e.mcp.filter(r=>!r.os||r.os===t)}var v0=Bt(()=>{"use strict";Hs();Er();i(w0,"mcpServersFor")});import{readFileSync as b3}from"node:fs";import{join as _3}from"node:path";import{existsSync as hS,readFileSync as g3}from"node:fs";import{dirname as mS,join as Dc}from"node:path";import{fileURLToPath as t1}from"node:url";var r1=Dc("moonlet","recipes","base-macos.toml");function n1(e=mS(t1(import.meta.url))){let t=Dc(e,"assets");return hS(Dc(t,r1))?t:null}i(n1,"bundledAssets");function gS(e=mS(t1(import.meta.url))){let t=e;for(;;){if(hS(Dc(t,r1))&&hS(Dc(t,"plugins","moonlet")))return t;let r=mS(t);if(r===t)return null;t=r}}i(gS,"checkoutRoot");function Jn(){let e=n1()??gS();if(!e)throw new Error("the orbit plugin can't find its files: no dist/assets/ beside it and no checkout above it");return e}i(Jn,"assets");function Xw(e){let t=n1(e);if(!t)return null;try{let r=g3(Dc(t,"moonlet","revision"),"utf8").trim();return/^[0-9a-f]{40}$/.test(r)?r:null}catch{return null}}i(Xw,"bundledRevision");var Yw=i(()=>Dc(Jn(),"plugins","moonlet"),"pluginDir");import{createHash as y3}from"node:crypto";import{z as jc}from"zod";var Zw="guidance",w3=jc.object({path:jc.string().min(1).max(256).refine(e=>!e.startsWith("/")&&!/[\\\u0000-\u001f:]/.test(e)&&e.split("/").every(t=>t!==""&&t!=="."&&t!=="..")),text:jc.string().refine(e=>!e.includes("\0")&&Buffer.from(e,"utf8").toString("utf8")===e)}).strict(),i1=jc.array(w3).min(1).max(128).refine(e=>new Set(e.map(t=>t.path)).size===e.length),v3=jc.object({version:jc.literal(1),origin:jc.string().min(1).max(500),baseline:i1,files:i1}).strict(),s1=i(e=>y3("sha256").update(e).digest("hex"),"sha"),yS=i(e=>JSON.stringify(e.files),"rendered");function Mc(e){let t;try{t=JSON.parse(e)}catch{return{ok:!1,reasons:[{text:"guidance must be a JSON file set"}]}}let r=v3.safeParse(t);return r.success?{ok:!0,body:r.data}:{ok:!1,reasons:[{text:"guidance needs version 1, an origin, and baseline and current file sets with unique relative paths and UTF-8 text"}]}}i(Mc,"parseGuidance");function o1(){return{id:Zw,title:"Guidance",label:"instruction",limits:{bytes:1e6,artifacts:50,writesPerHour:20,writesPerDay:100},draftFrom:"orbit-thread",parse:Mc,trial:{start:i(()=>[],"start"),verify:i((e,t,r)=>({source:"orbit",outcome:t.outcome==="pass"&&r.fills.includes(s1(yS(e)))?"pass":"fail",note:t.outcome==="fail"||r.fills.includes(s1(yS(e)))?t.note:"the candidate's complete file set has not been read by this caller"}),"verify"),verdict:i(e=>{let t=e.find(r=>r.outcome==="fail");return t?{failed:t.note}:e.some(r=>r.outcome==="pass")?"passed":"pending"},"verdict"),activation:"orbit"},render:i((e,t)=>Object.keys(t).length?{ok:!1,reasons:["a guidance read takes no values"]}:{ok:!0,text:yS(e)},"render")}}i(o1,"guidanceKind");function Xu(e,t){let r=t.map(({path:o,bytes:a})=>{let c=new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0}).decode(a);if(!Buffer.from(c).equals(Buffer.from(a)))throw new Error(`guidance source ${o} did not round trip as UTF-8`);return{path:o,text:c}}),n={version:1,origin:e,baseline:r,files:r.map(o=>({...o}))},s=Mc(JSON.stringify(n));if(!s.ok)throw new Error(s.reasons.map(o=>o.text).join("; "));return s.body}i(Xu,"guidanceSnapshot");function Yu(e,t,r,n){let s=`${Zw}/${r}`,o=Mc(JSON.stringify(n));if(!o.ok||JSON.stringify(n.files)!==JSON.stringify(n.baseline))return{state:"refused",reason:"a seed must exactly copy its captured baseline"};let a=e.list({kind:Zw}).find(c=>c.name===r);return a?{state:"existing",artifact:a}:e.draft(t,s,JSON.stringify(o.body),n.origin)}i(Yu,"seedGuidance");function ro(e,t){let r=e.use(`${Zw}/${t}`);if("state"in r)return r;let n=Mc(r.body);return n.ok?{n:r.n,files:n.body.files}:{state:"refused",reason:"the guidance file set could not be read"}}i(ro,"readGuidance");var Qw="setup-finished",wS="prompts/setup-finished.txt";function k3(e,t,r){return e.replace(/\{\{(owner|summary)\}\}/g,(n,s)=>({owner:t,summary:r})[s])}i(k3,"renderSetupFinished");function a1(e,t,r,n,s=()=>b3(_3(Jn(),"assets/orbit-guidance",wS))){let o=`guidance/${Qw}`;if(!e.list({kind:"guidance"}).some(l=>l.name===Qw)){let l=Xu("Exact capture of the effective setup completion message",[{path:wS,bytes:s()}]),u=Yu(e,t,Qw,l);if(u.state!=="trial")throw new Error("Setup guidance could not be captured");let d=e.fill(t,o,{},u.n);if(d.state!=="ok")throw new Error(d.reason);if(d.text!==JSON.stringify(l.files))throw new Error("Setup guidance changed during capture");let f=e.trial(t,o,{outcome:"pass",note:"The complete captured setup message is unchanged through the production reader"});if(f.state!=="ok")throw new Error(f.reason);let p=e.activate(t,o,u.n);if(p.state!=="ok")throw new Error(p.reason)}let a=ro(e,Qw);if("state"in a)throw new Error(a.reason);let c=a.files.find(l=>l.path===wS);if(!c)throw new Error("Setup guidance has no completion message");return k3(c.text,r,n)}i(a1,"setupFinishedMessage");var c1="matt0x6F/personalassistant",l1="integrations.reviews.default";function E3(e){return e.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = 'config'").get()?e.prepare("SELECT 1 FROM config LIMIT 1").get()!==void 0:!1}i(E3,"previousReviewConfiguration");function S3(e,t){return e===""||e===c1?e:e!==void 0?"":t?c1:""}i(S3,"initialReviewDefault");function u1(e){return{type:"string",label:"Repositories to review automatically",description:"Space-separated owner/repository names. Only listed repositories in the GitHub ability are watched. Empty watches none. Automatic approval uses its own separate policy list and stays off by default.",default:e}}i(u1,"reviewRepositorySetting");async function d1(e,t){let r=E3(e),n=await t.get(l1),s=S3(n,r);return n===void 0&&await t.set(l1,s),s}i(d1,"loadInitialReviewDefault");import{z as Th}from"zod";import{z as Ut}from"zod";var p1=["CREATE TABLE schedule_health_states (id TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE schedule_health_pending (position INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT UNIQUE NOT NULL, journaled INTEGER NOT NULL, record TEXT NOT NULL)","CREATE INDEX schedule_health_delivery ON schedule_health_pending(journaled,position)","CREATE TABLE schedule_health_meta (id INTEGER PRIMARY KEY CHECK(id=1), sequence INTEGER NOT NULL, imported INTEGER NOT NULL)","INSERT INTO schedule_health_meta VALUES (1,0,0)"],f1=Ut.object({fingerprint:Ut.string(),stuckSince:Ut.number().nullable(),stuckLastRun:Ut.number().nullable(),errors:Ut.boolean(),never:Ut.boolean(),invalid:Ut.string().nullable(),signature:Ut.string()}),h1=Ut.object({id:Ut.string(),at:Ut.number(),text:Ut.string(),zone:Ut.string().default("UTC"),journaled:Ut.boolean().default(!1)}),T3=Ut.object({states:Ut.record(Ut.string(),f1),pending:Ut.array(h1),sequence:Ut.number().int().nonnegative()}),A3=Ut.object({sequence:Ut.number().int().nonnegative(),imported:Ut.number().int()}),x3=Ut.object({id:Ut.string(),record:Ut.string()}),O3=Ut.object({record:Ut.string(),journaled:Ut.number().int()}),$3=Ut.object({count:Ut.number().int().nonnegative()});function m1(e,t){let r=i(()=>A3.parse(e.prepare("SELECT sequence,imported FROM schedule_health_meta WHERE id=1").get()),"metadata"),n=i(d=>{let f=O3.parse(d);return{...h1.parse(JSON.parse(f.record)),journaled:f.journaled===1}},"decodeIncident");function s(d){e.exec("BEGIN IMMEDIATE");try{e.prepare("DELETE FROM schedule_health_states WHERE id NOT IN (SELECT value FROM json_each(?))").run(JSON.stringify(Object.keys(d.states)));let f=e.prepare("INSERT INTO schedule_health_states(id,record) VALUES (?,?) ON CONFLICT(id) DO UPDATE SET record=excluded.record");for(let[m,y]of Object.entries(d.states))f.run(m,JSON.stringify(y));let p=e.prepare("INSERT INTO schedule_health_pending(id,journaled,record) VALUES (?,?,?) ON CONFLICT(id) DO NOTHING");for(let m of d.pending)p.run(m.id,m.journaled?1:0,JSON.stringify(m));e.prepare("UPDATE schedule_health_meta SET sequence=MAX(sequence,?),imported=1 WHERE id=1").run(d.sequence),e.exec("COMMIT")}catch(f){throw e.exec("ROLLBACK"),f}}i(s,"save");async function o(d){r().imported||s(T3.parse(await t()??{states:{},pending:[],sequence:0}));let f=e.prepare("SELECT id,record FROM schedule_health_states WHERE id IN (SELECT value FROM json_each(?))").all(JSON.stringify(d));return{states:Object.fromEntries(f.map(p=>{let m=x3.parse(p);return[m.id,f1.parse(JSON.parse(m.record))]})),pending:[],sequence:r().sequence}}i(o,"read");function a(){let d=e.prepare("SELECT record,journaled FROM schedule_health_pending WHERE journaled=0 ORDER BY position LIMIT 1").get();return d?n(d):null}i(a,"next");function c(d){let f=e.prepare("SELECT record,journaled FROM schedule_health_pending WHERE journaled=1 ORDER BY position LIMIT ?").all(d),{count:p}=$3.parse(e.prepare("SELECT COUNT(*) AS count FROM schedule_health_pending WHERE journaled=1").get());return{incidents:f.map(n),count:p}}i(c,"batch");function l(d){e.prepare("UPDATE schedule_health_pending SET journaled=1 WHERE id=?").run(d)}i(l,"journaled");function u(d){e.prepare("DELETE FROM schedule_health_pending WHERE id IN (SELECT value FROM json_each(?))").run(JSON.stringify(d))}return i(u,"delivered"),{read:o,save:s,next:a,batch:c,journaled:l,delivered:u}}i(m1,"scheduleHealthStorage");import{createHash as g1}from"node:crypto";import{defineRpcContract as I3}from"@get-bb/plugin-sdk";import{z as Ae}from"zod";var cn=Ae.string().regex(/^(?:rec_[a-f0-9]{32}|ORB-[1-9][0-9]{0,8})$/),y1=i(e=>[...e].every(t=>t.charCodeAt(0)>=32&&t.charCodeAt(0)!==127),"noControls"),Zu=Ae.string().min(1).max(300).refine(y1),_S=Ae.array(Ae.string().min(1).max(64).refine(y1)).max(64),vS=Ae.string().max(256e3).refine(e=>Buffer.byteLength(JSON.stringify(e))<=256e3),tv=Ae.string().max(1e6).refine(e=>Buffer.byteLength(JSON.stringify(e))<=1e6),rv=Ae.enum(["backlog","todo","in_progress","in_review","done","canceled"]),kS=Ae.enum(["work","notice","watch"]),Bc=Ae.object({id:cn,key:Zu,kind:kS,title:Ae.string().min(1).max(1e3),description:tv,labels:_S,parent:cn.nullable(),task:Ae.string().regex(/^ORB-[1-9][0-9]{0,8}$/).nullable(),status:rv,createdAt:Ae.number().int().nonnegative(),updatedAt:Ae.number().int().nonnegative()}),w1=Ae.discriminatedUnion("action",[Ae.object({action:Ae.literal("create"),key:Zu,kind:kS,title:Ae.string().min(1).max(1e3),description:vS,labels:_S,parent:cn.nullable()}).strict(),Ae.object({action:Ae.literal("update"),id:cn,key:Zu.optional(),description:vS.optional(),status:rv.optional(),labels:_S.optional(),parent:cn.optional()}).strict(),Ae.object({action:Ae.literal("comment"),id:cn,body:vS.min(1),key:Ae.string().min(1).max(300)}).strict()]),v1=Ae.discriminatedUnion("action",[Ae.object({action:Ae.literal("get"),id:cn}).strict(),Ae.object({action:Ae.literal("find"),key:Zu}).strict(),Ae.object({action:Ae.literal("list"),label:Ae.string().max(64),parent:cn.nullable(),active:Ae.boolean(),after:Ae.number().int().nonnegative(),limit:Ae.number().int().min(1).max(200)}).strict()]),b1=Ae.object({seq:Ae.number().int(),key:Ae.string(),body:tv,actor:Ae.string(),at:Ae.number().int()}),nv=I3({"records.query":{input:v1,output:Ae.object({records:Ae.array(Bc),next:Ae.number().int().nonnegative().nullable()})},"records.change":{input:w1,output:Bc},"records.comments":{input:Ae.object({id:cn,after:Ae.number().int().nonnegative(),limit:Ae.number().int().min(1).max(200)}).strict(),output:Ae.object({comments:Ae.array(b1),next:Ae.number().int().nullable()})}}),_1=["CREATE TABLE event_records (seq INTEGER PRIMARY KEY AUTOINCREMENT, id TEXT UNIQUE NOT NULL, key TEXT UNIQUE NOT NULL, kind TEXT NOT NULL, title TEXT NOT NULL, description TEXT NOT NULL, labels TEXT NOT NULL, parent TEXT, task TEXT, status TEXT NOT NULL, created_at INTEGER NOT NULL, updated_at INTEGER NOT NULL)","CREATE INDEX event_records_parent ON event_records(parent, seq)","CREATE INDEX event_records_active ON event_records(seq) WHERE kind='watch' OR status NOT IN ('done','canceled')","CREATE TABLE event_record_aliases (address TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE event_record_keys (key TEXT PRIMARY KEY, record TEXT NOT NULL)","CREATE TABLE event_record_comments (seq INTEGER PRIMARY KEY AUTOINCREMENT, record TEXT NOT NULL, key TEXT NOT NULL, body TEXT NOT NULL, actor TEXT NOT NULL, at INTEGER NOT NULL, UNIQUE(record, key))","CREATE TABLE event_record_imports (task TEXT PRIMARY KEY, record TEXT NOT NULL, snapshot TEXT NOT NULL, copied_at INTEGER NOT NULL, archived_key TEXT)","CREATE TABLE event_record_revisions (seq INTEGER PRIMARY KEY AUTOINCREMENT, task TEXT NOT NULL, snapshot TEXT NOT NULL)","CREATE INDEX event_record_revisions_task ON event_record_revisions(task,seq)"],k1=Ae.object({seq:Ae.number().int(),id:cn,key:Zu,kind:kS,title:Ae.string(),description:Ae.string(),labels:Ae.string(),parent:cn.nullable(),task:Ae.string().nullable(),status:rv,created_at:Ae.number(),updated_at:Ae.number()}),ev=i(e=>e.toLowerCase().startsWith("review:")?e.toLowerCase():e,"normalizeKey");function bS(e){if(!e)return null;let t=k1.parse(e);return Bc.parse({...t,labels:JSON.parse(t.labels),createdAt:t.created_at,updatedAt:t.updated_at})}i(bS,"read");function E1(e,t){let r=i(a=>bS(e.prepare("SELECT r.* FROM event_records r WHERE r.id = ? OR r.id = (SELECT record FROM event_record_aliases WHERE address = ?)").get(cn.parse(a),a)),"get"),n=i(a=>{let c=ev(Zu.parse(a));return bS(e.prepare("SELECT * FROM event_records WHERE key = ? OR id = (SELECT record FROM event_record_keys WHERE key = ?)").get(c,c))},"find");async function s(a){let c=n(a.key);if(c){if(c.kind!==a.kind||c.parent!==(a.parent?r(a.parent)?.id??a.parent:null))throw new Error("This record key already has another kind or parent");return c}let l=null,u=a.parent;if(a.parent){let m=r(a.parent);if(m&&(u=m.id),l=m?m.task:await t.owner(a.parent),!m&&!l)throw new Error("The record parent is unavailable")}else l=await t.task(a.key);Bc.shape.task.parse(l);let d=ev(a.key),f=`rec_${g1("sha256").update(d).digest("hex").slice(0,32)}`,p=t.now();return e.prepare("INSERT INTO event_records (id,key,kind,title,description,labels,parent,task,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,'todo',?,?) ON CONFLICT(key) DO NOTHING").run(f,d,a.kind,a.title,a.description,JSON.stringify(a.labels),u,l,p,p),n(d)}i(s,"create");async function o(a,c){let l=w1.parse(a);if(l.action==="create")return s(l);let u=r(l.id);if(!u)throw new Error("No system record has this identity");if(l.action==="comment"){let y=Ae.object({body:Ae.string()}).optional().parse(e.prepare("SELECT body FROM event_record_comments WHERE record=? AND key=?").get(u.id,l.key));if(y&&y.body!==l.body)throw new Error("The comment key already names a different result");return e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING").run(u.id,l.key,l.body,c,t.now()),u}let d=u.parent,f=u.task;if(l.parent!==void 0){let y=new Set([u.id]),g=r(l.parent),h=g?g.task:await t.owner(l.parent);if(!g&&!h)throw new Error("The record parent is unavailable");for(f=h;g;){if(y.has(g.id))throw new Error("A record cannot be its own ancestor");y.add(g.id),g=g.parent?r(g.parent):null}d=r(l.parent)?.id??l.parent}if(!f&&l.key&&(f=await t.task(l.key)),u.task&&f!==u.task)throw new Error("A system record cannot change the meaning of its owed task");Bc.shape.task.parse(f);let p=l.key?ev(l.key):u.key,m=n(p);if(m&&m.id!==u.id)throw new Error("The event key already names another system record");return e.transaction(()=>{p!==u.key&&e.prepare("INSERT INTO event_record_keys (key,record) VALUES (?,?) ON CONFLICT(key) DO NOTHING").run(u.key,u.id),e.prepare("UPDATE event_records SET key=?,description=?,status=?,labels=?,parent=?,task=?,updated_at=? WHERE id=?").run(p,l.description??u.description,l.status??u.status,JSON.stringify(l.labels?[...new Set([...u.labels,...l.labels])]:u.labels),d,f,Math.max(t.now(),u.updatedAt+1),u.id)})(),r(u.id)}return i(o,"mutate"),{get:r,find:n,async refresh(a){let c=r(a);if(!c)throw new Error("No system record has this identity");let l=c.parent?r(c.parent):null,u=c.task??l?.task??(c.parent&&!l?await t.owner(c.parent):await t.task(c.key));return Bc.shape.task.parse(u),u&&!c.task&&e.prepare("WITH RECURSIVE children(id) AS (SELECT ? UNION SELECT e.id FROM event_records e JOIN children c ON e.parent=c.id WHERE e.task IS NULL) UPDATE event_records SET task=? WHERE id IN (SELECT id FROM children) AND task IS NULL").run(c.id,u),r(c.id)},change:o,query(a){let c=v1.parse(a);if(c.action==="get"||c.action==="find"){let y=c.action==="get"?r(c.id):n(c.key);return{records:y?[y]:[],next:null}}let l=["seq > ?"],u=[c.after];if(c.active&&l.push("(kind='watch' OR status NOT IN ('done','canceled'))"),c.parent){l.push("(parent = ? OR parent IN (SELECT address FROM event_record_aliases WHERE record = ?))");let y=r(c.parent)?.id??c.parent;u.push(y,y)}c.label&&(l.push("EXISTS (SELECT 1 FROM json_each(event_records.labels) WHERE value = ?)"),u.push(c.label));let d=Ae.array(k1).parse(e.prepare(`SELECT * FROM event_records WHERE ${l.join(" AND ")} ORDER BY seq LIMIT ?`).all(...u,c.limit+1)),f=[],p=0,m=c.after;for(let y of d.slice(0,c.limit)){let g=bS(y),h=Buffer.byteLength(JSON.stringify(g));if(f.length&&p+h>7e5)break;f.push(g),p+=h,m=y.seq}return{records:f,next:d.length>f.length?m:null}},comments(a,c=0,l=100){let u=r(a);if(!u)throw new Error("No system record has this identity");Ae.number().int().nonnegative().parse(c),Ae.number().int().min(1).max(200).parse(l);let d=Ae.array(b1).parse(e.prepare("SELECT seq,key,body,actor,at FROM event_record_comments WHERE record=? AND seq>? ORDER BY seq LIMIT ?").all(u.id,c,l+1)),f=[],p=0;for(let m of d.slice(0,l)){let y=Buffer.byteLength(JSON.stringify(m));if(f.length&&p+y>7e5)break;f.push(m),p+=y}return{comments:f,next:d.length>f.length?f.at(-1).seq:null}},import:e.transaction((a,c,l)=>{if(cn.parse(a),Bc.parse(l),e.prepare("SELECT record FROM event_record_imports WHERE task=?").get(a))return;let d=JSON.stringify(c);if(Buffer.byteLength(d)>1e6)throw new Error("The historical task is too large to copy safely");let f=Ae.object({comments:Ae.array(Ae.object({id:Ae.string().min(1).max(200),body:tv,authorName:Ae.string(),threadId:Ae.string().nullable()}))}).parse(c);n(l.key)||e.prepare("INSERT INTO event_records (id,key,kind,title,description,labels,parent,task,status,created_at,updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?) ON CONFLICT(key) DO NOTHING").run(l.id,ev(l.key),l.kind,l.title,l.description,JSON.stringify(l.labels),l.parent,l.task,l.status,l.createdAt,l.updatedAt);let m=n(l.key);e.prepare("INSERT INTO event_record_aliases (address,record) VALUES (?,?)").run(a,m.id),e.prepare("INSERT INTO event_record_imports (task,record,snapshot,copied_at) VALUES (?,?,?,?)").run(a,m.id,d,t.now());let y=e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING");for(let g of f.comments)y.run(m.id,`legacy:${g.id}`,g.body,g.threadId?`conversation:${g.threadId}`:`history:${g.authorName}`,t.now())}),pendingArchives(){return Ae.array(Ae.object({task:cn,snapshot:Ae.string()})).parse(e.prepare("SELECT i.task,COALESCE((SELECT snapshot FROM event_record_revisions r WHERE r.task=i.task ORDER BY seq DESC LIMIT 1),i.snapshot) AS snapshot FROM event_record_imports i WHERE archived_key IS NULL ORDER BY copied_at,task").all())},captureHistory:e.transaction((a,c)=>{let l=Ae.object({record:Ae.string(),snapshot:Ae.string(),archived_key:Ae.string().nullable()}).parse(e.prepare("SELECT record,snapshot,archived_key FROM event_record_imports WHERE task=?").get(cn.parse(a)));if(l.archived_key)throw new Error("Task history has already moved");let u=JSON.stringify(c);if(Buffer.byteLength(u)>1e6)throw new Error("The historical task is too large to copy safely");let d=Ae.object({task:Ae.object({key:Ae.string(),status:rv,updatedAt:Ae.iso.datetime()}),comments:Ae.array(Ae.object({id:Ae.string(),body:tv,authorName:Ae.string(),threadId:Ae.string().nullable()})),attachments:Ae.array(Ae.object({id:Ae.string()}))}),f=d.parse(JSON.parse(l.snapshot)),p=d.parse(c),m=Ae.object({snapshot:Ae.string()}).optional().parse(e.prepare("SELECT snapshot FROM event_record_revisions WHERE task=? ORDER BY seq DESC LIMIT 1").get(a)),y=d.parse(JSON.parse(m?.snapshot??l.snapshot)).task;if(p.task.key!==f.task.key||f.comments.some(h=>!p.comments.some(w=>w.id===h.id))||f.attachments.some(h=>!p.attachments.some(w=>w.id===h.id)))throw new Error("Task history changed before its final copy");u!==(m?.snapshot??l.snapshot)&&e.prepare("INSERT INTO event_record_revisions (task,snapshot) VALUES (?,?)").run(a,u),e.prepare("UPDATE event_records SET status=?,updated_at=? WHERE id=? AND status=? AND updated_at=?").run(p.task.status,Date.parse(p.task.updatedAt),l.record,y.status,Date.parse(y.updatedAt));let g=e.prepare("INSERT INTO event_record_comments (record,key,body,actor,at) VALUES (?,?,?,?,?) ON CONFLICT(record,key) DO NOTHING");for(let h of p.comments){let w=f.comments.find(E=>E.id===h.id),v=w&&w.body!==h.body?`:${g1("sha256").update(h.body).digest("hex")}`:"";g.run(l.record,`legacy:${h.id}${v}`,h.body,h.threadId?`conversation:${h.threadId}`:`history:${h.authorName}`,t.now())}}),latestCopy(a){return Ae.object({snapshot:Ae.string()}).parse(e.prepare("SELECT COALESCE((SELECT snapshot FROM event_record_revisions r WHERE r.task=i.task ORDER BY seq DESC LIMIT 1),i.snapshot) AS snapshot FROM event_record_imports i WHERE task=?").get(cn.parse(a))).snapshot},copied(a){return e.prepare("SELECT task,record,snapshot,copied_at,archived_key FROM event_record_imports WHERE task=?").get(cn.parse(a))},archived(a,c){Ae.string().regex(/^ORBH-[1-9][0-9]{0,8}$/).parse(c),e.prepare("UPDATE event_record_imports SET archived_key=? WHERE task=?").run(c,cn.parse(a))}}}i(E1,"eventRecords");var S1=["CREATE TABLE standing_questions (id TEXT PRIMARY KEY, station TEXT NOT NULL, request TEXT NOT NULL, intent TEXT NOT NULL, state TEXT NOT NULL, job TEXT NOT NULL, UNIQUE(station,request))","CREATE UNIQUE INDEX standing_waiting ON standing_questions(station) WHERE state='waiting'","CREATE TABLE standing_decisions (id TEXT PRIMARY KEY, station TEXT NOT NULL, receipt TEXT NOT NULL)","CREATE TABLE standing_audit (seq INTEGER PRIMARY KEY AUTOINCREMENT, at INTEGER NOT NULL, station TEXT NOT NULL, event TEXT NOT NULL, decision TEXT NOT NULL, request TEXT NOT NULL, record TEXT NOT NULL)","CREATE UNIQUE INDEX standing_use ON standing_audit(station,request,decision) WHERE event='use'","CREATE UNIQUE INDEX standing_result ON standing_audit(station,request,decision) WHERE event='result'",...["standing_decisions","standing_audit"].flatMap(e=>[`CREATE TRIGGER ${e}_no_update BEFORE UPDATE ON ${e} BEGIN SELECT RAISE(ABORT,'standing history is immutable'); END`,`CREATE TRIGGER ${e}_no_delete BEFORE DELETE ON ${e} BEGIN SELECT RAISE(ABORT,'standing history is immutable'); END`])];import{defineRpcContract as R3}from"@get-bb/plugin-sdk";import{z as ur}from"zod";var O1=[`CREATE TABLE orbit_threads (thread_id TEXT PRIMARY KEY, orbit_thread TEXT NOT NULL, root_seq INTEGER NOT NULL,
|
|
602
602
|
root_text TEXT NOT NULL, created_at INTEGER NOT NULL, last_activity_at INTEGER NOT NULL,
|
|
603
603
|
replies INTEGER NOT NULL DEFAULT 0, outcomes TEXT NOT NULL DEFAULT '[]', UNIQUE(orbit_thread, root_seq))`],$1=["ALTER TABLE orbit_threads ADD COLUMN done_after_seq INTEGER"],P3="threads",Da=ur.string().regex(/^thr_[a-z0-9]+$/),I1=ur.object({at:ur.number().int(),text:ur.string()}),N3=ur.object({threadId:Da,rootSeq:ur.number().int().nonnegative(),rootPreview:ur.string(),running:ur.boolean(),done:ur.boolean(),createdAt:ur.number().int(),lastActivityAt:ur.number().int(),replies:ur.number().int().nonnegative(),outcomes:ur.array(I1)}),C3=R3({"threads.home":{input:ur.null(),output:ur.object({orbitThread:Da.nullable()})},"threads.list":{input:ur.object({orbitThread:Da}).strict(),output:ur.object({threads:ur.array(N3)})},"threads.done":{input:ur.object({orbitThread:Da,threadId:Da}).strict(),output:ur.object({threadId:Da})},"threads.open":{input:ur.object({orbitThread:Da,rootSeq:ur.number().int().nonnegative(),forkAt:ur.number().int().nonnegative(),rootText:ur.string().max(2e4)}).strict(),output:ur.object({threadId:Da})}});function R1(e,t){return e.kind==="conversation"&&e.threadId===t&&(e.role==="assistant"||e.initiator==="user"&&e.senderThreadId===null&&e.systemMessageKind==="unlabeled")}i(R1,"mainChatMessage");async function P1(e,t){let r={threadId:t,includeNestedRows:"true"},n=new Map;function s(o){for(let a of o){R1(a,t)&&n.set(a.messageSeq,{seq:a.messageSeq,author:a.role==="user"?"owner":"Moonlet",at:a.createdAt,preview:a.text.replace(/\s+/g," ").trim().slice(0,600)});let c="children"in a?a.children:"childRows"in a?a.childRows:null;c&&s(c)}}for(i(s,"collect");;){let o=await e.sdk.threads.timeline(r);s(o.rows);let a=o.timelinePage.olderCursor;if(n.size>=30||!a)return[...n.values()].sort((c,l)=>l.seq-c.seq).slice(0,30).reverse();r={...r,beforeAnchorId:a.anchorId,beforeAnchorSeq:String(a.anchorSeq)}}}i(P1,"recentMessages");async function N1(e,t,r){let n={threadId:t,includeNestedRows:"true"};function s(o){for(let a of o){if(R1(a,t)&&a.messageSeq===r)return{text:a.text,forkAt:a.sourceSeqEnd};let c="children"in a?a.children:"childRows"in a?a.childRows:null,l=c?s(c):null;if(l)return l}return null}for(i(s,"find");;){let o=await e.sdk.threads.timeline(n),a=s(o.rows);if(a)return a;let c=o.timelinePage.olderCursor;if(!c)throw new Error(`Message ${r} isn't a message in the Moonlet conversation.`);n={...n,beforeAnchorId:c.anchorId,beforeAnchorSeq:String(c.anchorSeq)}}}i(N1,"threadRoot");var C1=2e3,T1=300,L3=20,A1=i((e,t)=>({threadId:e.thread_id,rootSeq:e.root_seq,rootPreview:e.root_text.slice(0,600),running:t.has(e.thread_id),done:e.done_after_seq!==null,createdAt:e.created_at,lastActivityAt:e.last_activity_at,replies:e.replies,outcomes:ur.array(I1).parse(JSON.parse(e.outcomes))}),"toSummary");function L1(e,t,r){return e.sourceThreadId===t&&e.lifecycleOwnerThreadId===t&&e.visibility==="hidden"&&e.originKind==="fork"&&e.originPluginId===r&&e.archivedAt===null&&e.deletedAt===null}i(L1,"isOrbitThreadFork");function D3(e){let t=e.replace(/\s+/g," ").trim();return`Thread: ${t.length>60?`${t.slice(0,59)}\u2026`:t||"a message"}`}i(D3,"threadTitle");function j3(e,t,r=!1){return["This is a thread about one message in your conversation with the owner, quoted below.","Keep this conversation to it.",...r?["Your context runs past that message: bb couldn't start this thread exactly there, so it","carries the conversation up to now. Treat what came after the message as background and",`keep to the message itself; \`bb thread show ${e}\` reads the main conversation.`]:["Everything said before that message is already in your context; the main conversation may",`have moved on since: \`bb thread show ${e}\` reads it.`],"When this thread reaches an outcome (done, decided or blocked), say it in one line with","`bb orbit thread outcome --text '<line>'`: it goes under the message in the main conversation.","","The message:",...t.slice(0,C1).split(`
|
|
604
604
|
`).map(s=>`> ${s}`)].join(`
|