@agentsean/launch 1.0.0

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 (50) hide show
  1. package/LICENSE +661 -0
  2. package/dist/doctor.d.ts +30 -0
  3. package/dist/doctor.d.ts.map +1 -0
  4. package/dist/doctor.js +170 -0
  5. package/dist/doctor.js.map +1 -0
  6. package/dist/index.d.ts +12 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +12 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/install.d.ts +22 -0
  11. package/dist/install.d.ts.map +1 -0
  12. package/dist/install.js +42 -0
  13. package/dist/install.js.map +1 -0
  14. package/dist/onboard.d.ts +21 -0
  15. package/dist/onboard.d.ts.map +1 -0
  16. package/dist/onboard.js +59 -0
  17. package/dist/onboard.js.map +1 -0
  18. package/dist/provision.d.ts +13 -0
  19. package/dist/provision.d.ts.map +1 -0
  20. package/dist/provision.js +52 -0
  21. package/dist/provision.js.map +1 -0
  22. package/dist/recipes.d.ts +11 -0
  23. package/dist/recipes.d.ts.map +1 -0
  24. package/dist/recipes.js +225 -0
  25. package/dist/recipes.js.map +1 -0
  26. package/dist/service.d.ts +22 -0
  27. package/dist/service.d.ts.map +1 -0
  28. package/dist/service.js +127 -0
  29. package/dist/service.js.map +1 -0
  30. package/dist/site.d.ts +9 -0
  31. package/dist/site.d.ts.map +1 -0
  32. package/dist/site.js +72 -0
  33. package/dist/site.js.map +1 -0
  34. package/dist/telemetry.d.ts +38 -0
  35. package/dist/telemetry.d.ts.map +1 -0
  36. package/dist/telemetry.js +146 -0
  37. package/dist/telemetry.js.map +1 -0
  38. package/dist/token-strength.d.ts +9 -0
  39. package/dist/token-strength.d.ts.map +1 -0
  40. package/dist/token-strength.js +22 -0
  41. package/dist/token-strength.js.map +1 -0
  42. package/dist/update.d.ts +15 -0
  43. package/dist/update.d.ts.map +1 -0
  44. package/dist/update.js +31 -0
  45. package/dist/update.js.map +1 -0
  46. package/dist/version.d.ts +8 -0
  47. package/dist/version.d.ts.map +1 -0
  48. package/dist/version.js +15 -0
  49. package/dist/version.js.map +1 -0
  50. package/package.json +47 -0
@@ -0,0 +1,30 @@
1
+ export type DoctorCheck = {
2
+ id: string;
3
+ ok: boolean;
4
+ severity: "fail" | "warn" | "info";
5
+ detail: string;
6
+ };
7
+ export type DoctorInput = {
8
+ home: string;
9
+ nodeVersion?: string | undefined;
10
+ port?: number | undefined;
11
+ pidAlive?: boolean | undefined;
12
+ tokenPresent?: boolean | undefined;
13
+ tokenLength?: number | undefined;
14
+ halted?: boolean | undefined;
15
+ dbExists?: boolean | undefined;
16
+ dbMode?: number | undefined;
17
+ googleConnected?: boolean | undefined;
18
+ googleExpiresAt?: string | null | undefined;
19
+ playwright?: boolean | undefined;
20
+ platform?: string | undefined;
21
+ };
22
+ export type DoctorReport = {
23
+ ok: boolean;
24
+ version: string;
25
+ node: string;
26
+ checks: DoctorCheck[];
27
+ };
28
+ export declare function portOpen(host: string, port: number): Promise<boolean>;
29
+ export declare function runDoctor(input: DoctorInput): Promise<DoctorReport>;
30
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,WAAW,GAAG;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,OAAO,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC5C,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB,CAAC;AAUF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAa3E;AAED,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,CAmJzE"}
package/dist/doctor.js ADDED
@@ -0,0 +1,170 @@
1
+ import fs from "node:fs";
2
+ import net from "node:net";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import { MIN_NODE, nodeMeetsMin, VERSION } from "./version.js";
6
+ import { MIN_TOKEN_LENGTH } from "./token-strength.js";
7
+ function modeOf(file) {
8
+ try {
9
+ return fs.statSync(file).mode & 0o777;
10
+ }
11
+ catch {
12
+ return undefined;
13
+ }
14
+ }
15
+ export async function portOpen(host, port) {
16
+ return new Promise((resolve) => {
17
+ const sock = net.connect({ host, port });
18
+ sock.once("connect", () => {
19
+ sock.destroy();
20
+ resolve(true);
21
+ });
22
+ sock.once("error", () => resolve(false));
23
+ sock.setTimeout(400, () => {
24
+ sock.destroy();
25
+ resolve(false);
26
+ });
27
+ });
28
+ }
29
+ export async function runDoctor(input) {
30
+ const nodeVersion = input.nodeVersion ?? process.versions.node;
31
+ const port = input.port ?? 7777;
32
+ const platform = input.platform ?? process.platform;
33
+ const checks = [];
34
+ const nodeOk = nodeMeetsMin(nodeVersion);
35
+ checks.push({
36
+ id: "node",
37
+ ok: nodeOk,
38
+ severity: nodeOk ? "info" : "fail",
39
+ detail: nodeOk
40
+ ? `Node ${nodeVersion} (>= ${MIN_NODE})`
41
+ : `Node ${nodeVersion} is too old; need >= ${MIN_NODE}`,
42
+ });
43
+ let homeWritable = false;
44
+ try {
45
+ fs.mkdirSync(input.home, { recursive: true, mode: 0o700 });
46
+ fs.accessSync(input.home, fs.constants.W_OK);
47
+ homeWritable = true;
48
+ }
49
+ catch {
50
+ homeWritable = false;
51
+ }
52
+ const homeMode = modeOf(input.home);
53
+ const homeModeOk = platform === "win32" || homeMode === undefined || (homeMode & 0o077) === 0;
54
+ checks.push({
55
+ id: "home",
56
+ ok: homeWritable && homeModeOk,
57
+ severity: homeWritable ? (homeModeOk ? "info" : "warn") : "fail",
58
+ detail: homeWritable
59
+ ? `writable ${input.home}` +
60
+ (homeModeOk ? "" : ` (mode ${homeMode?.toString(8)} should be 700)`)
61
+ : `cannot write ${input.home}`,
62
+ });
63
+ const listening = await portOpen("127.0.0.1", port);
64
+ if (input.pidAlive) {
65
+ checks.push({
66
+ id: "daemon",
67
+ ok: true,
68
+ severity: "info",
69
+ detail: listening
70
+ ? `daemon running on 127.0.0.1:${port}`
71
+ : "pid file is alive; health endpoint not reachable yet",
72
+ });
73
+ }
74
+ else {
75
+ checks.push({
76
+ id: "port",
77
+ ok: !listening,
78
+ severity: listening ? "warn" : "info",
79
+ detail: listening
80
+ ? `127.0.0.1:${port} is in use and no Sean pid file`
81
+ : `127.0.0.1:${port} is free`,
82
+ });
83
+ }
84
+ if (input.tokenPresent === false) {
85
+ checks.push({
86
+ id: "token",
87
+ ok: true,
88
+ severity: "info",
89
+ detail: "no token yet — first start will generate a 32-byte token",
90
+ });
91
+ }
92
+ else if (typeof input.tokenLength === "number") {
93
+ const strong = input.tokenLength >= MIN_TOKEN_LENGTH;
94
+ checks.push({
95
+ id: "token",
96
+ ok: strong,
97
+ severity: strong ? "info" : "fail",
98
+ detail: strong
99
+ ? `auth token length ${input.tokenLength}`
100
+ : `auth token length ${input.tokenLength} < ${MIN_TOKEN_LENGTH}`,
101
+ });
102
+ }
103
+ if (input.halted) {
104
+ checks.push({
105
+ id: "halt",
106
+ ok: true,
107
+ severity: "warn",
108
+ detail: "writes are frozen (HALT). sean unfreeze to resume",
109
+ });
110
+ }
111
+ const dbFile = path.join(input.home, "sean.db");
112
+ const dbExists = input.dbExists ?? fs.existsSync(dbFile);
113
+ if (dbExists) {
114
+ const dbMode = input.dbMode ?? modeOf(dbFile);
115
+ const privateDb = platform === "win32" || dbMode === undefined || (dbMode & 0o077) === 0;
116
+ checks.push({
117
+ id: "db",
118
+ ok: privateDb,
119
+ severity: privateDb ? "info" : "fail",
120
+ detail: privateDb
121
+ ? "database is not world-readable"
122
+ : `database mode ${dbMode?.toString(8)} is world-readable`,
123
+ });
124
+ }
125
+ else {
126
+ checks.push({
127
+ id: "db",
128
+ ok: true,
129
+ severity: "info",
130
+ detail: "no database yet — created on first crawl",
131
+ });
132
+ }
133
+ if (input.googleConnected) {
134
+ const exp = input.googleExpiresAt;
135
+ const stale = exp ? Date.parse(exp) < Date.now() : false;
136
+ checks.push({
137
+ id: "google",
138
+ ok: !stale,
139
+ severity: stale ? "warn" : "info",
140
+ detail: stale
141
+ ? "Google grant looks expired — reconnect with sean connect google"
142
+ : "Google grant present",
143
+ });
144
+ }
145
+ else {
146
+ checks.push({
147
+ id: "google",
148
+ ok: true,
149
+ severity: "info",
150
+ detail: "Google not connected (optional; audit works without it)",
151
+ });
152
+ }
153
+ checks.push({
154
+ id: "playwright",
155
+ ok: true,
156
+ severity: input.playwright ? "info" : "warn",
157
+ detail: input.playwright
158
+ ? "Playwright is available"
159
+ : "Playwright/Chromium not installed — JS rendering skipped until first crawl that needs it (not downloaded at install)",
160
+ });
161
+ checks.push({
162
+ id: "memory",
163
+ ok: true,
164
+ severity: "info",
165
+ detail: `${Math.round(os.freemem() / 1024 / 1024)} MB free`,
166
+ });
167
+ const ok = checks.every((c) => c.ok || c.severity !== "fail");
168
+ return { ok, version: VERSION, node: nodeVersion, checks };
169
+ }
170
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export { VERSION, CHANNELS, MIN_NODE, isChannel, nodeMeetsMin, type Channel, } from "./version.js";
2
+ export { MIN_TOKEN_LENGTH, MIN_TOKEN_UNIQUE_CHARS, TokenStrengthError, assertTokenStrength, envAuthToken, } from "./token-strength.js";
3
+ export { TELEMETRY_EVENTS, dntHonored, previewPayload, assertSafePayload, loadTelemetryConfig, saveTelemetryConfig, isTelemetryEnabled, recordEvent, readTelemetryLog, consentTelemetry, telemetryPath, telemetryLogPath, type TelemetryPayload, type TelemetryConfig, type TelemetryEventName, } from "./telemetry.js";
4
+ export { ONBOARD_QUESTIONS, CMS_KINDS, SERVICE_HINT, NOT_OUR_JOB, parseCms, parseSiteUrl, type OnboardQuestion, type OnboardAnswers, type CmsKind, } from "./onboard.js";
5
+ export { runDoctor, portOpen, type DoctorCheck, type DoctorInput, type DoctorReport, } from "./doctor.js";
6
+ export { serviceKind, planService, writeService, removeServiceFile, type ServiceKind, type ServicePlan, type ServicePlanInput, } from "./service.js";
7
+ export { RECIPES, recipeById, type Recipe } from "./recipes.js";
8
+ export { provisionHome, readInstallMethod, isOnboarded, markOnboarded, onboardedPath, hasPostinstallScripts, type InstallMethod, } from "./provision.js";
9
+ export { checkUpdate } from "./update.js";
10
+ export { INSTALL_FLAGS, planInstall, type InstallPlan } from "./install.js";
11
+ export { POSITIONING, OPENSEO_CREDIT, recipePage, recipesIndex } from "./site.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,KAAK,OAAO,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,kBAAkB,GACxB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,OAAO,GACb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,EAChB,KAAK,gBAAgB,GACtB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,aAAa,EACb,qBAAqB,EACrB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { VERSION, CHANNELS, MIN_NODE, isChannel, nodeMeetsMin, } from "./version.js";
2
+ export { MIN_TOKEN_LENGTH, MIN_TOKEN_UNIQUE_CHARS, TokenStrengthError, assertTokenStrength, envAuthToken, } from "./token-strength.js";
3
+ export { TELEMETRY_EVENTS, dntHonored, previewPayload, assertSafePayload, loadTelemetryConfig, saveTelemetryConfig, isTelemetryEnabled, recordEvent, readTelemetryLog, consentTelemetry, telemetryPath, telemetryLogPath, } from "./telemetry.js";
4
+ export { ONBOARD_QUESTIONS, CMS_KINDS, SERVICE_HINT, NOT_OUR_JOB, parseCms, parseSiteUrl, } from "./onboard.js";
5
+ export { runDoctor, portOpen, } from "./doctor.js";
6
+ export { serviceKind, planService, writeService, removeServiceFile, } from "./service.js";
7
+ export { RECIPES, recipeById } from "./recipes.js";
8
+ export { provisionHome, readInstallMethod, isOnboarded, markOnboarded, onboardedPath, hasPostinstallScripts, } from "./provision.js";
9
+ export { checkUpdate } from "./update.js";
10
+ export { INSTALL_FLAGS, planInstall } from "./install.js";
11
+ export { POSITIONING, OPENSEO_CREDIT, recipePage, recipesIndex } from "./site.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,YAAY,GAEb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,gBAAgB,GAIjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,GAIb,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,SAAS,EACT,QAAQ,GAIT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,WAAW,EACX,WAAW,EACX,YAAY,EACZ,iBAAiB,GAIlB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,OAAO,EAAE,UAAU,EAAe,MAAM,cAAc,CAAC;AAChE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,WAAW,EACX,aAAa,EACb,aAAa,EACb,qBAAqB,GAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAoB,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,22 @@
1
+ /** Canonical installer flag surface. install.sh and install.ps1 must match. */
2
+ export declare const INSTALL_FLAGS: readonly ["--no-onboard", "--version=", "--prefix=", "--channel=", "--from-source=", "--dry-run", "--help"];
3
+ export declare const INSTALL_CHANNELS: readonly ["stable", "extended-stable", "dev"];
4
+ export type InstallPlan = {
5
+ prefix: string;
6
+ channel: string;
7
+ onboard: boolean;
8
+ fromSource: string | null;
9
+ version: string | null;
10
+ dryRun: boolean;
11
+ steps: string[];
12
+ };
13
+ export declare function planInstall(args: {
14
+ prefix?: string | undefined;
15
+ channel?: string | undefined;
16
+ onboard?: boolean | undefined;
17
+ fromSource?: string | null | undefined;
18
+ version?: string | null | undefined;
19
+ dryRun?: boolean | undefined;
20
+ nodePresent?: boolean | undefined;
21
+ }): InstallPlan;
22
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,eAAO,MAAM,aAAa,6GAQhB,CAAC;AAEX,eAAO,MAAM,gBAAgB,+CAAgD,CAAC;AAE9E,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE;IAChC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACvC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC7B,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACnC,GAAG,WAAW,CA6Bd"}
@@ -0,0 +1,42 @@
1
+ /** Canonical installer flag surface. install.sh and install.ps1 must match. */
2
+ export const INSTALL_FLAGS = [
3
+ "--no-onboard",
4
+ "--version=",
5
+ "--prefix=",
6
+ "--channel=",
7
+ "--from-source=",
8
+ "--dry-run",
9
+ "--help",
10
+ ];
11
+ export const INSTALL_CHANNELS = ["stable", "extended-stable", "dev"];
12
+ export function planInstall(args) {
13
+ const prefix = args.prefix ?? "~/.sean";
14
+ const channel = args.channel ?? "stable";
15
+ const onboard = args.onboard ?? true;
16
+ const fromSource = args.fromSource ?? null;
17
+ const version = args.version ?? null;
18
+ const dryRun = args.dryRun ?? false;
19
+ const nodePresent = args.nodePresent ?? true;
20
+ const steps = [];
21
+ if (!nodePresent) {
22
+ steps.push(`download Node >= 22.19 into ${prefix}/runtime (official nodejs.org tarball)`);
23
+ }
24
+ else {
25
+ steps.push("use Node already on PATH");
26
+ }
27
+ if (fromSource) {
28
+ steps.push(`link CLI from source at ${fromSource} (no npm lifecycle scripts)`);
29
+ }
30
+ else {
31
+ steps.push(version
32
+ ? `npm install -g agentsean@${version} (no postinstall; npm 12+ safe)`
33
+ : `npm install -g agentsean@${channel === "stable" ? "latest" : channel} (no postinstall; npm 12+ safe)`);
34
+ }
35
+ steps.push(`provision ${prefix} on first run, not at install`);
36
+ if (onboard)
37
+ steps.push("run sean onboard");
38
+ else
39
+ steps.push("skip onboard (--no-onboard)");
40
+ return { prefix, channel, onboard, fromSource, version, dryRun, steps };
41
+ }
42
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,cAAc;IACd,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,gBAAgB;IAChB,WAAW;IACX,QAAQ;CACA,CAAC;AAEX,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,iBAAiB,EAAE,KAAK,CAAU,CAAC;AAY9E,MAAM,UAAU,WAAW,CAAC,IAQ3B;IACC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CACR,+BAA+B,MAAM,wCAAwC,CAC9E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,2BAA2B,UAAU,6BAA6B,CAAC,CAAC;IACjF,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,OAAO;YACL,CAAC,CAAC,4BAA4B,OAAO,iCAAiC;YACtE,CAAC,CAAC,4BAA4B,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,iCAAiC,CAC3G,CAAC;IACJ,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,+BAA+B,CAAC,CAAC;IAC/D,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;;QACvC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,21 @@
1
+ export declare const CMS_KINDS: readonly ["wordpress", "shopify", "git", "cloudflare", "other"];
2
+ export type CmsKind = (typeof CMS_KINDS)[number];
3
+ export type OnboardQuestion = {
4
+ id: "url" | "cms" | "google" | "telemetry";
5
+ prompt: string;
6
+ required: boolean;
7
+ options?: string[];
8
+ };
9
+ /** Four questions. Service install is a separate command (marketplace guideline). */
10
+ export declare const ONBOARD_QUESTIONS: OnboardQuestion[];
11
+ export type OnboardAnswers = {
12
+ url: string;
13
+ cms: CmsKind;
14
+ google: "yes" | "later";
15
+ telemetry: boolean;
16
+ };
17
+ export declare function parseCms(raw: string | undefined): CmsKind | undefined;
18
+ export declare function parseSiteUrl(raw: string | undefined): string | undefined;
19
+ export declare const SERVICE_HINT = "Sean is running for this session. To survive reboot, run `sean service install` \u2014 it prints the exact files it will write and is never a side effect of npm or onboard.";
20
+ export declare const NOT_OUR_JOB: string[];
21
+ //# sourceMappingURL=onboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,SAAS,iEAMZ,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAEF,qFAAqF;AACrF,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAyB9C,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,OAAO,CAAC;IACb,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC;IACxB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAIrE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CASxE;AAED,eAAO,MAAM,YAAY,iLACkJ,CAAC;AAE5K,eAAO,MAAM,WAAW,UAIvB,CAAC"}
@@ -0,0 +1,59 @@
1
+ export const CMS_KINDS = [
2
+ "wordpress",
3
+ "shopify",
4
+ "git",
5
+ "cloudflare",
6
+ "other",
7
+ ];
8
+ /** Four questions. Service install is a separate command (marketplace guideline). */
9
+ export const ONBOARD_QUESTIONS = [
10
+ {
11
+ id: "url",
12
+ prompt: "What site should Sean work on?",
13
+ required: true,
14
+ },
15
+ {
16
+ id: "cms",
17
+ prompt: "Where does the site live?",
18
+ required: true,
19
+ options: [...CMS_KINDS],
20
+ },
21
+ {
22
+ id: "google",
23
+ prompt: "Connect Google Search Console now? Audit works without it.",
24
+ required: false,
25
+ options: ["yes", "later"],
26
+ },
27
+ {
28
+ id: "telemetry",
29
+ prompt: "Share anonymous usage events? Never domains, URLs, queries, keys, or IPs. Honor DO_NOT_TRACK=1.",
30
+ required: false,
31
+ options: ["yes", "no"],
32
+ },
33
+ ];
34
+ export function parseCms(raw) {
35
+ if (!raw)
36
+ return undefined;
37
+ const v = raw.trim().toLowerCase();
38
+ return CMS_KINDS.includes(v) ? v : undefined;
39
+ }
40
+ export function parseSiteUrl(raw) {
41
+ if (!raw)
42
+ return undefined;
43
+ try {
44
+ const u = new URL(raw);
45
+ if (u.protocol !== "http:" && u.protocol !== "https:")
46
+ return undefined;
47
+ return u.origin;
48
+ }
49
+ catch {
50
+ return undefined;
51
+ }
52
+ }
53
+ export const SERVICE_HINT = "Sean is running for this session. To survive reboot, run `sean service install` — it prints the exact files it will write and is never a side effect of npm or onboard.";
54
+ export const NOT_OUR_JOB = [
55
+ "stakeholder negotiation",
56
+ "strategy arguments",
57
+ "deciding whether a business should want the traffic",
58
+ ];
59
+ //# sourceMappingURL=onboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard.js","sourceRoot":"","sources":["../src/onboard.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,WAAW;IACX,SAAS;IACT,KAAK;IACL,YAAY;IACZ,OAAO;CACC,CAAC;AAUX,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD;QACE,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,IAAI;KACf;IACD;QACE,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,2BAA2B;QACnC,QAAQ,EAAE,IAAI;QACd,OAAO,EAAE,CAAC,GAAG,SAAS,CAAC;KACxB;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,MAAM,EAAE,4DAA4D;QACpE,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;KAC1B;IACD;QACE,EAAE,EAAE,WAAW;QACf,MAAM,EACJ,iGAAiG;QACnG,QAAQ,EAAE,KAAK;QACf,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;KACvB;CACF,CAAC;AASF,MAAM,UAAU,QAAQ,CAAC,GAAuB;IAC9C,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,OAAQ,SAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAa,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAuB;IAClD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAC;QACxE,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GACvB,yKAAyK,CAAC;AAE5K,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,yBAAyB;IACzB,oBAAoB;IACpB,qDAAqD;CACtD,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * First-run provisioning. npm v12 disables preinstall/install/postinstall
3
+ * by default — nothing in this package runs at install time. Chromium is
4
+ * not downloaded here; the crawler fetches it lazily on first JS render.
5
+ */
6
+ export type InstallMethod = "npx" | "npm" | "curl" | "homebrew" | "docker" | "source";
7
+ export declare function provisionHome(home: string, method?: InstallMethod): string;
8
+ export declare function readInstallMethod(home: string): InstallMethod;
9
+ export declare function onboardedPath(home: string): string;
10
+ export declare function isOnboarded(home: string): boolean;
11
+ export declare function markOnboarded(home: string): void;
12
+ export declare function hasPostinstallScripts(scripts: Record<string, string> | undefined): boolean;
13
+ //# sourceMappingURL=provision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,aAAqB,GAAG,MAAM,CAcjF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAiB7D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,GAC1C,OAAO,CAGT"}
@@ -0,0 +1,52 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export function provisionHome(home, method = "npx") {
4
+ fs.mkdirSync(home, { recursive: true, mode: 0o700 });
5
+ if (process.platform !== "win32") {
6
+ try {
7
+ fs.chmodSync(home, 0o700);
8
+ }
9
+ catch {
10
+ // best-effort
11
+ }
12
+ }
13
+ const marker = path.join(home, "install-method");
14
+ if (!fs.existsSync(marker)) {
15
+ fs.writeFileSync(marker, method + "\n", { mode: 0o600 });
16
+ }
17
+ return home;
18
+ }
19
+ export function readInstallMethod(home) {
20
+ try {
21
+ const raw = fs.readFileSync(path.join(home, "install-method"), "utf8").trim();
22
+ if (raw === "npx" ||
23
+ raw === "npm" ||
24
+ raw === "curl" ||
25
+ raw === "homebrew" ||
26
+ raw === "docker" ||
27
+ raw === "source") {
28
+ return raw;
29
+ }
30
+ }
31
+ catch {
32
+ // first run
33
+ }
34
+ return "npx";
35
+ }
36
+ export function onboardedPath(home) {
37
+ return path.join(home, "onboarded");
38
+ }
39
+ export function isOnboarded(home) {
40
+ return fs.existsSync(onboardedPath(home));
41
+ }
42
+ export function markOnboarded(home) {
43
+ fs.writeFileSync(onboardedPath(home), new Date().toISOString() + "\n", {
44
+ mode: 0o600,
45
+ });
46
+ }
47
+ export function hasPostinstallScripts(scripts) {
48
+ if (!scripts)
49
+ return false;
50
+ return Boolean(scripts["preinstall"] || scripts["install"] || scripts["postinstall"]);
51
+ }
52
+ //# sourceMappingURL=provision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provision.js","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAS7B,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAAwB,KAAK;IACvE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9E,IACE,GAAG,KAAK,KAAK;YACb,GAAG,KAAK,KAAK;YACb,GAAG,KAAK,MAAM;YACd,GAAG,KAAK,UAAU;YAClB,GAAG,KAAK,QAAQ;YAChB,GAAG,KAAK,QAAQ,EAChB,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,EAAE,CAAC,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,GAAG,IAAI,EAAE;QACrE,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA2C;IAE3C,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,11 @@
1
+ export type Recipe = {
2
+ id: string;
3
+ title: string;
4
+ summary: string;
5
+ cms: string[];
6
+ href: string;
7
+ steps: string[];
8
+ };
9
+ export declare const RECIPES: Recipe[];
10
+ export declare function recipeById(id: string): Recipe | undefined;
11
+ //# sourceMappingURL=recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,MAAM,EAwO3B,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEzD"}