@hailer/mcp 1.3.10 → 1.3.12
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/CHANGELOG.md +16 -0
- package/dist/bot/bot.d.ts +10 -0
- package/dist/bot/bot.d.ts.map +1 -1
- package/dist/bot/bot.js +189 -17
- package/dist/bot/bot.js.map +1 -1
- package/dist/bot/services/helper-prompt.d.ts +1 -1
- package/dist/bot/services/helper-prompt.d.ts.map +1 -1
- package/dist/bot/services/helper-prompt.js +60 -5
- package/dist/bot/services/helper-prompt.js.map +1 -1
- package/dist/bot/services/system-prompt.d.ts.map +1 -1
- package/dist/bot/services/system-prompt.js +13 -2
- package/dist/bot/services/system-prompt.js.map +1 -1
- package/dist/lib/logger.js +2 -2
- package/dist/lib/logger.js.map +1 -1
- package/dist/mcp/publish-auth-injector.d.ts +37 -9
- package/dist/mcp/publish-auth-injector.d.ts.map +1 -1
- package/dist/mcp/publish-auth-injector.js +77 -26
- package/dist/mcp/publish-auth-injector.js.map +1 -1
- package/dist/mcp/tool-profiles.d.ts.map +1 -1
- package/dist/mcp/tool-profiles.js +1 -0
- package/dist/mcp/tool-profiles.js.map +1 -1
- package/dist/mcp/tools/app-marketplace.d.ts.map +1 -1
- package/dist/mcp/tools/app-marketplace.js +78 -41
- package/dist/mcp/tools/app-marketplace.js.map +1 -1
- package/dist/mcp/tools/workflow.d.ts +1 -0
- package/dist/mcp/tools/workflow.d.ts.map +1 -1
- package/dist/mcp/tools/workflow.js +57 -1
- package/dist/mcp/tools/workflow.js.map +1 -1
- package/dist/public-chat/graduate.d.ts.map +1 -1
- package/dist/public-chat/graduate.js +175 -49
- package/dist/public-chat/graduate.js.map +1 -1
- package/dist/public-chat/rate-limit.js +1 -1
- package/dist/public-chat/rate-limit.js.map +1 -1
- package/dist/public-chat/studio-prewarm.js +2 -2
- package/dist/public-chat/studio-prewarm.js.map +1 -1
- package/dist/public-chat/system-prompt.d.ts.map +1 -1
- package/dist/public-chat/system-prompt.js +511 -286
- package/dist/public-chat/system-prompt.js.map +1 -1
- package/package.json +14 -12
package/dist/lib/logger.js
CHANGED
|
@@ -90,9 +90,9 @@ class Logger {
|
|
|
90
90
|
} : {},
|
|
91
91
|
});
|
|
92
92
|
const loggerProvider = new sdk_logs_1.LoggerProvider({
|
|
93
|
-
resource:
|
|
93
|
+
resource: (0, resources_1.resourceFromAttributes)({ 'service.name': 'hailer-mcp-server' }),
|
|
94
|
+
processors: [new sdk_logs_1.BatchLogRecordProcessor(logExporter)],
|
|
94
95
|
});
|
|
95
|
-
loggerProvider.addLogRecordProcessor(new sdk_logs_1.BatchLogRecordProcessor(logExporter));
|
|
96
96
|
this.otelLogger = loggerProvider.getLogger('hailer-mcp', config_1.APP_VERSION);
|
|
97
97
|
}
|
|
98
98
|
catch (error) {
|
package/dist/lib/logger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAiVH,oCAEC;AAGD,4CAEC;AAtVD,uDAAuD;AACvD,sDAAkF;AAClF,sFAA0E;AAC1E,sDAA4F;AAC5F,
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,18 +5,46 @@
|
|
|
5
5
|
* Studio writes the session's user API key into the sandbox's `~/.env` so the
|
|
6
6
|
* app publish script (`@hailer/app-sdk` publish.cjs) authenticates with no
|
|
7
7
|
* flags. Locally there's no session key, but the CLI server already has the
|
|
8
|
-
* project bot's credentials in CLIENT_CONFIGS — so on
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* project bot's credentials in CLIENT_CONFIGS — so on boot we mint a user API
|
|
9
|
+
* key on the bot's authenticated socket and write it to `~/.env`, exactly
|
|
10
|
+
* where publish.cjs looks.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
12
|
+
* The minted key is workspace-scoped, but `~/.env` is machine-global: whichever
|
|
13
|
+
* project booted first used to win it permanently, so every other project then
|
|
14
|
+
* published silently into the first project's workspace. To prevent that, the
|
|
15
|
+
* injector records the workspace in the `~/.env` marker and re-mints whenever
|
|
16
|
+
* the booting project's workspace differs — the last server to boot owns
|
|
17
|
+
* `~/.env`.
|
|
18
|
+
*
|
|
19
|
+
* Best-effort (never blocks or fails server startup) and CLI-gated (prod never
|
|
20
|
+
* imports this). A key the user set themselves — exported, or hand-added to
|
|
21
|
+
* `~/.env` without our marker — is always left untouched.
|
|
22
|
+
*/
|
|
23
|
+
interface ExistingKey {
|
|
24
|
+
/** True when this injector wrote the key (our marker comment is present). */
|
|
25
|
+
managed: boolean;
|
|
26
|
+
/** Workspace id recorded in the marker, or null for our pre-1.3.11 format. */
|
|
27
|
+
workspaceId: string | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Inspect `~/.env` for a publish key. Returns null when none is present, an
|
|
31
|
+
* unmanaged entry when the user added the key themselves (no marker), or a
|
|
32
|
+
* managed entry carrying the workspace the key was minted for.
|
|
33
|
+
*/
|
|
34
|
+
export declare function readExistingKey(envPath: string): ExistingKey | null;
|
|
35
|
+
/**
|
|
36
|
+
* Rewrite `~/.env` with a freshly minted key, stripping any block we wrote
|
|
37
|
+
* before and preserving every other line. The file holds a live credential,
|
|
38
|
+
* so keep it owner-only (0600).
|
|
14
39
|
*/
|
|
40
|
+
export declare function writeManagedKey(envPath: string, key: string, workspaceId: string): void;
|
|
15
41
|
/**
|
|
16
|
-
* Mint a publish user API key from the project bot's CLIENT_CONFIGS account
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
42
|
+
* Mint a publish user API key from the project bot's CLIENT_CONFIGS account and
|
|
43
|
+
* write it to `~/.env`, scoped to the project's workspace. No-op when the file
|
|
44
|
+
* already holds our key for this workspace, when the user owns the key, or when
|
|
45
|
+
* no account is configured. Swallows every error — publishing convenience must
|
|
46
|
+
* never break the server.
|
|
20
47
|
*/
|
|
21
48
|
export declare function injectLocalPublishAuth(): Promise<void>;
|
|
49
|
+
export {};
|
|
22
50
|
//# sourceMappingURL=publish-auth-injector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-auth-injector.d.ts","sourceRoot":"","sources":["../../src/mcp/publish-auth-injector.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"publish-auth-injector.d.ts","sourceRoot":"","sources":["../../src/mcp/publish-auth-injector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAkBH,UAAU,WAAW;IACjB,6EAA6E;IAC7E,OAAO,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAmBnE;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAkBvF;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuE5D"}
|
|
@@ -6,14 +6,24 @@
|
|
|
6
6
|
* Studio writes the session's user API key into the sandbox's `~/.env` so the
|
|
7
7
|
* app publish script (`@hailer/app-sdk` publish.cjs) authenticates with no
|
|
8
8
|
* flags. Locally there's no session key, but the CLI server already has the
|
|
9
|
-
* project bot's credentials in CLIENT_CONFIGS — so on
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* project bot's credentials in CLIENT_CONFIGS — so on boot we mint a user API
|
|
10
|
+
* key on the bot's authenticated socket and write it to `~/.env`, exactly
|
|
11
|
+
* where publish.cjs looks.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
13
|
+
* The minted key is workspace-scoped, but `~/.env` is machine-global: whichever
|
|
14
|
+
* project booted first used to win it permanently, so every other project then
|
|
15
|
+
* published silently into the first project's workspace. To prevent that, the
|
|
16
|
+
* injector records the workspace in the `~/.env` marker and re-mints whenever
|
|
17
|
+
* the booting project's workspace differs — the last server to boot owns
|
|
18
|
+
* `~/.env`.
|
|
19
|
+
*
|
|
20
|
+
* Best-effort (never blocks or fails server startup) and CLI-gated (prod never
|
|
21
|
+
* imports this). A key the user set themselves — exported, or hand-added to
|
|
22
|
+
* `~/.env` without our marker — is always left untouched.
|
|
15
23
|
*/
|
|
16
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.readExistingKey = readExistingKey;
|
|
26
|
+
exports.writeManagedKey = writeManagedKey;
|
|
17
27
|
exports.injectLocalPublishAuth = injectLocalPublishAuth;
|
|
18
28
|
const cli_1 = require("@hailer/cli");
|
|
19
29
|
const fs_1 = require("fs");
|
|
@@ -22,30 +32,71 @@ const path_1 = require("path");
|
|
|
22
32
|
const config_1 = require("../config");
|
|
23
33
|
const logger_1 = require("../lib/logger");
|
|
24
34
|
const logger = (0, logger_1.createLogger)({ component: 'publish-auth' });
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
35
|
+
const MANAGED_MARKER = '# Added by hailer-mcp for local app publishing';
|
|
36
|
+
/**
|
|
37
|
+
* Inspect `~/.env` for a publish key. Returns null when none is present, an
|
|
38
|
+
* unmanaged entry when the user added the key themselves (no marker), or a
|
|
39
|
+
* managed entry carrying the workspace the key was minted for.
|
|
40
|
+
*/
|
|
41
|
+
function readExistingKey(envPath) {
|
|
30
42
|
if (!(0, fs_1.existsSync)(envPath)) {
|
|
31
|
-
return
|
|
43
|
+
return null;
|
|
32
44
|
}
|
|
45
|
+
let content = '';
|
|
33
46
|
try {
|
|
34
|
-
|
|
47
|
+
content = (0, fs_1.readFileSync)(envPath, 'utf-8');
|
|
35
48
|
}
|
|
36
49
|
catch {
|
|
37
|
-
return
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (!/^\s*(HAILER_USER_API_KEY|USER_API_KEY)\s*=/m.test(content)) {
|
|
53
|
+
return null;
|
|
38
54
|
}
|
|
55
|
+
const markerLine = content.match(/^# Added by hailer-mcp for local app publishing[^\n]*$/m);
|
|
56
|
+
if (!markerLine) {
|
|
57
|
+
return { managed: false, workspaceId: null };
|
|
58
|
+
}
|
|
59
|
+
const wsMatch = markerLine[0].match(/\(workspace ([a-f0-9]{24})\)/);
|
|
60
|
+
return { managed: true, workspaceId: wsMatch ? wsMatch[1] : null };
|
|
39
61
|
}
|
|
40
62
|
/**
|
|
41
|
-
*
|
|
42
|
-
* and
|
|
43
|
-
*
|
|
44
|
-
|
|
63
|
+
* Rewrite `~/.env` with a freshly minted key, stripping any block we wrote
|
|
64
|
+
* before and preserving every other line. The file holds a live credential,
|
|
65
|
+
* so keep it owner-only (0600).
|
|
66
|
+
*/
|
|
67
|
+
function writeManagedKey(envPath, key, workspaceId) {
|
|
68
|
+
let body = '';
|
|
69
|
+
if ((0, fs_1.existsSync)(envPath)) {
|
|
70
|
+
try {
|
|
71
|
+
body = (0, fs_1.readFileSync)(envPath, 'utf-8');
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
body = '';
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const withoutOldBlock = body.replace(/\n?# Added by hailer-mcp for local app publishing[^\n]*\n(?:HAILER_USER_API_KEY|USER_API_KEY)=[^\n]*\n?/g, '\n');
|
|
78
|
+
const preserved = withoutOldBlock.replace(/\s*$/, '');
|
|
79
|
+
const block = `${MANAGED_MARKER} (workspace ${workspaceId})\nHAILER_USER_API_KEY="${key}"\n`;
|
|
80
|
+
const next = preserved.length > 0 ? `${preserved}\n\n${block}` : block;
|
|
81
|
+
(0, fs_1.writeFileSync)(envPath, next, { mode: 0o600 });
|
|
82
|
+
(0, fs_1.chmodSync)(envPath, 0o600);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Mint a publish user API key from the project bot's CLIENT_CONFIGS account and
|
|
86
|
+
* write it to `~/.env`, scoped to the project's workspace. No-op when the file
|
|
87
|
+
* already holds our key for this workspace, when the user owns the key, or when
|
|
88
|
+
* no account is configured. Swallows every error — publishing convenience must
|
|
89
|
+
* never break the server.
|
|
45
90
|
*/
|
|
46
91
|
async function injectLocalPublishAuth() {
|
|
47
92
|
const envPath = (0, path_1.join)((0, os_1.homedir)(), '.env');
|
|
48
|
-
|
|
93
|
+
// An exported key is a deliberate override — never touch it.
|
|
94
|
+
if (process.env.HAILER_USER_API_KEY || process.env.USER_API_KEY) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
// A key the user hand-added (no marker) is theirs to manage.
|
|
98
|
+
const existing = readExistingKey(envPath);
|
|
99
|
+
if (existing && !existing.managed) {
|
|
49
100
|
return;
|
|
50
101
|
}
|
|
51
102
|
const accounts = Object.values(config_1.environment.CLIENT_CONFIGS);
|
|
@@ -68,20 +119,20 @@ async function injectLocalPublishAuth() {
|
|
|
68
119
|
logger.debug('Skipping publish-auth injection — no workspace on bot account');
|
|
69
120
|
return;
|
|
70
121
|
}
|
|
122
|
+
// Our key is already scoped to this project's workspace — leave it.
|
|
123
|
+
if (existing?.managed && existing.workspaceId === workspaceId) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
71
126
|
const keyName = `hailer-mcp local (${(0, os_1.hostname)()})`;
|
|
72
127
|
const created = await client.request('v3.user.apikey.create', [keyName, workspaceId, []]);
|
|
73
128
|
if (!created?.key) {
|
|
74
129
|
return;
|
|
75
130
|
}
|
|
76
|
-
|
|
77
|
-
// it with restrictive mode if absent, and tighten an existing file too.
|
|
78
|
-
if (!(0, fs_1.existsSync)(envPath)) {
|
|
79
|
-
(0, fs_1.writeFileSync)(envPath, '', { mode: 0o600 });
|
|
80
|
-
}
|
|
81
|
-
(0, fs_1.chmodSync)(envPath, 0o600);
|
|
82
|
-
(0, fs_1.appendFileSync)(envPath, `\n# Added by hailer-mcp for local app publishing\nHAILER_USER_API_KEY="${created.key}"\n`);
|
|
131
|
+
writeManagedKey(envPath, created.key, workspaceId);
|
|
83
132
|
process.env.HAILER_USER_API_KEY = created.key;
|
|
84
|
-
logger.info(
|
|
133
|
+
logger.info(existing?.managed
|
|
134
|
+
? 'Re-minted local publish key for current workspace → ~/.env'
|
|
135
|
+
: 'Minted local publish key → ~/.env', { keyName, workspaceId });
|
|
85
136
|
}
|
|
86
137
|
catch (error) {
|
|
87
138
|
logger.debug('Publish-auth injection skipped', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish-auth-injector.js","sourceRoot":"","sources":["../../src/mcp/publish-auth-injector.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"publish-auth-injector.js","sourceRoot":"","sources":["../../src/mcp/publish-auth-injector.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-profiles.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,aAyEpB,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"tool-profiles.d.ts","sourceRoot":"","sources":["../../src/mcp/tool-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,UAAU,GAAG,KAAK,GAAG,OAAO,CAAC;AAE/D;;;;;;;;GAQG;AACH,eAAO,MAAM,SAAS,aAyEpB,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,aA2BpB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,aAGlC,CAAC;AAEH,kFAAkF;AAClF,eAAO,MAAM,eAAe,EAAE,SAAS,EAA4D,CAAC;AAEpG;;;;GAIG;AACH,wBAAgB,uBAAuB,CACnC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACzC,OAAO,CAWT;AAED,uFAAuF;AACvF,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,GAAG;IACvD,aAAa,CAAC,EAAE,SAAS,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAcA"}
|
|
@@ -115,6 +115,7 @@ exports.BOT_TOOLS = new Set([
|
|
|
115
115
|
'search_workspace_users', 'get_workspace_balance',
|
|
116
116
|
'create_activity', 'update_activity',
|
|
117
117
|
'install_workflow', 'update_workflow_structure', 'test_function_field',
|
|
118
|
+
'set_workflow_cover_photo',
|
|
118
119
|
// remove_workflow / remove_insight deliberately absent: NUCLEAR group is
|
|
119
120
|
// filtered out of bot tool definitions anyway — listing them was dead weight
|
|
120
121
|
'list_my_discussions', 'fetch_discussion_messages',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-profiles.js","sourceRoot":"","sources":["../../src/mcp/tool-profiles.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;
|
|
1
|
+
{"version":3,"file":"tool-profiles.js","sourceRoot":"","sources":["../../src/mcp/tool-profiles.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-marketplace.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/app-marketplace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAa,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"app-marketplace.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/app-marketplace.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,IAAI,EAAa,MAAM,kBAAkB,CAAC;AAuUnD,eAAO,MAAM,qBAAqB,EAAE,IAanC,CAAC;AAqFF,eAAO,MAAM,sBAAsB,EAAE,IA8IpC,CAAC;AAsKF,eAAO,MAAM,sBAAsB,EAAE,IA0KpC,CAAC;AAYF,eAAO,MAAM,uBAAuB,EAAE,IA+DrC,CAAC;AAWF,eAAO,MAAM,4BAA4B,EAAE,IAuD1C,CAAC;AAWF,eAAO,MAAM,4BAA4B,EAAE,IAqD1C,CAAC;AAiCF,eAAO,MAAM,yBAAyB,EAAE,IA+DvC,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,mBAAmB,2CAQ/B,CAAC"}
|
|
@@ -27,10 +27,10 @@ function textResponse(text) {
|
|
|
27
27
|
}
|
|
28
28
|
async function fetchProductDetail(productId, context) {
|
|
29
29
|
try {
|
|
30
|
-
logger.debug('Calling v3.
|
|
31
|
-
const result = await context.hailer.request('v3.
|
|
30
|
+
logger.debug('Calling v3.product.get', { productId });
|
|
31
|
+
const result = await context.hailer.request('v3.product.get', [productId]);
|
|
32
32
|
if (result) {
|
|
33
|
-
return { product: result, source: 'v3' };
|
|
33
|
+
return { product: result, source: 'v3', targetId: result.targetId };
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
catch (v3Error) {
|
|
@@ -43,13 +43,13 @@ async function fetchProductDetail(productId, context) {
|
|
|
43
43
|
const legacyResult = await context.hailer.request('v2.network.product.get', [productId]);
|
|
44
44
|
return { product: legacyResult?.product || legacyResult, source: 'v2' };
|
|
45
45
|
}
|
|
46
|
-
async function fetchProductManifest(
|
|
46
|
+
async function fetchProductManifest(manifestId, source, context) {
|
|
47
47
|
if (source === 'v3') {
|
|
48
|
-
logger.debug('Calling v3.app.product.getManifest', {
|
|
49
|
-
return context.hailer.request('v3.app.product.getManifest', [
|
|
48
|
+
logger.debug('Calling v3.app.product.getManifest', { targetId: manifestId });
|
|
49
|
+
return context.hailer.request('v3.app.product.getManifest', [manifestId]);
|
|
50
50
|
}
|
|
51
|
-
logger.debug('Calling v2.network.product.getManifest', { productId });
|
|
52
|
-
return context.hailer.request('v2.network.product.getManifest', [
|
|
51
|
+
logger.debug('Calling v2.network.product.getManifest', { productId: manifestId });
|
|
52
|
+
return context.hailer.request('v2.network.product.getManifest', [manifestId]);
|
|
53
53
|
}
|
|
54
54
|
function resolveProductType(source, product) {
|
|
55
55
|
if (source === 'v2') {
|
|
@@ -104,19 +104,21 @@ async function executeListProducts(args, context) {
|
|
|
104
104
|
if (!workspaceId) {
|
|
105
105
|
return (0, tool_helpers_1.missingWorkspaceCacheResponse)();
|
|
106
106
|
}
|
|
107
|
-
|
|
108
|
-
//
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
]);
|
|
107
|
+
// The public marketplace spans ALL workspaces — filtering by cid would only
|
|
108
|
+
// return THIS workspace's own public listings (the bug that made the public
|
|
109
|
+
// marketplace look empty). Scope by cid only for the private/workspace view.
|
|
110
|
+
const filter = showPublic ? { public: true } : { cid: workspaceId, public: false };
|
|
111
|
+
logger.debug('Calling v3.product.list', { filter });
|
|
112
|
+
const result = await context.hailer.request('v3.product.list', [filter, {}]);
|
|
113
113
|
logger.debug('Product list response', {
|
|
114
114
|
result: JSON.stringify(result)
|
|
115
115
|
});
|
|
116
116
|
const listingType = showPublic ? 'Public Marketplace' : 'Private/Workspace';
|
|
117
117
|
let responseText = `✅ **${listingType} Products**\n\n`;
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
if (!showPublic) {
|
|
119
|
+
responseText += `**Workspace:** ${workspaceId}\n`;
|
|
120
|
+
}
|
|
121
|
+
responseText += `**Filter:** ${showPublic ? 'Public marketplace (all workspaces)' : 'Private/workspace'}\n\n`;
|
|
120
122
|
// Handle response: {products: [], totalCount: 0}
|
|
121
123
|
const products = result?.products || [];
|
|
122
124
|
if (products.length === 0) {
|
|
@@ -164,9 +166,9 @@ async function executeListProducts(args, context) {
|
|
|
164
166
|
`**Common Issues:**\n- API endpoint not available\n- Permission issues`);
|
|
165
167
|
}
|
|
166
168
|
}
|
|
167
|
-
async function buildManifestSection(
|
|
169
|
+
async function buildManifestSection(manifestId, source, context) {
|
|
168
170
|
try {
|
|
169
|
-
const manifest = await fetchProductManifest(
|
|
171
|
+
const manifest = await fetchProductManifest(manifestId, source, context);
|
|
170
172
|
logger.debug('Product manifest response', { manifest: JSON.stringify(manifest) });
|
|
171
173
|
if (!manifest) {
|
|
172
174
|
return '';
|
|
@@ -242,8 +244,10 @@ async function executeProductDetail(args, context) {
|
|
|
242
244
|
if (detail.source === 'v2') {
|
|
243
245
|
responseText += `**Source:** Legacy template (v2)\n`;
|
|
244
246
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
+
// v3 manifest is keyed by the appProductDb targetId; v2 by the productId.
|
|
248
|
+
const manifestId = detail.source === 'v3' ? detail.targetId : productId;
|
|
249
|
+
if (args.includeManifest && manifestId) {
|
|
250
|
+
responseText += await buildManifestSection(manifestId, detail.source, context);
|
|
247
251
|
}
|
|
248
252
|
if (detail.source === 'v2') {
|
|
249
253
|
responseText += buildInstalledSection(await checkTemplateInstalled(productId, context));
|
|
@@ -310,21 +314,24 @@ async function persistInstallAdminCredentials(productId, workspaceId, context) {
|
|
|
310
314
|
});
|
|
311
315
|
}
|
|
312
316
|
}
|
|
313
|
-
async function findExistingInstall(productId, workspaceId, context) {
|
|
314
|
-
|
|
317
|
+
async function findExistingInstall(productId, workspaceId, productType, context) {
|
|
318
|
+
// Apps live in appProductDb (v3 check); templates in workspaceProductDb (v2 check).
|
|
319
|
+
// Both take [productId, workspaceId] and return a bare boolean. Using the app
|
|
320
|
+
// check on a template 127s ("Version not found") — so pick by type.
|
|
321
|
+
const method = productType === 'template'
|
|
322
|
+
? 'v2.network.product.isProductInstalled'
|
|
323
|
+
: 'v3.app.product.isProductInstalled';
|
|
324
|
+
logger.debug('Checking if product is already installed', { productId, workspaceId, productType, method });
|
|
315
325
|
try {
|
|
316
|
-
const
|
|
317
|
-
|
|
318
|
-
workspaceId
|
|
319
|
-
]);
|
|
320
|
-
return isInstalledResult || null;
|
|
326
|
+
const isInstalled = await context.hailer.request(method, [productId, workspaceId]);
|
|
327
|
+
return isInstalled === true;
|
|
321
328
|
}
|
|
322
329
|
catch (checkError) {
|
|
323
330
|
// Ignore check errors and proceed with installation
|
|
324
331
|
logger.debug('Could not check installation status, proceeding', {
|
|
325
|
-
error:
|
|
332
|
+
error: (0, tool_helpers_1.extractErrorMessage)(checkError)
|
|
326
333
|
});
|
|
327
|
-
return
|
|
334
|
+
return false;
|
|
328
335
|
}
|
|
329
336
|
}
|
|
330
337
|
async function installTemplateProduct(productId, workspaceId, context) {
|
|
@@ -353,15 +360,16 @@ exports.installMarketplaceTool = {
|
|
|
353
360
|
productId: zod_1.z
|
|
354
361
|
.string()
|
|
355
362
|
.min(1)
|
|
356
|
-
.describe('Marketplace product ID to install'),
|
|
363
|
+
.describe('Marketplace product ID (24-char hex) or product name to install. Names are resolved via search automatically.'),
|
|
357
364
|
workspaceId: zod_1.z
|
|
358
365
|
.string()
|
|
359
366
|
.optional()
|
|
360
367
|
.describe('Target workspace ID (defaults to current)'),
|
|
361
368
|
}),
|
|
362
369
|
async execute(args, context) {
|
|
370
|
+
let resolvedProductId = args.productId;
|
|
363
371
|
logger.debug('Installing marketplace product', {
|
|
364
|
-
productId:
|
|
372
|
+
productId: resolvedProductId,
|
|
365
373
|
apiKey: context.apiKey.substring(0, 8) + '...'
|
|
366
374
|
});
|
|
367
375
|
try {
|
|
@@ -369,17 +377,41 @@ exports.installMarketplaceTool = {
|
|
|
369
377
|
if (!workspaceId) {
|
|
370
378
|
return (0, tool_helpers_1.missingWorkspaceCacheResponse)();
|
|
371
379
|
}
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
380
|
+
// If productId doesn't look like a 24-char hex ObjectId, treat it
|
|
381
|
+
// as a product name and search via v3.product.list.
|
|
382
|
+
if (!/^[0-9a-f]{24}$/i.test(resolvedProductId)) {
|
|
383
|
+
logger.debug('productId is not an ObjectId — searching by name', { name: resolvedProductId });
|
|
384
|
+
try {
|
|
385
|
+
const searchResult = await context.hailer.request('v3.product.list', [
|
|
386
|
+
{ public: true },
|
|
387
|
+
{ search: resolvedProductId, limit: 10 },
|
|
388
|
+
]);
|
|
389
|
+
const products = searchResult?.products ?? [];
|
|
390
|
+
const exact = products.find((p) => (p.name || '').toLowerCase() === resolvedProductId.toLowerCase());
|
|
391
|
+
const match = exact || products[0];
|
|
392
|
+
if (match?._id) {
|
|
393
|
+
logger.debug('Resolved product name to ID', {
|
|
394
|
+
name: resolvedProductId, resolvedId: match._id, matchedName: match.name,
|
|
395
|
+
});
|
|
396
|
+
resolvedProductId = match._id;
|
|
397
|
+
}
|
|
398
|
+
else {
|
|
399
|
+
return textResponse(`❌ **Product Not Found**\n\nNo marketplace product found matching "${args.productId}".\n\n` +
|
|
400
|
+
`**Tips:**\n- Check the exact product name\n- Use \`browse_marketplace({ publicOnly: true })\` to see available products`);
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
catch (searchError) {
|
|
404
|
+
logger.debug('Product name search failed', {
|
|
405
|
+
error: searchError instanceof Error ? searchError.message : String(searchError),
|
|
406
|
+
});
|
|
407
|
+
}
|
|
377
408
|
}
|
|
378
|
-
// Detect product type
|
|
409
|
+
// Detect product type FIRST — it selects both the install route and the
|
|
410
|
+
// matching "already installed" check (app vs template use different RPCs).
|
|
379
411
|
let productName = 'Unknown';
|
|
380
412
|
let productType = 'app';
|
|
381
413
|
try {
|
|
382
|
-
const detail = await fetchProductDetail(
|
|
414
|
+
const detail = await fetchProductDetail(resolvedProductId, context);
|
|
383
415
|
productName = detail.product?.name || detail.product?.title || 'Unknown';
|
|
384
416
|
productType = resolveProductType(detail.source, detail.product);
|
|
385
417
|
}
|
|
@@ -388,13 +420,18 @@ exports.installMarketplaceTool = {
|
|
|
388
420
|
error: productError instanceof Error ? productError.message : String(productError)
|
|
389
421
|
});
|
|
390
422
|
}
|
|
423
|
+
if (await findExistingInstall(resolvedProductId, workspaceId, productType, context)) {
|
|
424
|
+
return textResponse(`ℹ️ **Product Already Installed**\n\nThis product is already installed in your workspace.\n\n` +
|
|
425
|
+
`**Tips:**\n- Use \`list_apps()\` to see installed apps\n` +
|
|
426
|
+
`- Use \`browse_marketplace({ productId: "${resolvedProductId}" })\` to view product details`);
|
|
427
|
+
}
|
|
391
428
|
const installResult = productType === 'template'
|
|
392
|
-
? await installTemplateProduct(
|
|
393
|
-
: await installAppProduct(
|
|
429
|
+
? await installTemplateProduct(resolvedProductId, workspaceId, context)
|
|
430
|
+
: await installAppProduct(resolvedProductId, workspaceId, context);
|
|
394
431
|
const installedAppId = installResult?.appId || installResult?.details?.appId || installResult?._id;
|
|
395
432
|
let responseText = `✅ **${productType === 'template' ? 'Template' : 'App'} Installed Successfully**\n\n`;
|
|
396
433
|
responseText += `**Product:** ${productName}\n`;
|
|
397
|
-
responseText += `**Product ID:** \`${
|
|
434
|
+
responseText += `**Product ID:** \`${resolvedProductId}\`\n`;
|
|
398
435
|
if (installedAppId) {
|
|
399
436
|
responseText += `**Installed App ID:** \`${installedAppId}\`\n`;
|
|
400
437
|
}
|