typebulb 0.33.0 → 0.35.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.
package/README.md CHANGED
@@ -442,7 +442,7 @@ One bulb per command, between typebulb.com and its conventional local file — t
442
442
 
443
443
  - **Pull**: `typebulb pull <bulb-url>` (or an existing local file, to refresh in place). Unlisted and public bulbs need no login. A local file with real changes is refused; `--force` overwrites it.
444
444
  - **Push**: `typebulb push <file>` uploads as you — set `TYPEBULB_TOKEN` in `.env` (minted on your typebulb.com settings page). A slug that doesn't exist yet is created, unlisted. If the site copy changed since your last pull/push, the push is refused; `--force` overwrites it. A `**server.ts**` block is stripped from the site copy (CLI-only); your local file is never modified.
445
- - **Assets**: push carries the bulb's `assets/` folder — files upload to typebulb's asset host and the published bulb serves them with zero config (small files; caps apply, refusals say so). To self-host instead, set `"assets": "https://your-host/path/"` in `config.json`: push then verifies each file exists there (misses refuse; `--force` publishes anyway). Viewers are redirected to the asset host; a local file shadows its hosted copy, and display needs no CORS (only canvas/`fetch()` pixel-reading does).
445
+ - **Assets**: push carries the bulb's `assets/` folder — files upload to typebulb's asset host and the published bulb serves them with zero config (quotas apply; refusals say so). A local file shadows its hosted copy.
446
446
  - **In the agent mirror**, the launcher lists your typebulb.com bulbs (pull-on-play) and local `u/<user>/` rows carry pull/push icons — same rules, same `--force` confirm.
447
447
  - `TYPEBULB_ORIGIN` in `.env` overrides the default `https://typebulb.com` host.
448
448
 
@@ -2280,7 +2280,7 @@ var Patcher = class {
2280
2280
 
2281
2281
  // cli/agents/pi/server/piPatcherExtension.ts
2282
2282
  var DESCRIPTION = true ? "Apply unified diffs to files \u2014 tolerant of form, strict about intent. Repairs sloppy AI-generated diffs (mangled headers, whitespace drift, missing prefixes; line numbers can be wrong or absent \u2014 hunks anchor by fuzzy-matched context lines) and applies all hunks atomically when the intent is unambiguous; fails with a precise, typed error when it isn't. Use for multi-hunk edits in one step, or when exact string-replacement editing fails on whitespace or invisible characters." : "Apply unified diffs to files.";
2283
- var BUILD_TAG = true ? "matchu-patchu-pi 0.3.1, built 2026-07-20 09:22:11" : "matchu-patchu-pi dev";
2283
+ var BUILD_TAG = true ? "matchu-patchu-pi 0.3.1, built 2026-07-20 11:47:59" : "matchu-patchu-pi dev";
2284
2284
  var errorBlocks = (errors) => {
2285
2285
  const parts = [`Patch failed with ${errors.length} error(s):`];
2286
2286
  for (const e of errors) parts.push("", e.toString());
@@ -11,22 +11,30 @@ export interface BulbConfig {
11
11
  ts?: {
12
12
  jsxImportSource?: string;
13
13
  };
14
- /** Base URL where the bulb's `assets/` folder is hosted when published (TB-Assets.md). */
15
- assets?: string;
16
14
  }
17
15
  /** Parse the `config.json` block, returning {} for empty or malformed JSON. */
18
16
  export declare function parseConfig(config: string): BulbConfig;
19
- /** The `assets` base URL from a `config.json` string, normalized to a trailing slash —
20
- * undefined when absent or not an http(s) URL (callers report the malformed case). */
21
- export declare function assetsBase(config: string | null | undefined): string | undefined;
22
17
  /** Where typebulb.com-hosted bulb assets serve from (TB-Assets-Push.md Invariant 1). */
23
18
  export declare const HOSTED_ASSETS_ORIGIN = "https://assets.typebulb.com";
24
- /** The hosted-assets base derived from a bulb's identity — the default when `config.json`
25
- * has no `assets` key (TB-Assets-Push.md Invariant 2: derived, never stored). */
19
+ /** The hosted-assets base derived from a bulb's identity (TB-Assets-Push.md Invariant 2:
20
+ * derived, never stored). An identity-less bulb has no remote base — it can't push either. */
26
21
  export declare const hostedAssetsBase: (userSlug: string, slug: string) => string;
27
- /** The base a bulb's `assets/` resolves against remotely: the config key (self-host), else the
28
- * hosted default when the bulb has an identity — else none (an identity-less bulb can't push). */
29
- export declare const resolvedAssetsBase: (config: string | null | undefined, userSlug?: string, slug?: string) => string | undefined;
22
+ /**
23
+ * Content type for a served file, from its extension. `.wasm` must be `application/wasm`
24
+ * for `WebAssembly.instantiateStreaming`; `.svg` must be `image/svg+xml` or an `<img>`
25
+ * won't render it (no sniffing for SVG). Unknown extensions are `application/octet-stream`
26
+ * — browsers download those, never render. Shared by the CLI's static routes (which serve
27
+ * real `.js`: the mirror's bundled client, `--replace` dirs) and the API worker's asset PUT
28
+ * — which derives the stored type from this table, never the upload header, and refuses
29
+ * document/script extensions before consulting it, so the `.js`/`.css` rows are unreachable
30
+ * on the hosted-asset path (TB-Assets-Push.md Invariant 9).
31
+ */
32
+ export declare function contentTypeFor(filePath: string): string;
33
+ /** The offending extension when a path names browser code/markup — refused as an asset
34
+ * everywhere (the hosted PUT and the local `/assets/` route alike): a bulb's code and
35
+ * markup live in the bulb; assets are media and data (TB-Assets-Push.md Invariant 9).
36
+ * `undefined` for everything else — media, data, and unknown extensions all serve. */
37
+ export declare function forbiddenAssetExt(relpath: string): string | undefined;
30
38
  /** Strip inline markdown (links, emphasis, code, headings) for plain-text contexts like meta descriptions. */
31
39
  export declare function stripMarkdown(text: string): string;
32
40
  /** Plain-text description from a `config.json` string: markdown stripped, single line, ≤200 chars.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IACjC,0FAA0F;IAC1F,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOtD;AAED;uFACuF;AACvF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAQhF;AAED,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,gCAAgC,CAAA;AAEjE;kFACkF;AAClF,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,WAC2B,CAAA;AAE1F;mGACmG;AACnG,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,WAAW,MAAM,EAAE,OAAO,MAAM,uBACb,CAAA;AAIzF,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;0EAC0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMrE"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOtD;AAED,wFAAwF;AACxF,eAAO,MAAM,oBAAoB,gCAAgC,CAAA;AAEjE;+FAC+F;AAC/F,eAAO,MAAM,gBAAgB,GAAI,UAAU,MAAM,EAAE,MAAM,MAAM,WAC2B,CAAA;AAK1F;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2BvD;AAID;;;uFAGuF;AACvF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGrE;AAID,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOlD;AAED;0EAC0E;AAC1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAMrE"}
@@ -10,30 +10,60 @@ export function parseConfig(config) {
10
10
  return {};
11
11
  }
12
12
  }
13
- /** The `assets` base URL from a `config.json` string, normalized to a trailing slash —
14
- * undefined when absent or not an http(s) URL (callers report the malformed case). */
15
- export function assetsBase(config) {
16
- const raw = parseConfig(config ?? '').assets?.trim();
17
- if (!raw)
18
- return undefined;
19
- try {
20
- const url = new URL(raw);
21
- if (url.protocol !== 'http:' && url.protocol !== 'https:')
22
- return undefined;
23
- }
24
- catch {
25
- return undefined;
26
- }
27
- return raw.endsWith('/') ? raw : raw + '/';
28
- }
29
13
  /** Where typebulb.com-hosted bulb assets serve from (TB-Assets-Push.md Invariant 1). */
30
14
  export const HOSTED_ASSETS_ORIGIN = 'https://assets.typebulb.com';
31
- /** The hosted-assets base derived from a bulb's identity — the default when `config.json`
32
- * has no `assets` key (TB-Assets-Push.md Invariant 2: derived, never stored). */
15
+ /** The hosted-assets base derived from a bulb's identity (TB-Assets-Push.md Invariant 2:
16
+ * derived, never stored). An identity-less bulb has no remote base — it can't push either. */
33
17
  export const hostedAssetsBase = (userSlug, slug) => `${HOSTED_ASSETS_ORIGIN}/u/${encodeURIComponent(userSlug)}/${encodeURIComponent(slug)}/`;
34
- /** The base a bulb's `assets/` resolves against remotely: the config key (self-host), else the
35
- * hosted default when the bulb has an identity — else none (an identity-less bulb can't push). */
36
- export const resolvedAssetsBase = (config, userSlug, slug) => assetsBase(config) ?? (userSlug && slug ? hostedAssetsBase(userSlug, slug) : undefined);
18
+ /** Lowercased final extension (`sub/née.PNG` → `.png`); undefined when there is none. */
19
+ const extOf = (p) => /\.[^./\\]+$/.exec(p)?.[0]?.toLowerCase();
20
+ /**
21
+ * Content type for a served file, from its extension. `.wasm` must be `application/wasm`
22
+ * for `WebAssembly.instantiateStreaming`; `.svg` must be `image/svg+xml` or an `<img>`
23
+ * won't render it (no sniffing for SVG). Unknown extensions are `application/octet-stream`
24
+ * — browsers download those, never render. Shared by the CLI's static routes (which serve
25
+ * real `.js`: the mirror's bundled client, `--replace` dirs) and the API worker's asset PUT
26
+ * — which derives the stored type from this table, never the upload header, and refuses
27
+ * document/script extensions before consulting it, so the `.js`/`.css` rows are unreachable
28
+ * on the hosted-asset path (TB-Assets-Push.md Invariant 9).
29
+ */
30
+ export function contentTypeFor(filePath) {
31
+ switch (extOf(filePath)) {
32
+ case '.js':
33
+ case '.mjs': return 'text/javascript';
34
+ case '.wasm': return 'application/wasm';
35
+ case '.json':
36
+ case '.map': return 'application/json';
37
+ case '.svg': return 'image/svg+xml';
38
+ case '.png': return 'image/png';
39
+ case '.jpg':
40
+ case '.jpeg': return 'image/jpeg';
41
+ case '.gif': return 'image/gif';
42
+ case '.webp': return 'image/webp';
43
+ case '.avif': return 'image/avif';
44
+ case '.ico': return 'image/x-icon';
45
+ case '.mp3': return 'audio/mpeg';
46
+ case '.wav': return 'audio/wav';
47
+ case '.ogg': return 'audio/ogg';
48
+ case '.m4a': return 'audio/mp4';
49
+ case '.mp4': return 'video/mp4';
50
+ case '.webm': return 'video/webm';
51
+ case '.woff2': return 'font/woff2';
52
+ case '.ttf': return 'font/ttf';
53
+ case '.css': return 'text/css';
54
+ case '.txt': return 'text/plain; charset=utf-8';
55
+ default: return 'application/octet-stream';
56
+ }
57
+ }
58
+ const FORBIDDEN_ASSET_EXTENSIONS = new Set(['.html', '.htm', '.xhtml', '.js', '.mjs', '.cjs', '.ts', '.tsx', '.css']);
59
+ /** The offending extension when a path names browser code/markup — refused as an asset
60
+ * everywhere (the hosted PUT and the local `/assets/` route alike): a bulb's code and
61
+ * markup live in the bulb; assets are media and data (TB-Assets-Push.md Invariant 9).
62
+ * `undefined` for everything else — media, data, and unknown extensions all serve. */
63
+ export function forbiddenAssetExt(relpath) {
64
+ const ext = extOf(relpath);
65
+ return ext !== undefined && FORBIDDEN_ASSET_EXTENSIONS.has(ext) ? ext : undefined;
66
+ }
37
67
  const DEFAULT_DESCRIPTION = 'A Typebulb bulb.';
38
68
  /** Strip inline markdown (links, emphasis, code, headings) for plain-text contexts like meta descriptions. */
39
69
  export function stripMarkdown(text) {
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAiB/F,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED;uFACuF;AACvF,MAAM,UAAU,UAAU,CAAC,MAAiC;IAC1D,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAA;IACpD,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAA;IAC1B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;IAC7E,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,SAAS,CAAA;IAAC,CAAC;IAC5B,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAA;AAC5C,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAA;AAEjE;kFACkF;AAClF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,IAAY,EAAE,EAAE,CACjE,GAAG,oBAAoB,MAAM,kBAAkB,CAAC,QAAQ,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAA;AAE1F;mGACmG;AACnG,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAiC,EAAE,QAAiB,EAAE,IAAa,EAAE,EAAE,CACxG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;AAEzF,MAAM,mBAAmB,GAAG,kBAAkB,CAAA;AAE9C,8GAA8G;AAC9G,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC;SACvC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAChC,CAAC;AAED;0EAC0E;AAC1E,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAA;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,mBAAmB,CAAA;IACrC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAA;IACnF,OAAO,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;AACtC,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"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"}