ugly-app 0.1.743 → 0.1.744

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.
@@ -1,2 +1,2 @@
1
- export declare const CLI_VERSION = "0.1.743";
1
+ export declare const CLI_VERSION = "0.1.744";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,3 +1,3 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.743";
2
+ export const CLI_VERSION = "0.1.744";
3
3
  //# sourceMappingURL=version.js.map
@@ -5,13 +5,14 @@
5
5
  * Supports GFM (tables, task lists, strikethrough) and custom nodes (mentions, bot tags).
6
6
  */
7
7
  import { Schema } from 'prosemirror-model';
8
- export declare const schema: Schema<"text" | "image" | "blockquote" | "table" | "svg" | "heading" | "paragraph" | "latex" | "mermaid" | "mention" | "table_row" | "table_cell" | "table_header" | "doc" | "code_block" | "horizontal_rule" | "bullet_list" | "ordered_list" | "list_item" | "hard_break" | "bot_tag" | "vegalite" | "markmap", "code" | "strong" | "link" | "em" | "strikethrough" | "highlight" | "comment_anchor">;
8
+ export declare const schema: Schema<"text" | "image" | "blockquote" | "table" | "svg" | "doc" | "heading" | "paragraph" | "latex" | "mermaid" | "mention" | "table_row" | "table_cell" | "table_header" | "code_block" | "horizontal_rule" | "bullet_list" | "ordered_list" | "list_item" | "hard_break" | "bot_tag" | "vegalite" | "markmap", "code" | "strong" | "link" | "em" | "strikethrough" | "highlight" | "comment_anchor">;
9
9
  export declare const nodeTypes: {
10
10
  readonly text: import("prosemirror-model").NodeType;
11
11
  readonly image: import("prosemirror-model").NodeType;
12
12
  readonly blockquote: import("prosemirror-model").NodeType;
13
13
  readonly table: import("prosemirror-model").NodeType;
14
14
  readonly svg: import("prosemirror-model").NodeType;
15
+ readonly doc: import("prosemirror-model").NodeType;
15
16
  readonly heading: import("prosemirror-model").NodeType;
16
17
  readonly paragraph: import("prosemirror-model").NodeType;
17
18
  readonly latex: import("prosemirror-model").NodeType;
@@ -20,7 +21,6 @@ export declare const nodeTypes: {
20
21
  readonly table_row: import("prosemirror-model").NodeType;
21
22
  readonly table_cell: import("prosemirror-model").NodeType;
22
23
  readonly table_header: import("prosemirror-model").NodeType;
23
- readonly doc: import("prosemirror-model").NodeType;
24
24
  readonly code_block: import("prosemirror-model").NodeType;
25
25
  readonly horizontal_rule: import("prosemirror-model").NodeType;
26
26
  readonly bullet_list: import("prosemirror-model").NodeType;
@@ -0,0 +1,15 @@
1
+ export interface BundledTool {
2
+ /** Request/grant key and default spawn name, e.g. 'pnpm'. */
3
+ name: string;
4
+ /** Executable basename when it differs from `name` (e.g. imagemagick → magick). */
5
+ exe?: string;
6
+ category: 'toolchain' | 'media' | 'data' | 'doc' | 'net';
7
+ /** Must be on PATH for `bash -lc` invocations (node/git/pnpm/uv/python). */
8
+ shellTool?: boolean;
9
+ /** Shown in the permission prompt, like mic/camera copy. */
10
+ description: string;
11
+ }
12
+ export declare const BUNDLED_TOOLS: readonly BundledTool[];
13
+ /** Look up a tool descriptor by its request/grant name. */
14
+ export declare function bundledTool(name: string): BundledTool | undefined;
15
+ //# sourceMappingURL=bundledTools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundledTools.d.ts","sourceRoot":"","sources":["../../src/native/bundledTools.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,CAAC;IACzD,4EAA4E;IAC5E,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAyB9C,CAAC;AAIH,2DAA2D;AAC3D,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEjE"}
@@ -0,0 +1,36 @@
1
+ // The catalog of bundled command-line tools an app may request through the
2
+ // permission system (like mic/camera). This is VOCABULARY ONLY — names and
3
+ // static metadata. Versions, download sources, install, PATH, and upgrade all
4
+ // live in the host (ugly-studio); ugly-app never touches a binary.
5
+ export const BUNDLED_TOOLS = Object.freeze([
6
+ // toolchain — needed on PATH so shells (`bash -lc 'pnpm dev'`) resolve them.
7
+ { name: 'node', category: 'toolchain', shellTool: true, description: 'Node.js runtime — runs your project and its build tools.' },
8
+ { name: 'git', category: 'toolchain', shellTool: true, description: 'Git — version control for your project.' },
9
+ { name: 'pnpm', category: 'toolchain', shellTool: true, description: 'pnpm — installs your project’s dependencies.' },
10
+ { name: 'uv', category: 'toolchain', shellTool: true, description: 'uv — fast Python package manager.' },
11
+ { name: 'python', exe: 'python3', category: 'toolchain', shellTool: true, description: 'Python runtime.' },
12
+ // net
13
+ { name: 'gh', category: 'net', description: 'GitHub CLI — sign in and manage repositories.' },
14
+ { name: 'cloudflared', category: 'net', description: 'Cloudflare tunnel — exposes your local preview at a public URL.' },
15
+ { name: 'nats', category: 'net', description: 'NATS CLI — messaging server tooling.' },
16
+ // data
17
+ { name: 'postgres', category: 'data', description: 'PostgreSQL — local database for your project.' },
18
+ { name: 'jq', category: 'data', description: 'jq — command-line JSON processor.' },
19
+ { name: 'yq', category: 'data', description: 'yq — command-line YAML processor.' },
20
+ { name: 'pup', category: 'data', description: 'pup — command-line HTML parser.' },
21
+ { name: 'sqlite3', category: 'data', description: 'SQLite — command-line database shell.' },
22
+ // media
23
+ { name: 'ffmpeg', category: 'media', description: 'FFmpeg — audio/video processing.' },
24
+ { name: 'imagemagick', exe: 'magick', category: 'media', description: 'ImageMagick — image conversion and editing.' },
25
+ { name: 'yt-dlp', category: 'media', description: 'yt-dlp — download media from the web.' },
26
+ // doc
27
+ { name: 'pandoc', category: 'doc', description: 'Pandoc — document format conversion.' },
28
+ { name: 'pdftotext', category: 'doc', description: 'pdftotext — extract text from PDFs.' },
29
+ { name: 'tesseract', category: 'doc', description: 'Tesseract — OCR text from images.' },
30
+ ]);
31
+ const BY_NAME = new Map(BUNDLED_TOOLS.map((t) => [t.name, t]));
32
+ /** Look up a tool descriptor by its request/grant name. */
33
+ export function bundledTool(name) {
34
+ return BY_NAME.get(name);
35
+ }
36
+ //# sourceMappingURL=bundledTools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundledTools.js","sourceRoot":"","sources":["../../src/native/bundledTools.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,2EAA2E;AAC3E,8EAA8E;AAC9E,mEAAmE;AAcnE,MAAM,CAAC,MAAM,aAAa,GAA2B,MAAM,CAAC,MAAM,CAAC;IACjE,6EAA6E;IAC7E,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,0DAA0D,EAAE;IACjI,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,yCAAyC,EAAE;IAC/G,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,8CAA8C,EAAE;IACrH,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,mCAAmC,EAAE;IACxG,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,iBAAiB,EAAE;IAC1G,MAAM;IACN,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,+CAA+C,EAAE;IAC7F,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,iEAAiE,EAAE;IACxH,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACtF,OAAO;IACP,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,+CAA+C,EAAE;IACpG,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAClF,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,mCAAmC,EAAE;IAClF,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,iCAAiC,EAAE;IACjF,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,uCAAuC,EAAE;IAC3F,QAAQ;IACR,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,kCAAkC,EAAE;IACtF,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,6CAA6C,EAAE;IACrH,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,uCAAuC,EAAE;IAC3F,MAAM;IACN,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,sCAAsC,EAAE;IACxF,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,qCAAqC,EAAE;IAC1F,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mCAAmC,EAAE;CACzF,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/D,2DAA2D;AAC3D,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC"}
@@ -20,6 +20,7 @@ export { taskEntryUrl } from './facades/task.js';
20
20
  export { defineTask, taskContext } from './defineTask.js';
21
21
  export type { TaskDefinition, TaskContext } from './defineTask.js';
22
22
  export { MCP_CATALOG } from './mcp-catalog.js';
23
+ export { BUNDLED_TOOLS, bundledTool, type BundledTool } from './bundledTools.js';
23
24
  export { createProxyClient, nativeSigner } from './proxyClient.js';
24
25
  export { createProxyHost } from './proxyHost.js';
25
26
  export type { ProxyHost, ProxyHostOpts } from './proxyHost.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvI,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,cAAc,EACd,OAAO,EACP,WAAW,EACX,SAAS,EACT,QAAQ,EACR,MAAM,EACN,SAAS,EACT,cAAc,EACd,aAAa,EACb,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,aAAa,EACb,aAAa,EACb,QAAQ,EACR,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,eAAe,EACf,aAAa,EACb,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,QAAQ,EACR,YAAY,EACZ,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtF,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGjF,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EACV,WAAW,EACX,eAAe,EACf,WAAW,EACX,QAAQ,EACR,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACvI,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACnF,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -10,6 +10,7 @@ export { taskEntryUrl } from './facades/task.js';
10
10
  // Background-task authoring SDK (used inside a task bundle, not the app shell).
11
11
  export { defineTask, taskContext } from './defineTask.js';
12
12
  export { MCP_CATALOG } from './mcp-catalog.js';
13
+ export { BUNDLED_TOOLS, bundledTool } from './bundledTools.js';
13
14
  // ── Ugly Proxy (remote UglyNative over WebRTC) ──
14
15
  export { createProxyClient, nativeSigner } from './proxyClient.js';
15
16
  export { createProxyHost } from './proxyHost.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,0EAA0E;AAC1E,wFAAwF;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUtF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,mDAAmD;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASjD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvI,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/native/index.ts"],"names":[],"mappings":"AA0CA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,0EAA0E;AAC1E,wFAAwF;AACxF,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUtF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE1D,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAoB,MAAM,mBAAmB,CAAC;AAEjF,mDAAmD;AACnD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AASjD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEvI,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ugly-app",
3
- "version": "0.1.743",
3
+ "version": "0.1.744",
4
4
  "type": "module",
5
5
  "comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
6
6
  "files": [
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by prebuild — do not edit manually
2
- export const CLI_VERSION = "0.1.743";
2
+ export const CLI_VERSION = "0.1.744";
@@ -0,0 +1,26 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { BUNDLED_TOOLS, bundledTool } from './bundledTools';
3
+
4
+ describe('bundled tool catalog', () => {
5
+ it('includes the core toolchain as shell tools', () => {
6
+ for (const n of ['node', 'git', 'pnpm', 'uv']) {
7
+ const t = bundledTool(n);
8
+ expect(t, `${n} missing`).toBeDefined();
9
+ expect(t!.category).toBe('toolchain');
10
+ expect(t!.shellTool).toBe(true);
11
+ }
12
+ });
13
+
14
+ it('every tool has a non-empty description and unique name', () => {
15
+ const names = new Set<string>();
16
+ for (const t of BUNDLED_TOOLS) {
17
+ expect(t.description.length, `${t.name} desc`).toBeGreaterThan(0);
18
+ expect(names.has(t.name), `dup ${t.name}`).toBe(false);
19
+ names.add(t.name);
20
+ }
21
+ });
22
+
23
+ it('returns undefined for unknown tools', () => {
24
+ expect(bundledTool('definitely-not-a-tool')).toBeUndefined();
25
+ });
26
+ });
@@ -0,0 +1,50 @@
1
+ // The catalog of bundled command-line tools an app may request through the
2
+ // permission system (like mic/camera). This is VOCABULARY ONLY — names and
3
+ // static metadata. Versions, download sources, install, PATH, and upgrade all
4
+ // live in the host (ugly-studio); ugly-app never touches a binary.
5
+
6
+ export interface BundledTool {
7
+ /** Request/grant key and default spawn name, e.g. 'pnpm'. */
8
+ name: string;
9
+ /** Executable basename when it differs from `name` (e.g. imagemagick → magick). */
10
+ exe?: string;
11
+ category: 'toolchain' | 'media' | 'data' | 'doc' | 'net';
12
+ /** Must be on PATH for `bash -lc` invocations (node/git/pnpm/uv/python). */
13
+ shellTool?: boolean;
14
+ /** Shown in the permission prompt, like mic/camera copy. */
15
+ description: string;
16
+ }
17
+
18
+ export const BUNDLED_TOOLS: readonly BundledTool[] = Object.freeze([
19
+ // toolchain — needed on PATH so shells (`bash -lc 'pnpm dev'`) resolve them.
20
+ { name: 'node', category: 'toolchain', shellTool: true, description: 'Node.js runtime — runs your project and its build tools.' },
21
+ { name: 'git', category: 'toolchain', shellTool: true, description: 'Git — version control for your project.' },
22
+ { name: 'pnpm', category: 'toolchain', shellTool: true, description: 'pnpm — installs your project’s dependencies.' },
23
+ { name: 'uv', category: 'toolchain', shellTool: true, description: 'uv — fast Python package manager.' },
24
+ { name: 'python', exe: 'python3', category: 'toolchain', shellTool: true, description: 'Python runtime.' },
25
+ // net
26
+ { name: 'gh', category: 'net', description: 'GitHub CLI — sign in and manage repositories.' },
27
+ { name: 'cloudflared', category: 'net', description: 'Cloudflare tunnel — exposes your local preview at a public URL.' },
28
+ { name: 'nats', category: 'net', description: 'NATS CLI — messaging server tooling.' },
29
+ // data
30
+ { name: 'postgres', category: 'data', description: 'PostgreSQL — local database for your project.' },
31
+ { name: 'jq', category: 'data', description: 'jq — command-line JSON processor.' },
32
+ { name: 'yq', category: 'data', description: 'yq — command-line YAML processor.' },
33
+ { name: 'pup', category: 'data', description: 'pup — command-line HTML parser.' },
34
+ { name: 'sqlite3', category: 'data', description: 'SQLite — command-line database shell.' },
35
+ // media
36
+ { name: 'ffmpeg', category: 'media', description: 'FFmpeg — audio/video processing.' },
37
+ { name: 'imagemagick', exe: 'magick', category: 'media', description: 'ImageMagick — image conversion and editing.' },
38
+ { name: 'yt-dlp', category: 'media', description: 'yt-dlp — download media from the web.' },
39
+ // doc
40
+ { name: 'pandoc', category: 'doc', description: 'Pandoc — document format conversion.' },
41
+ { name: 'pdftotext', category: 'doc', description: 'pdftotext — extract text from PDFs.' },
42
+ { name: 'tesseract', category: 'doc', description: 'Tesseract — OCR text from images.' },
43
+ ]);
44
+
45
+ const BY_NAME = new Map(BUNDLED_TOOLS.map((t) => [t.name, t]));
46
+
47
+ /** Look up a tool descriptor by its request/grant name. */
48
+ export function bundledTool(name: string): BundledTool | undefined {
49
+ return BY_NAME.get(name);
50
+ }
@@ -65,6 +65,8 @@ export { defineTask, taskContext } from './defineTask.js';
65
65
  export type { TaskDefinition, TaskContext } from './defineTask.js';
66
66
  export { MCP_CATALOG } from './mcp-catalog.js';
67
67
 
68
+ export { BUNDLED_TOOLS, bundledTool, type BundledTool } from './bundledTools.js';
69
+
68
70
  // ── Ugly Proxy (remote UglyNative over WebRTC) ──
69
71
  export { createProxyClient, nativeSigner } from './proxyClient.js';
70
72
  export { createProxyHost } from './proxyHost.js';