@intentic/sandbox-contract 1.333.0 → 1.333.1

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,6 +1,7 @@
1
1
  export declare const RESERVED_PROJECT_DIR_NAMES: readonly string[];
2
2
  export declare const isProjectDirName: (name: string) => boolean;
3
3
  export declare const projectDirNameFor: (folderBasename: string) => string;
4
+ export declare const projectDirCandidates: (hostPath: string) => string[];
4
5
  export declare const projectRemoteDir: (name: string) => string;
5
6
  export declare const projectDirNameOf: (remoteDir: string, root?: string) => string | undefined;
6
7
  //# sourceMappingURL=project-dir.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-dir.d.ts","sourceRoot":"","sources":["../../src/ids/project-dir.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAavD,CAAC;AAaF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,OAAoF,CAAC;AAIrI,eAAO,MAAM,iBAAiB,mBAAoB,MAAM,KAAG,MAW1D,CAAC;AAIF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAAqC,CAAC;AAEtF,eAAO,MAAM,gBAAgB,cAAe,MAAM,SAAQ,MAAM,KAAoB,MAAM,GAAG,SAO5F,CAAC"}
1
+ {"version":3,"file":"project-dir.d.ts","sourceRoot":"","sources":["../../src/ids/project-dir.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,0BAA0B,EAAE,SAAS,MAAM,EAavD,CAAC;AAaF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,OAAoF,CAAC;AAIrI,eAAO,MAAM,iBAAiB,mBAAoB,MAAM,KAAG,MAW1D,CAAC;AAQF,eAAO,MAAM,oBAAoB,aAAc,MAAM,KAAG,MAAM,EAM7D,CAAC;AAIF,eAAO,MAAM,gBAAgB,SAAU,MAAM,KAAG,MAAqC,CAAC;AAEtF,eAAO,MAAM,gBAAgB,cAAe,MAAM,SAAQ,MAAM,KAAoB,MAAM,GAAG,SAO5F,CAAC"}
@@ -31,6 +31,13 @@ export const projectDirNameFor = (folderBasename) => {
31
31
  const name = slug === "" ? FALLBACK_NAME : slug;
32
32
  return RESERVED_PROJECT_DIR_NAMES.includes(name) ? `${name}-project` : name;
33
33
  };
34
+ export const projectDirCandidates = (hostPath) => {
35
+ const unc = /^[\\/]{2}[^\\/]/.test(hostPath);
36
+ const segments = hostPath.split(/[\\/]+/).filter((segment) => segment !== "");
37
+ const named = (unc ? segments.slice(2) : segments).filter((segment) => !/^[A-Za-z]:$/.test(segment));
38
+ const candidates = [1, 2, 3].flatMap((depth) => (named.length < depth ? [] : [projectDirNameFor(named.slice(-depth).join("-"))]));
39
+ return [...new Set(candidates)];
40
+ };
34
41
  export const projectRemoteDir = (name) => `${WORKSPACE_ROOT}/${name}`;
35
42
  export const projectDirNameOf = (remoteDir, root = WORKSPACE_ROOT) => {
36
43
  const prefix = `${root}/`;
@@ -1 +1 @@
1
- {"version":3,"file":"project-dir.js","sourceRoot":"","sources":["../../src/ids/project-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAcnD,MAAM,CAAC,MAAM,0BAA0B,GAAsB;IACzD,UAAU;IACV,aAAa;IACb,YAAY;IACZ,MAAM;IACN,QAAQ;IACR,eAAe;IACf,KAAK;IACL,WAAW;IACX,cAAc;IACd,MAAM;IACN,MAAM;IACN,aAAa;CAChB,CAAC;AAIF,MAAM,gBAAgB,GAAG,mCAAmC,CAAC;AAC7D,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAGhC,MAAM,aAAa,GAAG,SAAS,CAAC;AAGhC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAW,EAAE,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAIrI,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,cAAsB,EAAU,EAAE;IAChE,MAAM,IAAI,GAAG,cAAc;SACtB,SAAS,CAAC,MAAM,CAAC;SACjB,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;SAC5B,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC;SACjC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;SACtB,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,KAAK,CAAC,CAAC,EAAE,oBAAoB,CAAC;SAC9B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC;IAChD,OAAO,0BAA0B,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;AAChF,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,GAAG,cAAc,IAAI,IAAI,EAAE,CAAC;AAEtF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAE,IAAI,GAAW,cAAc,EAAsB,EAAE;IACrG,MAAM,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC;IAC1B,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;AACrD,CAAC,CAAC"}
1
+ {"version":3,"file":"project-dir.js","sourceRoot":"","sources":["../../src/ids/project-dir.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@intentic/sandbox-contract",
3
- "version": "1.333.0",
3
+ "version": "1.333.1",
4
4
  "description": "oRPC wire contract for the intentic sandbox daemon, shared by the daemon and its browser client",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -339,10 +339,10 @@
339
339
  }
340
340
  },
341
341
  "dependencies": {
342
- "@intentic/base": "1.333.0",
343
- "@intentic/constants": "1.333.0",
344
- "@intentic/extension-manifest": "1.333.0",
345
- "@intentic/registry": "1.333.0",
342
+ "@intentic/base": "1.333.1",
343
+ "@intentic/constants": "1.333.1",
344
+ "@intentic/extension-manifest": "1.333.1",
345
+ "@intentic/registry": "1.333.1",
346
346
  "@orpc/contract": "1.15.4",
347
347
  "tslib": "2.8.1",
348
348
  "zod": "4.6.5"
@@ -1,7 +1,7 @@
1
1
  import { readFileSync } from "node:fs";
2
2
  import { MEMORY_FILE, PUBLIC_DIR, REFERENCE_DIR, WORKSPACE_ROOT } from "@intentic/constants";
3
3
  import { STARTER_REPO } from "../state/starter.js";
4
- import { isProjectDirName, projectDirNameFor, projectDirNameOf, projectRemoteDir, RESERVED_PROJECT_DIR_NAMES } from "./project-dir.js";
4
+ import { isProjectDirName, projectDirCandidates, projectDirNameFor, projectDirNameOf, projectRemoteDir, RESERVED_PROJECT_DIR_NAMES } from "./project-dir.js";
5
5
 
6
6
  // The cases `ic` is held to as well (_sandbox/ic/src/sandbox/project_dir.rs), read from the one file both run.
7
7
  interface ProjectDirCases {
@@ -58,3 +58,21 @@ test("a project dir is exactly one valid name under the workspace root", () => {
58
58
  expect(projectDirNameOf("/workspace/my-app")).toBeUndefined();
59
59
  expect(projectDirNameOf("/srv/work/my-app", "/srv/work")).toBe("my-app");
60
60
  });
61
+
62
+ // A second folder of the same name takes a name that says which one it is: its parent's in front (machine_sandbox.rs
63
+ // `unique_name` takes the first one free). Where a folder is (a drive, a network share) never lends a name.
64
+ const NAMED: readonly { readonly path: string; readonly names: string[] }[] = [
65
+ { path: "C:\\Users\\ada\\code\\app", names: ["app-project", "code-app", "ada-code-app"] },
66
+ { path: "C:\\Users\\ada\\work\\My App", names: ["My-App", "work-My-App", "ada-work-My-App"] },
67
+ { path: "/home/ada/sites/blog", names: ["blog", "sites-blog", "ada-sites-blog"] },
68
+ { path: "\\\\wsl.localhost\\arch\\home\\ada\\api", names: ["api", "ada-api", "home-ada-api"] },
69
+ { path: "\\\\server\\share\\api", names: ["api"] },
70
+ { path: "D:\\blog", names: ["blog"] },
71
+ { path: "D:\\", names: [] },
72
+ { path: "C:/Users/ada/Café/menu/", names: ["menu", "Cafe-menu", "ada-Cafe-menu"] },
73
+ ];
74
+ test.each([...NAMED])("$path may be called $names", ({ path, names }) => {
75
+ const candidates = projectDirCandidates(path);
76
+ expect(candidates).toEqual(names);
77
+ expect(candidates.every(isProjectDirName)).toBe(true);
78
+ });
@@ -56,6 +56,20 @@ export const projectDirNameFor = (folderBasename: string): string => {
56
56
  return RESERVED_PROJECT_DIR_NAMES.includes(name) ? `${name}-project` : name;
57
57
  };
58
58
 
59
+ // The names a folder may take in this computer's sandbox, best first: its own name, then its parent's name in front of
60
+ // it, then its grandparent's too (`app`, `code-app`, `radar-code-app`), each one `isProjectDirName` accepts and none
61
+ // twice. The desktop app takes the first one free (machine_sandbox.rs `unique_name`) and numbers only past all of them,
62
+ // so a second folder called `app` reads as `code-app`, which says which one it is, rather than `app-2` (2026-10-12). A
63
+ // drive (`C:`) and a network share's server and share (`\\server\share`, `\\wsl.localhost\<distro>`) are where a folder
64
+ // is, not what it is called, so they never lend a name.
65
+ export const projectDirCandidates = (hostPath: string): string[] => {
66
+ const unc = /^[\\/]{2}[^\\/]/.test(hostPath);
67
+ const segments = hostPath.split(/[\\/]+/).filter((segment) => segment !== "");
68
+ const named = (unc ? segments.slice(2) : segments).filter((segment) => !/^[A-Za-z]:$/.test(segment));
69
+ const candidates = [1, 2, 3].flatMap((depth) => (named.length < depth ? [] : [projectDirNameFor(named.slice(-depth).join("-"))]));
70
+ return [...new Set(candidates)];
71
+ };
72
+
59
73
  // Where a project folder lands in the sandbox, and the name back out of such a path: exactly `<root>/<name>`, anything
60
74
  // else (a deeper path, a trailing slash, a reserved name) is not a project dir.
61
75
  export const projectRemoteDir = (name: string): string => `${WORKSPACE_ROOT}/${name}`;