@agentuity/cli 0.1.39 → 0.1.40

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 +1 @@
1
- {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/publish.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,sCA6E5B,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/publish.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,sCAmF5B,CAAC;AAEH,eAAe,iBAAiB,CAAC"}
@@ -35,6 +35,7 @@ export const publishSubcommand = createCommand({
35
35
  partitionKey: z.string().optional().describe('Partition key for ordering'),
36
36
  idempotencyKey: z.string().optional().describe('Idempotency key to prevent duplicates'),
37
37
  ttl: z.coerce.number().optional().describe('Message TTL in seconds'),
38
+ sync: z.boolean().optional().describe('Publish synchronously (wait for persistence)'),
38
39
  }),
39
40
  response: MessageSchema,
40
41
  },
@@ -57,13 +58,17 @@ export const publishSubcommand = createCommand({
57
58
  tui.fatal('Invalid metadata JSON', ErrorCode.INVALID_ARGUMENT);
58
59
  }
59
60
  }
61
+ const apiOptions = getQueueApiOptions(ctx) ?? {};
62
+ if (opts.sync) {
63
+ apiOptions.sync = true;
64
+ }
60
65
  const message = await publishMessage(client, args.queue_name, {
61
66
  payload,
62
67
  metadata,
63
68
  partition_key: opts.partitionKey,
64
69
  idempotency_key: opts.idempotencyKey,
65
70
  ttl_seconds: opts.ttl,
66
- }, getQueueApiOptions(ctx));
71
+ }, apiOptions);
67
72
  if (!options.json) {
68
73
  tui.success(`Published message: ${message.id}`);
69
74
  console.log(` Offset: ${message.offset}`);
@@ -1 +1 @@
1
- {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/publish.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/publish.ts"],"names":[],"mappings":"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"}
@@ -20,7 +20,8 @@ export interface QueueContext {
20
20
  export declare function createQueueAPIClient(ctx: QueueContext): Promise<APIClient>;
21
21
  /**
22
22
  * Creates QueueApiOptions from the CLI context.
23
- * Prioritizes explicit orgId on context, then falls back to global --org-id option.
23
+ * Prioritizes explicit orgId on context, then falls back to global --org-id option,
24
+ * and finally to the preferred org from the profile configuration.
24
25
  */
25
26
  export declare function getQueueApiOptions(ctx: QueueContext): QueueApiOptions | undefined;
26
27
  //# sourceMappingURL=util.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAEhF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,CAGjF"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/util.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,CAEhF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,YAAY,GAAG,eAAe,GAAG,SAAS,CAGjF"}
@@ -10,10 +10,11 @@ export async function createQueueAPIClient(ctx) {
10
10
  }
11
11
  /**
12
12
  * Creates QueueApiOptions from the CLI context.
13
- * Prioritizes explicit orgId on context, then falls back to global --org-id option.
13
+ * Prioritizes explicit orgId on context, then falls back to global --org-id option,
14
+ * and finally to the preferred org from the profile configuration.
14
15
  */
15
16
  export function getQueueApiOptions(ctx) {
16
- const orgId = ctx.orgId ?? ctx.options.orgId;
17
+ const orgId = ctx.orgId ?? ctx.options.orgId ?? ctx.config?.preferences?.orgId;
17
18
  return orgId ? { orgId } : undefined;
18
19
  }
19
20
  //# sourceMappingURL=util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAc7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAiB;IAC3D,OAAO,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../../../../src/cmd/cloud/queue/util.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAc7D;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAiB;IAC3D,OAAO,0BAA0B,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IACnD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC;IAC/E,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC"}
@@ -3,6 +3,57 @@ export interface PackageRef {
3
3
  name: string;
4
4
  version: string;
5
5
  }
6
+ /**
7
+ * Mapping from alias key (aliasName@version) to actual package reference.
8
+ * Used to resolve npm aliases (e.g., "tailwind-merge-v2": "npm:tailwind-merge@2.6.0")
9
+ * to their actual package names for accurate malware detection.
10
+ */
11
+ export type AliasMap = Map<string, PackageRef>;
6
12
  export declare function extractDependencies(projectDir: string, logger: Logger): Promise<PackageRef[]>;
7
13
  export declare function parseBunPmLsOutput(output: string): PackageRef[];
14
+ /**
15
+ * Load alias mappings from bun.lock file.
16
+ *
17
+ * The bun.lock file contains a "packages" object where:
18
+ * - Keys are the package names as they appear in node_modules (alias names for aliased packages)
19
+ * - Values are arrays where the first element is "actualPackageName@version"
20
+ *
21
+ * For npm aliases like `"tailwind-merge-v2": "npm:tailwind-merge@2.6.0"`:
22
+ * - Key: "tailwind-merge-v2"
23
+ * - Value[0]: "tailwind-merge@2.6.0"
24
+ *
25
+ * This function builds a map from "aliasName@version" to the actual PackageRef.
26
+ */
27
+ export declare function loadAliasMap(projectDir: string, logger: Logger): Promise<AliasMap>;
28
+ /**
29
+ * Parse bun.lock file content.
30
+ *
31
+ * bun.lock uses a relaxed JSON format (JSONC) with trailing commas, which
32
+ * standard JSON.parse cannot handle. We need to strip trailing commas before parsing.
33
+ *
34
+ * Structure:
35
+ * {
36
+ * "lockfileVersion": 1,
37
+ * "packages": {
38
+ * "package-name": ["actual-package@version", "", {}, "sha512-..."],
39
+ * ...
40
+ * }
41
+ * }
42
+ */
43
+ export declare function parseBunLockFile(content: string): BunLockFile | null;
44
+ /**
45
+ * Represents the structure of a bun.lock file.
46
+ */
47
+ export interface BunLockFile {
48
+ lockfileVersion?: number;
49
+ packages?: Record<string, unknown[]>;
50
+ }
51
+ /**
52
+ * Resolve npm aliases in the package list to their actual package names.
53
+ *
54
+ * This prevents false positives in malware detection where alias names
55
+ * (e.g., "tailwind-merge-v2") are flagged as suspicious when they're
56
+ * actually legitimate aliases for real packages (e.g., "tailwind-merge").
57
+ */
58
+ export declare function resolveAliases(packages: PackageRef[], aliasMap: AliasMap, logger: Logger): PackageRef[];
8
59
  //# sourceMappingURL=deps.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,mBAAmB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC,CAuBvB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAiB/D"}
1
+ {"version":3,"file":"deps.d.ts","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,UAAU;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AAE/C,wBAAsB,mBAAmB,CACxC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,UAAU,EAAE,CAAC,CA8BvB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,EAAE,CAiB/D;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAkDxF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAQpE;AAWD;;GAEG;AACH,MAAM,WAAW,WAAW;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;CACrC;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC7B,QAAQ,EAAE,UAAU,EAAE,EACtB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GACZ,UAAU,EAAE,CA4Bd"}
@@ -1,4 +1,5 @@
1
1
  import { $ } from 'bun';
2
+ import { join } from 'node:path';
2
3
  export async function extractDependencies(projectDir, logger) {
3
4
  try {
4
5
  logger.debug('Extracting dependencies using bun pm ls --all');
@@ -8,7 +9,13 @@ export async function extractDependencies(projectDir, logger) {
8
9
  return [];
9
10
  }
10
11
  const output = result.stdout.toString();
11
- const packages = parseBunPmLsOutput(output);
12
+ let packages = parseBunPmLsOutput(output);
13
+ // Load alias map from bun.lock to resolve npm aliases to actual package names
14
+ const aliasMap = await loadAliasMap(projectDir, logger);
15
+ if (aliasMap.size > 0) {
16
+ logger.debug('Loaded %d package aliases from bun.lock', aliasMap.size);
17
+ packages = resolveAliases(packages, aliasMap, logger);
18
+ }
12
19
  logger.debug('Extracted %d unique packages', packages.length);
13
20
  return packages;
14
21
  }
@@ -33,4 +40,120 @@ export function parseBunPmLsOutput(output) {
33
40
  }
34
41
  return Array.from(packages.values());
35
42
  }
43
+ /**
44
+ * Load alias mappings from bun.lock file.
45
+ *
46
+ * The bun.lock file contains a "packages" object where:
47
+ * - Keys are the package names as they appear in node_modules (alias names for aliased packages)
48
+ * - Values are arrays where the first element is "actualPackageName@version"
49
+ *
50
+ * For npm aliases like `"tailwind-merge-v2": "npm:tailwind-merge@2.6.0"`:
51
+ * - Key: "tailwind-merge-v2"
52
+ * - Value[0]: "tailwind-merge@2.6.0"
53
+ *
54
+ * This function builds a map from "aliasName@version" to the actual PackageRef.
55
+ */
56
+ export async function loadAliasMap(projectDir, logger) {
57
+ const aliasMap = new Map();
58
+ try {
59
+ const lockfilePath = join(projectDir, 'bun.lock');
60
+ const lockfile = Bun.file(lockfilePath);
61
+ if (!(await lockfile.exists())) {
62
+ logger.debug('No bun.lock file found, skipping alias resolution');
63
+ return aliasMap;
64
+ }
65
+ const content = await lockfile.text();
66
+ const parsed = parseBunLockFile(content);
67
+ if (!parsed || !parsed.packages) {
68
+ return aliasMap;
69
+ }
70
+ for (const [aliasName, packageInfo] of Object.entries(parsed.packages)) {
71
+ if (!Array.isArray(packageInfo) || packageInfo.length === 0) {
72
+ continue;
73
+ }
74
+ const actualPackageSpec = packageInfo[0];
75
+ if (typeof actualPackageSpec !== 'string') {
76
+ continue;
77
+ }
78
+ // Parse "actualPackageName@version" from the first element
79
+ const atIndex = actualPackageSpec.lastIndexOf('@');
80
+ if (atIndex <= 0) {
81
+ continue;
82
+ }
83
+ const actualName = actualPackageSpec.substring(0, atIndex);
84
+ const actualVersion = actualPackageSpec.substring(atIndex + 1);
85
+ // Only add to alias map if the alias name differs from the actual name
86
+ // This indicates an npm alias (e.g., tailwind-merge-v2 -> tailwind-merge)
87
+ if (aliasName !== actualName) {
88
+ const aliasKey = `${aliasName}@${actualVersion}`;
89
+ aliasMap.set(aliasKey, { name: actualName, version: actualVersion });
90
+ }
91
+ }
92
+ }
93
+ catch (error) {
94
+ logger.debug('Failed to parse bun.lock for alias resolution: %s', error);
95
+ }
96
+ return aliasMap;
97
+ }
98
+ /**
99
+ * Parse bun.lock file content.
100
+ *
101
+ * bun.lock uses a relaxed JSON format (JSONC) with trailing commas, which
102
+ * standard JSON.parse cannot handle. We need to strip trailing commas before parsing.
103
+ *
104
+ * Structure:
105
+ * {
106
+ * "lockfileVersion": 1,
107
+ * "packages": {
108
+ * "package-name": ["actual-package@version", "", {}, "sha512-..."],
109
+ * ...
110
+ * }
111
+ * }
112
+ */
113
+ export function parseBunLockFile(content) {
114
+ try {
115
+ // bun.lock uses JSONC format with trailing commas - strip them before parsing
116
+ const sanitized = stripTrailingCommas(content);
117
+ return JSON.parse(sanitized);
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * Strip trailing commas from JSONC content to make it valid JSON.
125
+ * Handles trailing commas before ] and } characters.
126
+ */
127
+ function stripTrailingCommas(content) {
128
+ // Match comma followed by optional whitespace and then ] or }
129
+ return content.replace(/,(\s*[}\]])/g, '$1');
130
+ }
131
+ /**
132
+ * Resolve npm aliases in the package list to their actual package names.
133
+ *
134
+ * This prevents false positives in malware detection where alias names
135
+ * (e.g., "tailwind-merge-v2") are flagged as suspicious when they're
136
+ * actually legitimate aliases for real packages (e.g., "tailwind-merge").
137
+ */
138
+ export function resolveAliases(packages, aliasMap, logger) {
139
+ const resolved = new Map();
140
+ for (const pkg of packages) {
141
+ const aliasKey = `${pkg.name}@${pkg.version}`;
142
+ const actualPkg = aliasMap.get(aliasKey);
143
+ if (actualPkg) {
144
+ logger.debug('Resolved npm alias: %s@%s -> %s@%s', pkg.name, pkg.version, actualPkg.name, actualPkg.version);
145
+ const resolvedKey = `${actualPkg.name}@${actualPkg.version}`;
146
+ if (!resolved.has(resolvedKey)) {
147
+ resolved.set(resolvedKey, actualPkg);
148
+ }
149
+ }
150
+ else {
151
+ const key = `${pkg.name}@${pkg.version}`;
152
+ if (!resolved.has(key)) {
153
+ resolved.set(key, pkg);
154
+ }
155
+ }
156
+ }
157
+ return Array.from(resolved.values());
158
+ }
36
159
  //# sourceMappingURL=deps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAQxB,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACxC,UAAkB,EAClB,MAAc;IAEd,IAAI,CAAC;QACJ,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,CAAC,CAAA,iBAAiB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,CAAC;QAE1E,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,CAAC,IAAI,CACV,+DAA+D,EAC/D,MAAM,CAAC,QAAQ,CACf,CAAC;YACF,OAAO,EAAE,CAAC;QACX,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,EAAE,CAAC;IACX,CAAC;AACF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC/C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QAC3D,IAAI,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;YACjC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/cli",
3
- "version": "0.1.39",
3
+ "version": "0.1.40",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -40,9 +40,9 @@
40
40
  "prepublishOnly": "bun run clean && bun run build"
41
41
  },
42
42
  "dependencies": {
43
- "@agentuity/auth": "0.1.39",
44
- "@agentuity/core": "0.1.39",
45
- "@agentuity/server": "0.1.39",
43
+ "@agentuity/auth": "0.1.40",
44
+ "@agentuity/core": "0.1.40",
45
+ "@agentuity/server": "0.1.40",
46
46
  "@datasert/cronjs-parser": "^1.4.0",
47
47
  "@terascope/fetch-github-release": "^2.2.1",
48
48
  "@vitejs/plugin-react": "^5.1.2",
@@ -60,10 +60,10 @@
60
60
  "typescript": "^5.9.0",
61
61
  "vite": "^7.2.7",
62
62
  "zod": "^4.3.5",
63
- "@agentuity/frontend": "0.1.39"
63
+ "@agentuity/frontend": "0.1.40"
64
64
  },
65
65
  "devDependencies": {
66
- "@agentuity/test-utils": "0.1.39",
66
+ "@agentuity/test-utils": "0.1.40",
67
67
  "@types/adm-zip": "^0.5.7",
68
68
  "@types/bun": "latest",
69
69
  "@types/tar-fs": "^2.0.4",
@@ -38,6 +38,7 @@ export const publishSubcommand = createCommand({
38
38
  partitionKey: z.string().optional().describe('Partition key for ordering'),
39
39
  idempotencyKey: z.string().optional().describe('Idempotency key to prevent duplicates'),
40
40
  ttl: z.coerce.number().optional().describe('Message TTL in seconds'),
41
+ sync: z.boolean().optional().describe('Publish synchronously (wait for persistence)'),
41
42
  }),
42
43
  response: MessageSchema,
43
44
  },
@@ -62,6 +63,11 @@ export const publishSubcommand = createCommand({
62
63
  }
63
64
  }
64
65
 
66
+ const apiOptions = getQueueApiOptions(ctx) ?? {};
67
+ if (opts.sync) {
68
+ apiOptions.sync = true;
69
+ }
70
+
65
71
  const message = await publishMessage(
66
72
  client,
67
73
  args.queue_name,
@@ -72,7 +78,7 @@ export const publishSubcommand = createCommand({
72
78
  idempotency_key: opts.idempotencyKey,
73
79
  ttl_seconds: opts.ttl,
74
80
  },
75
- getQueueApiOptions(ctx)
81
+ apiOptions
76
82
  );
77
83
 
78
84
  if (!options.json) {
@@ -26,9 +26,10 @@ export async function createQueueAPIClient(ctx: QueueContext): Promise<APIClient
26
26
 
27
27
  /**
28
28
  * Creates QueueApiOptions from the CLI context.
29
- * Prioritizes explicit orgId on context, then falls back to global --org-id option.
29
+ * Prioritizes explicit orgId on context, then falls back to global --org-id option,
30
+ * and finally to the preferred org from the profile configuration.
30
31
  */
31
32
  export function getQueueApiOptions(ctx: QueueContext): QueueApiOptions | undefined {
32
- const orgId = ctx.orgId ?? ctx.options.orgId;
33
+ const orgId = ctx.orgId ?? ctx.options.orgId ?? ctx.config?.preferences?.orgId;
33
34
  return orgId ? { orgId } : undefined;
34
35
  }
package/src/utils/deps.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { $ } from 'bun';
2
+ import { join } from 'node:path';
2
3
  import type { Logger } from '../types';
3
4
 
4
5
  export interface PackageRef {
@@ -6,6 +7,13 @@ export interface PackageRef {
6
7
  version: string;
7
8
  }
8
9
 
10
+ /**
11
+ * Mapping from alias key (aliasName@version) to actual package reference.
12
+ * Used to resolve npm aliases (e.g., "tailwind-merge-v2": "npm:tailwind-merge@2.6.0")
13
+ * to their actual package names for accurate malware detection.
14
+ */
15
+ export type AliasMap = Map<string, PackageRef>;
16
+
9
17
  export async function extractDependencies(
10
18
  projectDir: string,
11
19
  logger: Logger
@@ -24,7 +32,14 @@ export async function extractDependencies(
24
32
  }
25
33
 
26
34
  const output = result.stdout.toString();
27
- const packages = parseBunPmLsOutput(output);
35
+ let packages = parseBunPmLsOutput(output);
36
+
37
+ // Load alias map from bun.lock to resolve npm aliases to actual package names
38
+ const aliasMap = await loadAliasMap(projectDir, logger);
39
+ if (aliasMap.size > 0) {
40
+ logger.debug('Loaded %d package aliases from bun.lock', aliasMap.size);
41
+ packages = resolveAliases(packages, aliasMap, logger);
42
+ }
28
43
 
29
44
  logger.debug('Extracted %d unique packages', packages.length);
30
45
  return packages;
@@ -52,3 +67,151 @@ export function parseBunPmLsOutput(output: string): PackageRef[] {
52
67
 
53
68
  return Array.from(packages.values());
54
69
  }
70
+
71
+ /**
72
+ * Load alias mappings from bun.lock file.
73
+ *
74
+ * The bun.lock file contains a "packages" object where:
75
+ * - Keys are the package names as they appear in node_modules (alias names for aliased packages)
76
+ * - Values are arrays where the first element is "actualPackageName@version"
77
+ *
78
+ * For npm aliases like `"tailwind-merge-v2": "npm:tailwind-merge@2.6.0"`:
79
+ * - Key: "tailwind-merge-v2"
80
+ * - Value[0]: "tailwind-merge@2.6.0"
81
+ *
82
+ * This function builds a map from "aliasName@version" to the actual PackageRef.
83
+ */
84
+ export async function loadAliasMap(projectDir: string, logger: Logger): Promise<AliasMap> {
85
+ const aliasMap: AliasMap = new Map();
86
+
87
+ try {
88
+ const lockfilePath = join(projectDir, 'bun.lock');
89
+ const lockfile = Bun.file(lockfilePath);
90
+
91
+ if (!(await lockfile.exists())) {
92
+ logger.debug('No bun.lock file found, skipping alias resolution');
93
+ return aliasMap;
94
+ }
95
+
96
+ const content = await lockfile.text();
97
+ const parsed = parseBunLockFile(content);
98
+
99
+ if (!parsed || !parsed.packages) {
100
+ return aliasMap;
101
+ }
102
+
103
+ for (const [aliasName, packageInfo] of Object.entries(parsed.packages)) {
104
+ if (!Array.isArray(packageInfo) || packageInfo.length === 0) {
105
+ continue;
106
+ }
107
+
108
+ const actualPackageSpec = packageInfo[0];
109
+ if (typeof actualPackageSpec !== 'string') {
110
+ continue;
111
+ }
112
+
113
+ // Parse "actualPackageName@version" from the first element
114
+ const atIndex = actualPackageSpec.lastIndexOf('@');
115
+ if (atIndex <= 0) {
116
+ continue;
117
+ }
118
+
119
+ const actualName = actualPackageSpec.substring(0, atIndex);
120
+ const actualVersion = actualPackageSpec.substring(atIndex + 1);
121
+
122
+ // Only add to alias map if the alias name differs from the actual name
123
+ // This indicates an npm alias (e.g., tailwind-merge-v2 -> tailwind-merge)
124
+ if (aliasName !== actualName) {
125
+ const aliasKey = `${aliasName}@${actualVersion}`;
126
+ aliasMap.set(aliasKey, { name: actualName, version: actualVersion });
127
+ }
128
+ }
129
+ } catch (error) {
130
+ logger.debug('Failed to parse bun.lock for alias resolution: %s', error);
131
+ }
132
+
133
+ return aliasMap;
134
+ }
135
+
136
+ /**
137
+ * Parse bun.lock file content.
138
+ *
139
+ * bun.lock uses a relaxed JSON format (JSONC) with trailing commas, which
140
+ * standard JSON.parse cannot handle. We need to strip trailing commas before parsing.
141
+ *
142
+ * Structure:
143
+ * {
144
+ * "lockfileVersion": 1,
145
+ * "packages": {
146
+ * "package-name": ["actual-package@version", "", {}, "sha512-..."],
147
+ * ...
148
+ * }
149
+ * }
150
+ */
151
+ export function parseBunLockFile(content: string): BunLockFile | null {
152
+ try {
153
+ // bun.lock uses JSONC format with trailing commas - strip them before parsing
154
+ const sanitized = stripTrailingCommas(content);
155
+ return JSON.parse(sanitized) as BunLockFile;
156
+ } catch {
157
+ return null;
158
+ }
159
+ }
160
+
161
+ /**
162
+ * Strip trailing commas from JSONC content to make it valid JSON.
163
+ * Handles trailing commas before ] and } characters.
164
+ */
165
+ function stripTrailingCommas(content: string): string {
166
+ // Match comma followed by optional whitespace and then ] or }
167
+ return content.replace(/,(\s*[}\]])/g, '$1');
168
+ }
169
+
170
+ /**
171
+ * Represents the structure of a bun.lock file.
172
+ */
173
+ export interface BunLockFile {
174
+ lockfileVersion?: number;
175
+ packages?: Record<string, unknown[]>;
176
+ }
177
+
178
+ /**
179
+ * Resolve npm aliases in the package list to their actual package names.
180
+ *
181
+ * This prevents false positives in malware detection where alias names
182
+ * (e.g., "tailwind-merge-v2") are flagged as suspicious when they're
183
+ * actually legitimate aliases for real packages (e.g., "tailwind-merge").
184
+ */
185
+ export function resolveAliases(
186
+ packages: PackageRef[],
187
+ aliasMap: AliasMap,
188
+ logger: Logger
189
+ ): PackageRef[] {
190
+ const resolved = new Map<string, PackageRef>();
191
+
192
+ for (const pkg of packages) {
193
+ const aliasKey = `${pkg.name}@${pkg.version}`;
194
+ const actualPkg = aliasMap.get(aliasKey);
195
+
196
+ if (actualPkg) {
197
+ logger.debug(
198
+ 'Resolved npm alias: %s@%s -> %s@%s',
199
+ pkg.name,
200
+ pkg.version,
201
+ actualPkg.name,
202
+ actualPkg.version
203
+ );
204
+ const resolvedKey = `${actualPkg.name}@${actualPkg.version}`;
205
+ if (!resolved.has(resolvedKey)) {
206
+ resolved.set(resolvedKey, actualPkg);
207
+ }
208
+ } else {
209
+ const key = `${pkg.name}@${pkg.version}`;
210
+ if (!resolved.has(key)) {
211
+ resolved.set(key, pkg);
212
+ }
213
+ }
214
+ }
215
+
216
+ return Array.from(resolved.values());
217
+ }