@danypops/pi-packed 0.19.9 → 0.19.11

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.
Files changed (87) hide show
  1. package/dist/client.d.ts +109 -0
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +1 -0
  4. package/dist/protocol.d.ts +221 -0
  5. package/dist/protocol.d.ts.map +1 -0
  6. package/dist/protocol.js +1 -0
  7. package/extension/src/approval/permission.ts +1 -1
  8. package/extension/src/packed.ts +2 -2
  9. package/extension/src/tabs/security-tui.ts +1 -1
  10. package/extension/src/tool-output.ts +1 -1
  11. package/package.json +31 -8
  12. package/service/schema/pi-setup-v1.schema.json +70 -0
  13. package/service/setup/danypops-ecosystem.pi-setup.json +15 -0
  14. package/service/src/adoption/advisories.ts +268 -0
  15. package/service/src/adoption/check.ts +872 -0
  16. package/service/src/adoption/commit-freshness.ts +167 -0
  17. package/service/src/adoption/doctor.ts +135 -0
  18. package/service/src/adoption/install-validation.ts +187 -0
  19. package/service/src/adoption/pack.ts +291 -0
  20. package/service/src/adoption/score.ts +466 -0
  21. package/service/src/adoption/smoke-child.ts +113 -0
  22. package/service/src/adoption/smoke.ts +282 -0
  23. package/service/src/cli/cli.ts +926 -0
  24. package/service/src/daemon/cleanup.ts +76 -0
  25. package/service/src/daemon/client.ts +412 -0
  26. package/service/src/daemon/daemon-service.ts +249 -0
  27. package/service/src/daemon/daemon.ts +110 -0
  28. package/service/src/daemon/service.ts +664 -0
  29. package/service/src/daemon/watcher.ts +92 -0
  30. package/service/src/index/build-index.ts +256 -0
  31. package/service/src/packages/catalog.ts +61 -0
  32. package/service/src/packages/db.ts +224 -0
  33. package/service/src/packages/install.ts +60 -0
  34. package/service/src/packages/installed.ts +123 -0
  35. package/service/src/packages/package.ts +141 -0
  36. package/service/src/packages/resources.ts +203 -0
  37. package/service/src/pi/pi-version.ts +171 -0
  38. package/service/src/public/atomic-json.ts +32 -0
  39. package/service/src/public/client.ts +277 -0
  40. package/service/src/public/protocol.ts +169 -0
  41. package/service/src/publish/publish.ts +855 -0
  42. package/service/src/registry/registry.ts +246 -0
  43. package/service/src/security/security.ts +128 -0
  44. package/service/src/self-update/self-update.ts +148 -0
  45. package/service/src/setup/setup.ts +761 -0
  46. package/service/src/shared/atomic-json.ts +33 -0
  47. package/service/src/shared/cache.ts +21 -0
  48. package/service/src/shared/constants.ts +73 -0
  49. package/service/src/shared/log.ts +21 -0
  50. package/service/src/shared/paths.ts +88 -0
  51. package/service/src/shared/state.ts +15 -0
  52. package/service/src/shared/version.ts +46 -0
  53. package/service/test/advisories.test.ts +287 -0
  54. package/service/test/check.test.ts +368 -0
  55. package/service/test/cleanup.test.ts +220 -0
  56. package/service/test/cli.test.ts +1303 -0
  57. package/service/test/core.test.ts +181 -0
  58. package/service/test/daemon-kit-migration.test.ts +181 -0
  59. package/service/test/daemon-service.test.ts +238 -0
  60. package/service/test/db.test.ts +178 -0
  61. package/service/test/doctor.test.ts +234 -0
  62. package/service/test/domain.test.ts +291 -0
  63. package/service/test/fixtures/install-validation/broken-package/extension/index.ts +3 -0
  64. package/service/test/fixtures/install-validation/broken-package/package.json +8 -0
  65. package/service/test/fixtures/install-validation/healthy-package/extension/index.ts +3 -0
  66. package/service/test/fixtures/install-validation/healthy-package/package.json +8 -0
  67. package/service/test/fixtures/install-validation/no-manifest-package/package.json +5 -0
  68. package/service/test/index.test.ts +353 -0
  69. package/service/test/install-validation.test.ts +114 -0
  70. package/service/test/install.test.ts +113 -0
  71. package/service/test/log.test.ts +42 -0
  72. package/service/test/pack-score.test.ts +513 -0
  73. package/service/test/pi-version.test.ts +318 -0
  74. package/service/test/public-boundary.test.ts +54 -0
  75. package/service/test/public-client.test.ts +127 -0
  76. package/service/test/public-consumer.ts +8 -0
  77. package/service/test/publish.test.ts +333 -0
  78. package/service/test/registry-contract.test.ts +148 -0
  79. package/service/test/resources.test.ts +255 -0
  80. package/service/test/security.test.ts +89 -0
  81. package/service/test/self-update.test.ts +257 -0
  82. package/service/test/service.test.ts +555 -0
  83. package/service/test/setup.test.ts +375 -0
  84. package/service/test/smoke.test.ts +118 -0
  85. package/service/test/version.test.ts +37 -0
  86. package/service/tsconfig.consumer.json +13 -0
  87. package/service/tsconfig.public.json +12 -0
@@ -0,0 +1,109 @@
1
+ import type { ExtensionOperationOutputs, PackageInfo, PackageResources, PackageSummary, PiStatus, ResourceField, SecuritySettings, ServiceSpecSummary, SetupApplyResult, SetupPlan, UpdateEntry, UpdateOutcome } from "./protocol.js";
2
+ /** notADaemon: the overwhelmingly common case for install() -- most Pi packages aren't daemons at all. Distinct from a real installService failure (systemctl unavailable, spec resolved but installation itself failed). */
3
+ export declare class InstallServiceError extends Error {
4
+ readonly notADaemon?: boolean | undefined;
5
+ constructor(message: string, notADaemon?: boolean | undefined);
6
+ }
7
+ export interface PackedClientPaths {
8
+ token: string;
9
+ handle: string;
10
+ serviceDescriptor: string;
11
+ }
12
+ export interface PackedPathOptions {
13
+ env?: Record<string, string | undefined>;
14
+ home?: string;
15
+ platform?: NodeJS.Platform;
16
+ }
17
+ export interface PackedExtensionClient {
18
+ search(query: string, limit: number, offline?: boolean): Promise<{
19
+ query: string;
20
+ total: number;
21
+ results: PackageSummary[];
22
+ }>;
23
+ info(name: string): Promise<PackageInfo>;
24
+ installed(): Promise<ExtensionOperationOutputs["package.installed"]>;
25
+ updates(): Promise<UpdateEntry[]>;
26
+ security(): Promise<SecuritySettings>;
27
+ setMutationApproval(value: SecuritySettings["mutationApproval"], approved?: boolean): Promise<SecuritySettings>;
28
+ install(source: string, approved?: boolean): Promise<string>;
29
+ installService(source: string, approved?: boolean): Promise<{
30
+ output: string;
31
+ spec?: ServiceSpecSummary;
32
+ }>;
33
+ remove(name: string, approved?: boolean): Promise<string>;
34
+ update(source: string, approved?: boolean): Promise<UpdateOutcome>;
35
+ setupPlan(manifestPath: string, prune?: boolean): Promise<SetupPlan>;
36
+ setupApply(manifestPath: string, approved?: boolean, prune?: boolean): Promise<SetupApplyResult>;
37
+ listResources(projectRoot?: string): Promise<{
38
+ global: PackageResources[];
39
+ project: PackageResources[];
40
+ }>;
41
+ toggleResource(source: string, field: ResourceField, path: string, enabled: boolean, projectRoot?: string, approved?: boolean): Promise<string>;
42
+ piStatus(): Promise<PiStatus>;
43
+ }
44
+ export declare function resolvePackedClientPaths(options?: PackedPathOptions): PackedClientPaths;
45
+ export type FetchTransport = (request: Request) => Promise<Response>;
46
+ export declare class PackedClient implements PackedExtensionClient {
47
+ private readonly rpc;
48
+ constructor(base: string, token: string, transport?: FetchTransport);
49
+ private call;
50
+ health(): Promise<unknown>;
51
+ search(query: string, limit: number, offline?: boolean): Promise<{
52
+ query: string;
53
+ total: number;
54
+ results: PackageSummary[];
55
+ offline?: boolean;
56
+ }>;
57
+ info(name: string): Promise<PackageInfo>;
58
+ installed(): Promise<import("./protocol.js").InstalledPackage[]>;
59
+ updates(): Promise<UpdateEntry[]>;
60
+ security(): Promise<SecuritySettings>;
61
+ setMutationApproval(mutationApproval: SecuritySettings["mutationApproval"], approved?: boolean): Promise<SecuritySettings>;
62
+ install(source: string, approved?: boolean): Promise<string>;
63
+ installService(source: string, approved?: boolean): Promise<{
64
+ output: string;
65
+ spec: ServiceSpecSummary | undefined;
66
+ }>;
67
+ remove(name: string, approved?: boolean): Promise<string>;
68
+ update(source: string, approved?: boolean): Promise<UpdateOutcome>;
69
+ setupPlan(manifestPath: string, prune?: boolean): Promise<SetupPlan>;
70
+ setupApply(manifestPath: string, approved?: boolean, prune?: boolean): Promise<SetupApplyResult>;
71
+ listResources(projectRoot?: string): Promise<{
72
+ global: PackageResources[];
73
+ project: PackageResources[];
74
+ }>;
75
+ toggleResource(source: string, field: ResourceField, path: string, enabled: boolean, projectRoot?: string, approved?: boolean): Promise<string>;
76
+ piStatus(): Promise<PiStatus>;
77
+ }
78
+ export declare function connectPackedClient(paths?: PackedClientPaths, transport?: FetchTransport): Promise<PackedClient>;
79
+ export interface EnsureClientDeps {
80
+ connect(): Promise<PackedClient>;
81
+ /** Real OS check, not a guess -- does this machine have a supervised
82
+ * service registered for this daemon (systemd --user unit / launchd
83
+ * plist / Windows Run key)? */
84
+ isServiceInstalled(): boolean;
85
+ /** Spawns a detached, self-contained daemon for this session only.
86
+ * Never called when isServiceInstalled() is true. */
87
+ spawn(): void;
88
+ sleep(ms: number): Promise<void>;
89
+ retryAttempts?: number;
90
+ retryDelayMs?: number;
91
+ }
92
+ /**
93
+ * Pure connect-or-provision decision, fully dependency-injected and
94
+ * unit-testable without a real filesystem, subprocess, or network call.
95
+ *
96
+ * A real, confirmed hazard motivates the isServiceInstalled() branch: an
97
+ * auto-spawned orphan gets vehicle-server's 30-minute idle budget (vs. a
98
+ * supervised service's own, typically much shorter, policy), so it can
99
+ * keep winning vehicle-server's single-instance lock race against every
100
+ * subsequent supervised restart, invisibly, for up to half an hour. When a
101
+ * service is installed, this never spawns a second, differently-supervised
102
+ * process -- it retries the connection instead, on the assumption the
103
+ * supervisor is responsible for the daemon actually being reachable, and
104
+ * fails with a message pointing at the service rather than silently
105
+ * creating a competing one.
106
+ */
107
+ export declare function ensureClient(deps: EnsureClientDeps): Promise<PackedClient>;
108
+ export declare function ensurePackedClient(paths?: PackedClientPaths, transport?: FetchTransport): Promise<PackedClient>;
109
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../service/src/public/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1 @@
1
+ import{spawn as N}from"node:child_process";import{existsSync as A,readFileSync as L}from"node:fs";import{dirname as w,join as E,resolve as I}from"node:path";import{fileURLToPath as b}from"node:url";class q{baseUrl;token;opsPath;transport;label;constructor(z,G,J){this.baseUrl=z;this.token=G;this.label=J.label,this.opsPath=J.opsPath??"/api/v1/ops",this.transport=J.transport??fetch}authedRequest(z,G={}){return this.transport(new Request(`${this.baseUrl}${z}`,{...G,headers:{...G.headers,authorization:`Bearer ${this.token}`}}))}async call(z,G){let J=await this.authedRequest(this.opsPath,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({op:z,input:G})}),Z=await J.json();if(!J.ok)throw Error(Z.error??`${this.label} operation failed with HTTP ${J.status}`);return Z.result}async operations(){let z=await this.authedRequest(this.opsPath),G=await z.json();if(!z.ok)throw Error(G.error??`${this.label} discovery failed with HTTP ${z.status}`);return G.operations??[]}async ready(){let z=await this.authedRequest("/ready");if(z.status===503)return!1;if(!z.ok)throw Error(`${this.label} readiness check failed with HTTP ${z.status}`);return!0}async health(){let z=await this.authedRequest("/health"),G=await z.json();if(!z.ok||G.ok!==!0||typeof G.version!=="string")throw Error(G.error??`${this.label} health check failed`);return{ok:!0,version:G.version}}}import{chmodSync as h,existsSync as m,mkdirSync as l,readFileSync as D,renameSync as d,rmSync as c,writeFileSync as i}from"node:fs";import{homedir as g,tmpdir as C}from"node:os";import{dirname as n,join as $,win32 as Q}from"node:path";var x="127.0.0.1";function V(z,G={}){let J=G.platform??process.platform,Z=G.home??g();if(J==="darwin")return _(z,Z);if(J==="win32")return j(z,G.env??process.env,Z);return R(z,G,Z)}function R(z,G,J){let Z=G.env??process.env,K=G.uid??process.getuid?.()??0,W=Z.XDG_DATA_HOME??$(J,".local","share"),Y=Z.XDG_STATE_HOME??$(J,".local","state"),F=Z.XDG_RUNTIME_DIR??$("/run","user",String(K)),O=Z.XDG_CONFIG_HOME??$(J,".config");return{database:$(W,z.stateDirectoryName,z.databaseFilename),token:$(Y,z.stateDirectoryName,z.tokenFilename),handle:$(F,z.stateDirectoryName,z.handleFilename),serviceDescriptor:$(O,"systemd","user",z.systemdUnitName)}}function _(z,G){let J=$(G,"Library"),Z=$(J,"Application Support",z.stateDirectoryName);return{database:$(Z,z.databaseFilename),token:$(Z,z.tokenFilename),handle:$(C(),z.stateDirectoryName,z.handleFilename),serviceDescriptor:$(Z,z.systemdUnitName)}}function j(z,G,J){let Z=G.LOCALAPPDATA??Q.join(J,"AppData","Local"),K=G.APPDATA??Q.join(J,"AppData","Roaming"),W=Q.join(Z,z.stateDirectoryName,"Data");return{database:Q.join(W,z.databaseFilename),token:Q.join(W,z.tokenFilename),handle:Q.join(Z,"Temp",z.stateDirectoryName,z.handleFilename),serviceDescriptor:Q.join(K,z.stateDirectoryName,"Config",z.systemdUnitName)}}function B(z){try{let G=JSON.parse(D(z,"utf8"));if(G.host!==x||!Number.isInteger(G.port)||G.port<1||G.port>65535||!Number.isInteger(G.pid))return null;return G}catch{return null}}function X(z,G){if((G.platform??process.platform)==="win32")return G.runCommand("reg.exe",["query","HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run","/v",z.name]).ok;return G.fileExists(z.descriptorPath)}class U extends Error{notADaemon;constructor(z,G){super(z);this.notADaemon=G;this.name="InstallServiceError"}}var f="pi-packed",H="pi-packed.service";function T(z={}){let G=z.env??process.env;if(G.PI_PACKED_HOME){let Z=I(G.PI_PACKED_HOME);return{token:`${Z}/token`,handle:`${Z}/handle.json`,serviceDescriptor:`${Z}/${H}`}}let J=V({stateDirectoryName:"pi-packed",databaseFilename:"packages.db",tokenFilename:"token",handleFilename:"handle.json",systemdUnitName:H},z);return{token:J.token,handle:J.handle,serviceDescriptor:J.serviceDescriptor}}function S(z){return X({name:f,binPath:"",descriptorPath:z},{fileExists:A,writeFile:()=>{},readFile:()=>null,removeFile:()=>{},mkdirp:()=>{},runCommand:()=>({ok:!1,output:""}),which:()=>!1})}function k(z,G=30000){return(J)=>z(new Request(J,{signal:AbortSignal.any([J.signal,AbortSignal.timeout(G)])}))}class M{rpc;constructor(z,G,J=fetch){this.rpc=new q(z,G,{label:"Packed",transport:k(J)})}call(z,G){return this.rpc.call(z,G)}health(){return this.rpc.health()}search(z,G,J=!1){return this.call("package.search",{query:z,limit:G,offline:J})}info(z){return this.call("package.info",{name:z})}installed(){return this.call("package.installed",{})}async updates(){return(await this.call("package.updates",{})).updates}security(){return this.call("package.security.get",{})}setMutationApproval(z,G=!1){return this.call("package.security.set",{mutationApproval:z,approved:G})}async install(z,G=!1){let J=await this.call("package.install",{source:z,approved:G});if(!J.ok)throw Error(J.output);return J.output}async installService(z,G=!1){let J=await this.call("package.install_service",{source:z,approved:G});if(!J.ok)throw new U(J.output,J.notADaemon);return{output:J.output,spec:J.spec}}async remove(z,G=!1){let J=await this.call("package.remove",{name:z,approved:G});if(!J.ok)throw Error(J.output);return J.output}async update(z,G=!1){let J=await this.call("package.update",{source:z,approved:G});if(!J.ok)throw Error(J.output);return{output:J.output,reloadRequired:J.reloadRequired??!0,alreadyUpToDate:J.alreadyUpToDate??!1,pinned:J.pinned??!1,previousVersion:J.previousVersion,currentVersion:J.currentVersion}}setupPlan(z,G=!1){return this.call("setup.plan",{manifestPath:z,prune:G})}setupApply(z,G=!1,J=!1){return this.call("setup.apply",{manifestPath:z,approved:G,prune:J})}listResources(z){return this.call("resources.list",{projectRoot:z})}async toggleResource(z,G,J,Z,K,W=!1){let Y=await this.call("resources.toggle",{source:z,field:G,path:J,enabled:Z,projectRoot:K,approved:W});if(!Y.ok)throw Error(Y.output);return Y.output}piStatus(){return this.call("pi.status",{})}}async function y(z=T(),G=fetch){let J=B(z.handle);if(!J)throw Error("Packed daemon is not running");let Z;try{Z=L(z.token,"utf8").trim()}catch{throw Error("Packed daemon token is unavailable")}if(!/^[a-f0-9]{64}$/.test(Z))throw Error("Packed daemon token is invalid");let K=new M(`http://${J.host}:${J.port}`,Z,G);return await K.health(),K}async function P(z){try{return await z.connect()}catch{}let G=z.retryAttempts??30,J=z.retryDelayMs??100,Z=z.isServiceInstalled();if(!Z)z.spawn();for(let W=0;W<G;W++){await z.sleep(J);try{return await z.connect()}catch{}}let K=G*J/1000;throw Error(Z?`Packed daemon did not become ready within ${K} seconds, but a supervised service is installed -- check it directly (e.g. systemctl --user status pi-packed.service) rather than auto-spawning a second one`:`Packed daemon did not become ready within ${K} seconds`)}async function $z(z=T(),G=fetch){return P({connect:()=>y(z,G),isServiceInstalled:()=>S(z.serviceDescriptor),spawn:()=>{let J=process.env.PI_PACKED_BIN,Z=J??process.env.PI_PACKED_BUN??"bun",K=J?["serve"]:[E(w(b(import.meta.url)),"../service/src/cli/cli.ts"),"serve"],W=N(Z,K,{detached:!0,stdio:"ignore",env:{...process.env,DAEMON_KIT_LAUNCH_PROVENANCE:"auto-spawn"}});W.once("error",()=>{}),W.unref()},sleep:(J)=>new Promise((Z)=>setTimeout(Z,J))})}export{T as resolvePackedClientPaths,$z as ensurePackedClient,P as ensureClient,y as connectPackedClient,M as PackedClient,U as InstallServiceError};
@@ -0,0 +1,221 @@
1
+ export interface PackageEvidence {
2
+ shape: "keyword-only" | "manifest" | "conventional";
3
+ verified: boolean;
4
+ evidence: string[];
5
+ }
6
+ export interface PublicationEvidence {
7
+ integrity?: string;
8
+ provenanceUrl?: string;
9
+ trustedPublisher: "verified" | "not-verified" | "unknown";
10
+ }
11
+ export interface PackageSummary {
12
+ name: string;
13
+ version: string;
14
+ description?: string;
15
+ date?: string;
16
+ packageEvidence?: PackageEvidence;
17
+ publication?: PublicationEvidence;
18
+ }
19
+ export interface PackageInfo extends PackageSummary {
20
+ homepage?: string;
21
+ repository?: string;
22
+ license?: string;
23
+ keywords?: string[];
24
+ pi?: Record<string, unknown>;
25
+ modified?: string;
26
+ unpackedSize?: number;
27
+ readme?: string;
28
+ readmeAvailable?: boolean;
29
+ bugs?: string;
30
+ peerDependencies?: Record<string, string>;
31
+ }
32
+ export interface InstalledPackage {
33
+ name: string;
34
+ pinned?: string;
35
+ installed?: string;
36
+ }
37
+ export interface UpdateEntry {
38
+ name: string;
39
+ installed: string;
40
+ latest: string;
41
+ detectedAt?: string;
42
+ }
43
+ export interface UpdateOutcome {
44
+ output: string;
45
+ reloadRequired: boolean;
46
+ alreadyUpToDate: boolean;
47
+ pinned: boolean;
48
+ previousVersion?: string;
49
+ currentVersion?: string;
50
+ }
51
+ export interface Diagnostic {
52
+ code: string;
53
+ severity: "error" | "warning" | "info";
54
+ path: string;
55
+ message: string;
56
+ fix?: string;
57
+ }
58
+ export interface SetupOperation {
59
+ kind: "install-package" | "update-package" | "remove-package" | "write-profile" | "remove-profile";
60
+ packageName?: string;
61
+ name?: string;
62
+ scope: "global" | "project";
63
+ source?: string;
64
+ resolved?: string;
65
+ fields?: string[];
66
+ }
67
+ export interface SetupPlan {
68
+ ok: boolean;
69
+ manifestPath: string;
70
+ operations: SetupOperation[];
71
+ manifestSha256?: string;
72
+ prune?: boolean;
73
+ diagnostics: Diagnostic[];
74
+ }
75
+ export interface SetupApplyResult {
76
+ ok: boolean;
77
+ manifestPath: string;
78
+ operations: Array<{
79
+ kind: SetupOperation["kind"];
80
+ target: string;
81
+ status: "succeeded" | "failed";
82
+ output?: string;
83
+ }>;
84
+ reloadRequired: boolean;
85
+ diagnostics: Diagnostic[];
86
+ }
87
+ export interface SecuritySettings {
88
+ mutationApproval: "always" | "never";
89
+ }
90
+ export type ResourceField = "extensions" | "skills" | "prompts" | "themes";
91
+ export interface ResourceItem {
92
+ path: string;
93
+ enabled: boolean;
94
+ }
95
+ export type PackageResources = {
96
+ source: string;
97
+ name: string;
98
+ scope: "global" | "project";
99
+ } & Record<ResourceField, ResourceItem[]>;
100
+ export interface ServiceSpecSummary {
101
+ name: string;
102
+ binPath: string;
103
+ descriptorPath: string;
104
+ }
105
+ /** Mirrors service/src/pi/pi-version.ts's CURRENT_PI_PACKAGE_NAME
106
+ * literal -- not a shared import, since the public boundary deliberately
107
+ * stays free of internal runtime-specific modules. Keep the two in sync by hand. */
108
+ export declare const PI_COMMAND_NAME = "@earendil-works/pi-coding-agent";
109
+ /** Mirrors pi/pi-version.ts's PiVersionReport. */
110
+ export interface PiStatus {
111
+ current?: string;
112
+ latest?: string;
113
+ upToDate?: boolean;
114
+ packageName?: string;
115
+ note?: string;
116
+ }
117
+ export type ExtensionOperationName = "package.search" | "package.info" | "package.installed" | "package.updates" | "package.security.get" | "package.security.set" | "package.install" | "package.install_service" | "package.remove" | "package.update" | "setup.plan" | "setup.apply" | "resources.list" | "resources.toggle" | "pi.status";
118
+ export interface ExtensionOperationInputs {
119
+ "package.search": {
120
+ query: string;
121
+ limit: number;
122
+ offline?: boolean;
123
+ };
124
+ "package.info": {
125
+ name: string;
126
+ };
127
+ "package.installed": Record<string, never>;
128
+ "package.updates": Record<string, never>;
129
+ "pi.status": Record<string, never>;
130
+ "package.security.get": Record<string, never>;
131
+ "package.security.set": {
132
+ mutationApproval: SecuritySettings["mutationApproval"];
133
+ approved?: boolean;
134
+ };
135
+ "package.install": {
136
+ source: string;
137
+ approved?: boolean;
138
+ };
139
+ "package.install_service": {
140
+ source: string;
141
+ approved?: boolean;
142
+ };
143
+ "package.remove": {
144
+ name: string;
145
+ approved?: boolean;
146
+ };
147
+ "package.update": {
148
+ source: string;
149
+ approved?: boolean;
150
+ };
151
+ "setup.plan": {
152
+ manifestPath: string;
153
+ prune?: boolean;
154
+ };
155
+ "setup.apply": {
156
+ manifestPath: string;
157
+ approved?: boolean;
158
+ prune?: boolean;
159
+ };
160
+ "resources.list": {
161
+ projectRoot?: string;
162
+ };
163
+ "resources.toggle": {
164
+ source: string;
165
+ field: ResourceField;
166
+ path: string;
167
+ enabled: boolean;
168
+ projectRoot?: string;
169
+ approved?: boolean;
170
+ };
171
+ }
172
+ export interface ExtensionOperationOutputs {
173
+ "package.search": {
174
+ query: string;
175
+ total: number;
176
+ results: PackageSummary[];
177
+ offline?: boolean;
178
+ };
179
+ "package.info": PackageInfo;
180
+ "package.installed": InstalledPackage[];
181
+ "package.updates": {
182
+ updates: UpdateEntry[];
183
+ };
184
+ "package.security.get": SecuritySettings;
185
+ "package.security.set": SecuritySettings;
186
+ "package.install": {
187
+ ok: boolean;
188
+ output: string;
189
+ };
190
+ "package.install_service": {
191
+ ok: boolean;
192
+ output: string;
193
+ spec?: ServiceSpecSummary;
194
+ notADaemon?: boolean;
195
+ };
196
+ "package.remove": {
197
+ ok: boolean;
198
+ output: string;
199
+ };
200
+ "package.update": {
201
+ ok: boolean;
202
+ output: string;
203
+ reloadRequired?: boolean;
204
+ alreadyUpToDate?: boolean;
205
+ pinned?: boolean;
206
+ previousVersion?: string;
207
+ currentVersion?: string;
208
+ };
209
+ "setup.plan": SetupPlan;
210
+ "setup.apply": SetupApplyResult;
211
+ "resources.list": {
212
+ global: PackageResources[];
213
+ project: PackageResources[];
214
+ };
215
+ "resources.toggle": {
216
+ ok: boolean;
217
+ output: string;
218
+ };
219
+ "pi.status": PiStatus;
220
+ }
221
+ //# sourceMappingURL=protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../service/src/public/protocol.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ var a="@earendil-works/pi-coding-agent";export{a as PI_COMMAND_NAME};
@@ -1,4 +1,4 @@
1
- import type { SecuritySettings } from "@danypops/packed/protocol";
1
+ import type { SecuritySettings } from "@danypops/pi-packed/protocol";
2
2
 
3
3
  export type PackageOperation = "install" | "update" | "remove" | "toggle";
4
4
 
@@ -17,7 +17,7 @@
17
17
  * twice) if the retried call actually reached the daemon the first time.
18
18
  */
19
19
 
20
- import { ensurePackedClient, InstallServiceError, type PackedExtensionClient } from "@danypops/packed/client";
20
+ import { ensurePackedClient, InstallServiceError, type PackedExtensionClient } from "@danypops/pi-packed/client";
21
21
  import {
22
22
  type InstalledPackage,
23
23
  type PackageInfo,
@@ -32,7 +32,7 @@ import {
32
32
  type SetupPlan,
33
33
  type UpdateEntry,
34
34
  type UpdateOutcome,
35
- } from "@danypops/packed/protocol";
35
+ } from "@danypops/pi-packed/protocol";
36
36
  import { createRetryingClient } from "@danypops/vehicle-client/daemon-client";
37
37
 
38
38
  export type { PackageInfo, PackageResources, PackageSummary, PiStatus, ResourceField, UpdateEntry, UpdateOutcome };
@@ -8,7 +8,7 @@
8
8
  * different TUI" complaint the other three tabs had.
9
9
  */
10
10
 
11
- import type { SecuritySettings } from "@danypops/packed/protocol";
11
+ import type { SecuritySettings } from "@danypops/pi-packed/protocol";
12
12
  import { rawKeyHint } from "@earendil-works/pi-coding-agent";
13
13
  import { truncateToWidth } from "@earendil-works/pi-tui";
14
14
  import type { Component } from "malevich-tui-components";
@@ -1,4 +1,4 @@
1
- import type { PackageSummary as Pkg, PackageInfo as PkgInfo } from "@danypops/packed/protocol";
1
+ import type { PackageSummary as Pkg, PackageInfo as PkgInfo } from "@danypops/pi-packed/protocol";
2
2
  import type { AgentToolResult, Theme } from "@earendil-works/pi-coding-agent";
3
3
  import { Text, truncateToWidth } from "@earendil-works/pi-tui";
4
4
  import {
package/package.json CHANGED
@@ -1,31 +1,54 @@
1
1
  {
2
2
  "name": "@danypops/pi-packed",
3
- "version": "0.19.9",
4
- "description": "Pi package tools, commands, profiles, and TUI for the Packed daemon",
3
+ "version": "0.19.11",
4
+ "description": "Pi package lifecycle, validation, daemon, tools, profiles, and TUI",
5
5
  "type": "module",
6
+ "bin": {
7
+ "packed": "service/src/cli/cli.ts"
8
+ },
6
9
  "keywords": ["pi-package"],
7
10
  "pi": {
8
11
  "extensions": ["extension/src/index.ts"]
9
12
  },
10
13
  "scripts": {
11
- "test": "bun test test",
14
+ "build": "rm -rf dist && bun build service/src/public/client.ts service/src/public/protocol.ts --outdir dist --target node --format esm --minify && bunx tsc -p service/tsconfig.public.json",
15
+ "test": "bun run build && bun test service/test test",
12
16
  "typecheck": "bunx tsc --noEmit"
13
17
  },
14
18
  "dependencies": {
15
- "@danypops/packed": "^0.5.0",
19
+ "@danypops/packed": "^0.6.0",
20
+ "@danypops/pi-extension-harness": "^0.2.0",
16
21
  "@danypops/vehicle-client": "^0.2.0",
22
+ "@danypops/vehicle-core": "^0.6.1",
23
+ "@danypops/vehicle-server": "^0.7.0",
24
+ "jiti": "2.6.1",
25
+ "malevich-tui-components": "^0.16.1",
26
+ "publint": "0.3.22",
27
+ "semver": "^7.8.5"
28
+ },
29
+ "devDependencies": {
17
30
  "@danypops/vehicle-client-pi": "^0.1.5",
18
- "malevich-tui-components": "^0.16.1"
31
+ "@types/semver": "^7.7.1"
19
32
  },
20
33
  "peerDependencies": {
21
34
  "@earendil-works/pi-coding-agent": "*",
22
- "typebox": "*",
23
- "@earendil-works/pi-tui": "*"
35
+ "@earendil-works/pi-tui": "*",
36
+ "typebox": "*"
24
37
  },
25
38
  "repository": {
26
39
  "type": "git",
27
40
  "url": "git+https://github.com/DanyPops/packed.git",
28
41
  "directory": "packages/pi-packed"
29
42
  },
30
- "files": ["extension", "setup", "README.md"]
43
+ "exports": {
44
+ "./client": {
45
+ "types": "./dist/client.d.ts",
46
+ "import": "./dist/client.js"
47
+ },
48
+ "./protocol": {
49
+ "types": "./dist/protocol.d.ts",
50
+ "import": "./dist/protocol.js"
51
+ }
52
+ },
53
+ "files": ["extension", "service", "dist", "README.md"]
31
54
  }
@@ -0,0 +1,70 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "title": "Pi setup manifest v1",
4
+ "type": "object",
5
+ "additionalProperties": false,
6
+ "required": ["$schema", "schemaVersion", "packages", "profiles"],
7
+ "properties": {
8
+ "$schema": { "const": "./schema/pi-setup-v1.schema.json" },
9
+ "schemaVersion": { "const": 1 },
10
+ "packages": {
11
+ "type": "array",
12
+ "maxItems": 20,
13
+ "items": {
14
+ "oneOf": [
15
+ {
16
+ "type": "object", "additionalProperties": false,
17
+ "required": ["kind", "scope", "source", "resolved", "integrity"],
18
+ "properties": {
19
+ "kind": { "const": "npm" }, "scope": { "enum": ["global", "project"] },
20
+ "source": { "type": "string", "minLength": 5, "maxLength": 512, "pattern": "^npm:" },
21
+ "resolved": { "type": "string", "minLength": 1, "maxLength": 128 },
22
+ "integrity": { "type": "string", "minLength": 8, "maxLength": 512, "pattern": "^sha(256|384|512)-[A-Za-z0-9+/=_-]+$" }
23
+ }
24
+ },
25
+ {
26
+ "type": "object", "additionalProperties": false,
27
+ "required": ["kind", "scope", "requested", "source", "resolved"],
28
+ "properties": {
29
+ "kind": { "enum": ["git", "https"] }, "scope": { "enum": ["global", "project"] },
30
+ "requested": { "type": "string", "minLength": 8, "maxLength": 1024 },
31
+ "source": { "type": "string", "minLength": 8, "maxLength": 1024 },
32
+ "resolved": { "type": "string", "pattern": "^[a-fA-F0-9]{40}$" }
33
+ }
34
+ },
35
+ {
36
+ "type": "object", "additionalProperties": false,
37
+ "required": ["kind", "scope", "source", "resolved", "machineLocal"],
38
+ "properties": {
39
+ "kind": { "const": "local" }, "scope": { "enum": ["global", "project"] },
40
+ "source": { "type": "string", "minLength": 1, "maxLength": 1024 },
41
+ "resolved": { "type": "string", "minLength": 1, "maxLength": 1024 },
42
+ "machineLocal": { "const": true }
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ },
48
+ "profiles": {
49
+ "type": "object", "maxProperties": 100,
50
+ "propertyNames": { "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$" },
51
+ "additionalProperties": { "$ref": "#/$defs/profile" }
52
+ },
53
+ "defaultProfile": { "type": "string", "pattern": "^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$" }
54
+ },
55
+ "$defs": {
56
+ "profile": {
57
+ "type": "object", "additionalProperties": false, "required": ["scope"],
58
+ "properties": {
59
+ "scope": { "enum": ["global", "project"] },
60
+ "provider": { "type": "string", "minLength": 1, "maxLength": 128 },
61
+ "model": { "type": "string", "minLength": 1, "maxLength": 256 },
62
+ "thinkingLevel": { "enum": ["off", "minimal", "low", "medium", "high", "xhigh", "max"] },
63
+ "tools": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 128 } },
64
+ "instructions": { "type": "string", "minLength": 1, "maxLength": 16384 },
65
+ "theme": { "type": "string", "minLength": 1, "maxLength": 128 },
66
+ "allowedModels": { "type": "array", "maxItems": 100, "uniqueItems": true, "items": { "type": "string", "minLength": 1, "maxLength": 256 } }
67
+ }
68
+ }
69
+ }
70
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$schema": "./schema/pi-setup-v1.schema.json",
3
+ "schemaVersion": 1,
4
+ "packages": [
5
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-packed", "resolved": "0.5.3", "integrity": "sha512-n1qLFkEanvODh7QcoFdODCvuuAuKR9G8rMmF9RR9YTOvgqGYSCYL5XhFnECrODewqF+JrNFN9+SfgCJc5DiyAw==" },
6
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-papyrus", "resolved": "0.38.0", "integrity": "sha512-M5wV8X6kpKNXCS5kO7XifG+y4i2/6DNe6pYky5fcIbK7CpmAD4NIUVcxQMW2S9/03K5Oe589vKKfGlStvMz6uw==" },
7
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-lector", "resolved": "0.3.0", "integrity": "sha512-vis+YRDLUyl1joGDP8pck6zG4EHX1nRw6LLkjKwV7CxMZnvBh+FLVNDBv+0s6hKJU6gal5qP0YEOCU24I7VcxA==" },
8
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-pipes", "resolved": "0.8.1", "integrity": "sha512-Niu0DtG/usPdsQrsUGKhTjNrZR8HxAlc43sMMeLz7mzxC+MKlVFD6wmDgnAXPxyWGQtPKI78ZpzSDrkEobHZCQ==" },
9
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-tickets", "resolved": "0.5.2", "integrity": "sha512-6ipP4jtcMhQD61CVLWW1PYk6iA2ormUt5t1IGPgUOF4K3yK8xr+M+T3VA0ByXamG4vuE/dZ6b3cLm7qnn3YDOA==" },
10
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-jittor", "resolved": "0.1.0", "integrity": "sha512-CMyr1tzeop1OYaLJ6ItzZSShzu+0AGWekigFTLZRHG1sI9gVfYVCVYWYjbuEMYuDjtr8/4wEnj9OI5MvrWO9aw==" },
11
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/pi-web-spider", "resolved": "0.13.0", "integrity": "sha512-n6j/7enB4wUCeQVIIeFDUxeyk/SkV9lxJyQA+KYYQGDSCQd6Wr+ZbtVgM73X5quWPZMCB5akzxO0m3ZU92xNfg==" },
12
+ { "kind": "npm", "scope": "global", "source": "npm:@danypops/enigma", "resolved": "0.22.0", "integrity": "sha512-l/zLpNfaN4MQi5EDTa7IVka8daYk7ScWxDUUqFSUBSoQ2b0AOxtoY5JtdC6JRLcXSNhq9KqXNmJ1VSkf2HAC+w==" }
13
+ ],
14
+ "profiles": {}
15
+ }