@amerged/ohmyhost-mcp 0.1.22 → 0.1.24

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.
Files changed (87) hide show
  1. package/README.md +5 -2
  2. package/dist/{chunk-NLBFEH6H.js → chunk-EEFUMPKG.js} +25 -24
  3. package/dist/index.js +1 -1
  4. package/dist/stdio-main.js +734 -269
  5. package/package.json +1 -1
  6. package/src/apps/mcp/package.json +47 -0
  7. package/src/apps/mcp/{local-client.ts → src/local-client.ts} +69 -12
  8. package/src/apps/mcp/{local-server.ts → src/local-server.ts} +327 -145
  9. package/src/apps/product-cli/package.json +45 -0
  10. package/src/apps/product-cli/{bin.ts → src/bin.ts} +3 -0
  11. package/src/apps/product-cli/{cli.ts → src/cli.ts} +363 -87
  12. package/src/apps/product-cli/{command.ts → src/command.ts} +58 -11
  13. package/src/apps/product-cli/{composition.ts → src/composition.ts} +98 -21
  14. package/src/apps/product-cli/{index.ts → src/index.ts} +1 -0
  15. package/src/apps/product-cli/{product-api.ts → src/product-api.ts} +65 -19
  16. package/src/apps/product-cli/{repository-init.ts → src/repository-init.ts} +79 -29
  17. package/src/apps/product-cli/{runtime-contract.ts → src/runtime-contract.ts} +16 -309
  18. package/src/apps/product-cli/{user-token-file.ts → src/user-token-file.ts} +46 -35
  19. package/src/apps/product-cli/{workspace.ts → src/workspace.ts} +6 -0
  20. package/src/packages/agent-skills/package.json +24 -0
  21. package/src/packages/agent-skills/src/generated-skill-resources.ts +165 -0
  22. package/src/packages/agent-skills/{index.ts → src/index.ts} +1 -1
  23. package/src/packages/contracts/package.json +137 -0
  24. package/src/packages/contracts/src/browser-capabilities.ts +133 -0
  25. package/src/packages/contracts/src/customer-auth-admission.ts +36 -0
  26. package/src/packages/contracts/{database-access.ts → src/database-access.ts} +10 -2
  27. package/src/packages/contracts/{framework-admission.ts → src/framework-admission.ts} +88 -13
  28. package/src/packages/contracts/src/framework-build-script.mjs +22 -0
  29. package/src/packages/contracts/src/framework-build-script.ts +1 -0
  30. package/src/packages/contracts/{index.ts → src/index.ts} +17 -16
  31. package/src/packages/contracts/src/operation-data-change-result.ts +86 -0
  32. package/src/packages/contracts/{operation-deployment-result.ts → src/operation-deployment-result.ts} +2 -2
  33. package/src/packages/contracts/{operation-failure.ts → src/operation-failure.ts} +24 -12
  34. package/src/packages/contracts/src/problem-policy.ts +498 -0
  35. package/src/packages/contracts/src/project-data-changes.ts +90 -0
  36. package/src/packages/contracts/src/secret-names.ts +27 -0
  37. package/src/packages/sdk-ts/package.json +21 -0
  38. package/src/packages/sdk-ts/{generated → src/generated}/index.ts +15 -0
  39. package/src/packages/sdk-ts/{generated → src/generated}/sdk.gen.ts +114 -5
  40. package/src/packages/sdk-ts/{generated → src/generated}/types.gen.ts +209 -10
  41. package/src/packages/workos-auth-contracts/package.json +39 -0
  42. package/src/packages/agent-skills/generated-skill-resources.ts +0 -165
  43. /package/src/apps/mcp/{index.ts → src/index.ts} +0 -0
  44. /package/src/apps/mcp/{stdio-main.ts → src/stdio-main.ts} +0 -0
  45. /package/src/apps/product-cli/{credential-store.ts → src/credential-store.ts} +0 -0
  46. /package/src/apps/product-cli/{device-token-expiry.ts → src/device-token-expiry.ts} +0 -0
  47. /package/src/apps/product-cli/{file-credential-store.ts → src/file-credential-store.ts} +0 -0
  48. /package/src/apps/product-cli/{profile-store.ts → src/profile-store.ts} +0 -0
  49. /package/src/apps/product-cli/{project-link-store.ts → src/project-link-store.ts} +0 -0
  50. /package/src/apps/product-cli/{psql-session.ts → src/psql-session.ts} +0 -0
  51. /package/src/packages/contracts/{application-root.ts → src/application-root.ts} +0 -0
  52. /package/src/packages/contracts/{billing.ts → src/billing.ts} +0 -0
  53. /package/src/packages/contracts/{credit-pricing.ts → src/credit-pricing.ts} +0 -0
  54. /package/src/packages/contracts/{database-compute.ts → src/database-compute.ts} +0 -0
  55. /package/src/packages/contracts/{database-migration-admission.ts → src/database-migration-admission.ts} +0 -0
  56. /package/src/packages/contracts/{feedback.ts → src/feedback.ts} +0 -0
  57. /package/src/packages/contracts/{framework-family.ts → src/framework-family.ts} +0 -0
  58. /package/src/packages/contracts/{functions.ts → src/functions.ts} +0 -0
  59. /package/src/packages/contracts/{platform-origins.ts → src/platform-origins.ts} +0 -0
  60. /package/src/packages/contracts/{project-context.ts → src/project-context.ts} +0 -0
  61. /package/src/packages/contracts/{project-exports.ts → src/project-exports.ts} +0 -0
  62. /package/src/packages/contracts/{user-api-keys.ts → src/user-api-keys.ts} +0 -0
  63. /package/src/packages/sdk-ts/{generated → src/generated}/client/client.gen.ts +0 -0
  64. /package/src/packages/sdk-ts/{generated → src/generated}/client/index.ts +0 -0
  65. /package/src/packages/sdk-ts/{generated → src/generated}/client/types.gen.ts +0 -0
  66. /package/src/packages/sdk-ts/{generated → src/generated}/client/utils.gen.ts +0 -0
  67. /package/src/packages/sdk-ts/{generated → src/generated}/client.gen.ts +0 -0
  68. /package/src/packages/sdk-ts/{generated → src/generated}/core/auth.gen.ts +0 -0
  69. /package/src/packages/sdk-ts/{generated → src/generated}/core/bodySerializer.gen.ts +0 -0
  70. /package/src/packages/sdk-ts/{generated → src/generated}/core/params.gen.ts +0 -0
  71. /package/src/packages/sdk-ts/{generated → src/generated}/core/pathSerializer.gen.ts +0 -0
  72. /package/src/packages/sdk-ts/{generated → src/generated}/core/queryKeySerializer.gen.ts +0 -0
  73. /package/src/packages/sdk-ts/{generated → src/generated}/core/serverSentEvents.gen.ts +0 -0
  74. /package/src/packages/sdk-ts/{generated → src/generated}/core/types.gen.ts +0 -0
  75. /package/src/packages/sdk-ts/{generated → src/generated}/core/utils.gen.ts +0 -0
  76. /package/src/packages/sdk-ts/{index.ts → src/index.ts} +0 -0
  77. /package/src/packages/sdk-ts/{managed-mail-response.ts → src/managed-mail-response.ts} +0 -0
  78. /package/src/packages/sdk-ts/{managed-mail.ts → src/managed-mail.ts} +0 -0
  79. /package/src/packages/workos-auth-contracts/{device-flow.ts → src/device-flow.ts} +0 -0
  80. /package/src/packages/workos-auth-contracts/{index.ts → src/index.ts} +0 -0
  81. /package/src/packages/workos-auth-contracts/{management-rpc.ts → src/management-rpc.ts} +0 -0
  82. /package/src/packages/workos-auth-contracts/{organizations.ts → src/organizations.ts} +0 -0
  83. /package/src/packages/workos-auth-contracts/{parsing.ts → src/parsing.ts} +0 -0
  84. /package/src/packages/workos-auth-contracts/{session-status.ts → src/session-status.ts} +0 -0
  85. /package/src/packages/workos-auth-contracts/{tokens.ts → src/tokens.ts} +0 -0
  86. /package/src/packages/workos-auth-contracts/{user-api-keys.ts → src/user-api-keys.ts} +0 -0
  87. /package/src/packages/workos-auth-contracts/{webhooks.ts → src/webhooks.ts} +0 -0
@@ -23,23 +23,28 @@ export class UserTokenFileError extends Error {
23
23
  | "token_value_unavailable",
24
24
  readonly keyId?: string,
25
25
  ) {
26
- super(
27
- {
28
- token_file_not_ignored:
29
- "Add the selected env file to .gitignore or choose a location outside the repository. No token was created or written.",
30
- token_file_unsafe:
31
- "Choose a private .env file owned by you. Symlinks, shared files and files larger than 64 KiB are not accepted.",
32
- token_file_has_token:
33
- "The selected file already contains OHMYHOST_TOKEN. Use that token or choose a new file; existing credentials were preserved.",
34
- token_file_changed:
35
- "The environment file changed during creation. It was not overwritten. List tokens to inspect the issued key before creating another.",
36
- token_value_unavailable:
37
- "This token was already issued and its full value cannot be retrieved. Use the previously saved file, or explicitly revoke the listed key before creating a replacement.",
38
- }[code] + (keyId ? ` Token ID: ${keyId}.` : ""),
39
- );
26
+ super(tokenFileAction(code, keyId));
40
27
  }
41
28
  }
42
29
 
30
+ /** What to do next; once a key was issued, the answer names it so it can be revoked. */
31
+ const tokenFileAction = (code: UserTokenFileError["code"], keyId: string | undefined): string => {
32
+ switch (code) {
33
+ case "token_file_not_ignored":
34
+ return "Add the selected env file to .gitignore or choose a location outside the repository. No token was created or written.";
35
+ case "token_file_unsafe":
36
+ return "Choose an env file whose name starts or ends with .env, for example .env.local: a regular file you own, not a symlink or hard link, at most 64 KiB.";
37
+ case "token_file_has_token":
38
+ return "The selected file already contains OHMYHOST_TOKEN. Use that token or choose a new file; existing credentials were preserved.";
39
+ case "token_file_changed":
40
+ return keyId === undefined
41
+ ? "The env file changed while it was being read; no key was issued. Run the same command again."
42
+ : `The env file changed while the token was being saved, so its value may not be in the file; key ${keyId} was issued. Revoke it with 'ohmyhost token revoke --organization ULID --key ${keyId} --yes --json' (MCP token_revoke), then create a new one with a new idempotency key.`;
43
+ case "token_value_unavailable":
44
+ return `A key was already issued for this idempotency key, and its value is shown only once. Use the file it was saved to, or revoke key ${String(keyId)} (ohmyhost token revoke, MCP token_revoke) and create a replacement with a new idempotency key.`;
45
+ }
46
+ };
47
+
43
48
  /** Prepare before the API call; append only OHMYHOST_TOKEN and never return its value to a chat. */
44
49
  export async function prepareUserTokenFile(output: string) {
45
50
  const path = resolve(output);
@@ -77,28 +82,34 @@ export async function prepareUserTokenFile(output: string) {
77
82
  const result = parseUserApiKeyCreation(value);
78
83
  if (result.value === null)
79
84
  throw new UserTokenFileError("token_value_unavailable", result.key.id);
80
- const current = await lstat(path);
81
- if (
82
- !current.isFile() ||
83
- current.isSymbolicLink() ||
84
- current.nlink !== 1 ||
85
- current.ino !== identity.ino ||
86
- current.dev !== identity.dev ||
87
- (await tokenFileText(handle)) !== initial
88
- )
89
- throw new UserTokenFileError("token_file_changed");
90
- await handle.appendFile(`\nOHMYHOST_TOKEN=${result.value}\n`, "utf8");
91
- await handle.sync();
92
- if (parseEnv(await tokenFileText(handle))["OHMYHOST_TOKEN"] !== result.value)
93
- throw new UserTokenFileError("token_file_changed");
94
- const saved = await lstat(path);
95
- if (
96
- !saved.isFile() ||
97
- saved.isSymbolicLink() ||
98
- saved.ino !== identity.ino ||
99
- saved.dev !== identity.dev
100
- )
85
+ try {
86
+ const current = await lstat(path);
87
+ if (
88
+ !current.isFile() ||
89
+ current.isSymbolicLink() ||
90
+ current.nlink !== 1 ||
91
+ current.ino !== identity.ino ||
92
+ current.dev !== identity.dev ||
93
+ (await tokenFileText(handle)) !== initial
94
+ )
95
+ throw new UserTokenFileError("token_file_changed");
96
+ await handle.appendFile(`\nOHMYHOST_TOKEN=${result.value}\n`, "utf8");
97
+ await handle.sync();
98
+ if (parseEnv(await tokenFileText(handle))["OHMYHOST_TOKEN"] !== result.value)
99
+ throw new UserTokenFileError("token_file_changed");
100
+ const saved = await lstat(path);
101
+ if (
102
+ !saved.isFile() ||
103
+ saved.isSymbolicLink() ||
104
+ saved.ino !== identity.ino ||
105
+ saved.dev !== identity.dev
106
+ )
107
+ throw new UserTokenFileError("token_file_changed");
108
+ } catch {
109
+ // The file was checked before the key was issued, so any refusal now means it changed,
110
+ // and the answer names the issued key so it can be revoked.
101
111
  throw new UserTokenFileError("token_file_changed", result.key.id);
112
+ }
102
113
  return { request_id: result.request_id, key: result.key, token_file: path };
103
114
  },
104
115
  close: () => handle.close(),
@@ -119,8 +119,14 @@ export const selectWorkspace = async (
119
119
  session.profile.userId,
120
120
  organization.id,
121
121
  );
122
+ // That user's existing login in the organization keeps its name; binding under this login's alias
123
+ // would silently rename it for every agent that selects it by name.
124
+ const existing = (await session.profiles.list()).find(
125
+ (saved) => saved.userId === session.profile.userId && saved.organizationId === organization.id,
126
+ );
122
127
  const bound: LocalProfile = {
123
128
  ...session.profile,
129
+ name: existing?.name ?? session.profile.name,
124
130
  organizationId: organization.id,
125
131
  organizationName: organization.name,
126
132
  };
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@ohmyhost/agent-skills",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "source": "./src/index.ts",
9
+ "types": "./dist/index.d.ts",
10
+ "import": "./dist/index.js"
11
+ }
12
+ },
13
+ "scripts": {
14
+ "build": "node scripts/generate-skill-resources.mjs && tsc --project tsconfig.build.json",
15
+ "generate:check": "node scripts/generate-skill-resources.mjs --check",
16
+ "test": "node scripts/generate-skill-resources.mjs --check && vitest run --root ../.. packages/agent-skills/test",
17
+ "typecheck": "tsc --project tsconfig.json --noEmit"
18
+ },
19
+ "devDependencies": {
20
+ "@ohmyhost/customer-runtime": "workspace:*",
21
+ "prettier": "3.6.2"
22
+ },
23
+ "license": "Apache-2.0"
24
+ }