@kodycodes/cli 1.17.0 → 1.18.0
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/README.md +18 -4
- package/dist/auth.d.ts +30 -4
- package/dist/auth.js +94 -13
- package/dist/auth.js.map +1 -1
- package/dist/capability-proxy.d.ts +7 -0
- package/dist/capability-proxy.js +8 -2
- package/dist/capability-proxy.js.map +1 -1
- package/dist/cli.d.ts +3 -1
- package/dist/cli.js +121 -32
- package/dist/cli.js.map +1 -1
- package/dist/discover-org.d.ts +10 -0
- package/dist/discover-org.js +62 -0
- package/dist/discover-org.js.map +1 -0
- package/dist/help.d.ts +13 -1
- package/dist/help.js +75 -12
- package/dist/help.js.map +1 -1
- package/dist/local-execute-auth.d.ts +1 -0
- package/dist/local-execute-auth.js +7 -1
- package/dist/local-execute-auth.js.map +1 -1
- package/dist/local-execute.d.ts +2 -0
- package/dist/local-execute.js +6 -1
- package/dist/local-execute.js.map +1 -1
- package/dist/local-package-graph.js +2 -0
- package/dist/local-package-graph.js.map +1 -1
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.js +3 -0
- package/dist/mcp.js.map +1 -1
- package/dist/oauth-provider.d.ts +1 -2
- package/dist/oauth-provider.js +2 -8
- package/dist/oauth-provider.js.map +1 -1
- package/dist/open-api-client.d.ts +5 -0
- package/dist/open-api-client.js +4 -0
- package/dist/open-api-client.js.map +1 -1
- package/dist/org-resolve.d.ts +9 -0
- package/dist/org-resolve.js +16 -0
- package/dist/org-resolve.js.map +1 -0
- package/dist/org-slug.d.ts +4 -0
- package/dist/org-slug.js +11 -0
- package/dist/org-slug.js.map +1 -0
- package/dist/org.d.ts +22 -0
- package/dist/org.js +100 -0
- package/dist/org.js.map +1 -0
- package/dist/remote-execute.d.ts +2 -0
- package/dist/remote-execute.js +6 -1
- package/dist/remote-execute.js.map +1 -1
- package/dist/store.d.ts +93 -3
- package/dist/store.js +454 -23
- package/dist/store.js.map +1 -1
- package/package.json +1 -1
package/dist/org.d.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type ListedOrg, type MultiOrgCredentialStore, type SecretBackend, type StoreResolution } from './store.js';
|
|
2
|
+
export { orgEnvVar, orgSlugFromFlag } from './org-slug.js';
|
|
3
|
+
export { resolveOrgSlug } from './org-resolve.js';
|
|
4
|
+
/** Offline help / listing block. No network. */
|
|
5
|
+
export declare function formatStoredOrgsHelpBlock(orgs: Array<ListedOrg>, options?: {
|
|
6
|
+
indent?: string;
|
|
7
|
+
}): string;
|
|
8
|
+
export declare function readStoredOrgsForHelp(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): Array<ListedOrg>;
|
|
9
|
+
export declare function formatOrgListHuman(orgs: Array<ListedOrg>): string;
|
|
10
|
+
export declare function formatOrgListJson(orgs: Array<ListedOrg>): string;
|
|
11
|
+
/**
|
|
12
|
+
* Interactive org picker for humans. Requires a TTY. Agents should pass a slug
|
|
13
|
+
* to `kody org use <slug>` instead.
|
|
14
|
+
*/
|
|
15
|
+
export declare function chooseOrgInteractively(input: {
|
|
16
|
+
orgs: Array<ListedOrg>;
|
|
17
|
+
stdin?: NodeJS.ReadableStream;
|
|
18
|
+
stdout?: NodeJS.WritableStream;
|
|
19
|
+
isTTY?: boolean;
|
|
20
|
+
}): Promise<string>;
|
|
21
|
+
export declare function useOrg(slug: string, mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): MultiOrgCredentialStore;
|
|
22
|
+
export declare function promoteLegacyIfNeeded(mcpUrl: string, orgSlug: string, backend?: SecretBackend, resolution?: StoreResolution): MultiOrgCredentialStore | null;
|
package/dist/org.js
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createInterface } from 'node:readline';
|
|
2
|
+
import { defaultMcpUrl } from './defaults.js';
|
|
3
|
+
import { orgSlugFromFlag } from './org-slug.js';
|
|
4
|
+
import { listStoredOrgs, loadCredentialStore, promotePendingOrg, setActiveOrg, } from './store.js';
|
|
5
|
+
export { orgEnvVar, orgSlugFromFlag } from './org-slug.js';
|
|
6
|
+
export { resolveOrgSlug } from './org-resolve.js';
|
|
7
|
+
/** Offline help / listing block. No network. */
|
|
8
|
+
export function formatStoredOrgsHelpBlock(orgs, options = {}) {
|
|
9
|
+
const indent = options.indent ?? ' ';
|
|
10
|
+
if (orgs.length === 0) {
|
|
11
|
+
return `${indent}Not logged in. Run \`kody login\`.\n`;
|
|
12
|
+
}
|
|
13
|
+
const lines = [`${indent}Logged-in orgs:`];
|
|
14
|
+
for (const org of orgs) {
|
|
15
|
+
const mark = org.active ? '*' : ' ';
|
|
16
|
+
const pending = org.pending ? ' (slug pending — run any authenticated command)' : '';
|
|
17
|
+
lines.push(`${indent} ${mark} ${org.slug}${org.active ? ' (active)' : ''}${pending}`);
|
|
18
|
+
}
|
|
19
|
+
return `${lines.join('\n')}\n`;
|
|
20
|
+
}
|
|
21
|
+
export function readStoredOrgsForHelp(mcpUrl = defaultMcpUrl, backend, resolution) {
|
|
22
|
+
try {
|
|
23
|
+
return listStoredOrgs(mcpUrl, backend, resolution);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return [];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export function formatOrgListHuman(orgs) {
|
|
30
|
+
if (orgs.length === 0) {
|
|
31
|
+
return 'Not logged in. Run `kody login`.\n';
|
|
32
|
+
}
|
|
33
|
+
const lines = [];
|
|
34
|
+
for (const org of orgs) {
|
|
35
|
+
const mark = org.active ? '*' : ' ';
|
|
36
|
+
const pending = org.pending ? ' (slug pending)' : '';
|
|
37
|
+
lines.push(`${mark} ${org.slug}${org.active ? ' (active)' : ''}${pending}`);
|
|
38
|
+
}
|
|
39
|
+
return `${lines.join('\n')}\n`;
|
|
40
|
+
}
|
|
41
|
+
export function formatOrgListJson(orgs) {
|
|
42
|
+
return `${JSON.stringify({
|
|
43
|
+
orgs: orgs.map((org) => ({
|
|
44
|
+
slug: org.pending ? null : org.slug,
|
|
45
|
+
active: org.active,
|
|
46
|
+
...(org.pending ? { pending: true } : {}),
|
|
47
|
+
})),
|
|
48
|
+
}, null, 2)}\n`;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Interactive org picker for humans. Requires a TTY. Agents should pass a slug
|
|
52
|
+
* to `kody org use <slug>` instead.
|
|
53
|
+
*/
|
|
54
|
+
export async function chooseOrgInteractively(input) {
|
|
55
|
+
const isTTY = input.isTTY ?? Boolean(process.stdin.isTTY);
|
|
56
|
+
if (!isTTY) {
|
|
57
|
+
throw new Error('`kody org use` without a slug requires a TTY. Pass an org slug: `kody org use <slug>`.');
|
|
58
|
+
}
|
|
59
|
+
const usable = input.orgs.filter((org) => !org.pending);
|
|
60
|
+
if (usable.length === 0) {
|
|
61
|
+
throw new Error('No named org logins yet. Run `kody login`, or an authenticated command to finish migrating a legacy session.');
|
|
62
|
+
}
|
|
63
|
+
const stdout = input.stdout ?? process.stdout;
|
|
64
|
+
stdout.write('Select an organization:\n');
|
|
65
|
+
usable.forEach((org, index) => {
|
|
66
|
+
const active = org.active ? ' (active)' : '';
|
|
67
|
+
stdout.write(` ${index + 1}) ${org.slug}${active}\n`);
|
|
68
|
+
});
|
|
69
|
+
const rl = createInterface({
|
|
70
|
+
input: input.stdin ?? process.stdin,
|
|
71
|
+
output: stdout,
|
|
72
|
+
terminal: true,
|
|
73
|
+
});
|
|
74
|
+
try {
|
|
75
|
+
const answer = await new Promise((resolve) => {
|
|
76
|
+
rl.question('Number (or slug): ', (line) => resolve(line.trim()));
|
|
77
|
+
});
|
|
78
|
+
if (!answer) {
|
|
79
|
+
throw new Error('No organization selected.');
|
|
80
|
+
}
|
|
81
|
+
const asNumber = Number(answer);
|
|
82
|
+
if (Number.isInteger(asNumber) && asNumber >= 1 && asNumber <= usable.length) {
|
|
83
|
+
return usable[asNumber - 1].slug;
|
|
84
|
+
}
|
|
85
|
+
return orgSlugFromFlag(answer);
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
rl.close();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
export function useOrg(slug, mcpUrl = defaultMcpUrl, backend, resolution) {
|
|
92
|
+
return setActiveOrg(mcpUrl, orgSlugFromFlag(slug), backend, resolution);
|
|
93
|
+
}
|
|
94
|
+
export function promoteLegacyIfNeeded(mcpUrl, orgSlug, backend, resolution) {
|
|
95
|
+
const snapshot = loadCredentialStore(mcpUrl, backend, resolution);
|
|
96
|
+
if (!snapshot?.pending)
|
|
97
|
+
return snapshot;
|
|
98
|
+
return promotePendingOrg(mcpUrl, orgSlug, backend, resolution);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=org.js.map
|
package/dist/org.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org.js","sourceRoot":"","sources":["../src/org.ts"],"names":[],"mappings":"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"}
|
package/dist/remote-execute.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export type RemoteExecuteInput = {
|
|
|
13
13
|
token: string;
|
|
14
14
|
apiUrl: string;
|
|
15
15
|
fetchFn?: typeof fetch;
|
|
16
|
+
/** User-owned token org selection (`?org=`). */
|
|
17
|
+
org?: string;
|
|
16
18
|
};
|
|
17
19
|
export declare const credentialFlagRequiresLocalOrMcpMessage = "--credential picks a credential for this run, but token-auth cloud execute goes through CapabilityProxy \u2192 kody.execute, which does not take a call map (package code must not pick by name). Use `execute --local --credential \u2026`, or omit --token / KODY_API_TOKEN and use a `kody login` MCP session so execute receives credentials.";
|
|
18
20
|
/**
|
package/dist/remote-execute.js
CHANGED
|
@@ -15,7 +15,12 @@ export async function runRemoteExecuteWithToken(input) {
|
|
|
15
15
|
throw new Error(credentialFlagRequiresLocalOrMcpMessage);
|
|
16
16
|
}
|
|
17
17
|
const code = resolveRemoteExecuteCode(input);
|
|
18
|
-
const client = {
|
|
18
|
+
const client = {
|
|
19
|
+
apiUrl: input.apiUrl,
|
|
20
|
+
token: input.token,
|
|
21
|
+
fetchFn: input.fetchFn,
|
|
22
|
+
...(input.org ? { org: input.org } : {}),
|
|
23
|
+
};
|
|
19
24
|
await openCapabilityProxySession(client);
|
|
20
25
|
const args = { code };
|
|
21
26
|
if (input.params !== undefined)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-execute.js","sourceRoot":"","sources":["../src/remote-execute.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,qBAAqB,EACrB,mBAAmB,EACnB,0BAA0B,GAC1B,MAAM,uBAAuB,CAAA;AAG9B,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAA;
|
|
1
|
+
{"version":3,"file":"remote-execute.js","sourceRoot":"","sources":["../src/remote-execute.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,6 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-org OAuth credentials used by login / MCP / local-execute Bearer.
|
|
3
|
+
* `org` is the bound organization slug (ADR 0064). Legacy single-org payloads
|
|
4
|
+
* may omit it until silent migration discovers the slug via metaGetCurrentUser.
|
|
5
|
+
*/
|
|
1
6
|
export type StoredCredentials = {
|
|
2
7
|
version: 1;
|
|
3
8
|
mcpUrl: string;
|
|
9
|
+
/** Organization slug this grant is bound to. */
|
|
10
|
+
org?: string;
|
|
11
|
+
resource: string;
|
|
12
|
+
authorizationServerUrl: string;
|
|
13
|
+
clientId: string;
|
|
14
|
+
clientSecret?: string;
|
|
15
|
+
accessToken: string;
|
|
16
|
+
refreshToken?: string;
|
|
17
|
+
tokenType: string;
|
|
18
|
+
expiresAt?: number;
|
|
19
|
+
scope?: string;
|
|
20
|
+
};
|
|
21
|
+
/** On-disk / keychain envelope for one or more org logins (same MCP origin). */
|
|
22
|
+
export type MultiOrgCredentialStore = {
|
|
23
|
+
version: 2;
|
|
24
|
+
mcpUrl: string;
|
|
25
|
+
/** Active org slug; null while a legacy v1 session awaits slug discovery. */
|
|
26
|
+
activeOrg: string | null;
|
|
27
|
+
/** Org slug → credentials (without version/mcpUrl envelope fields). */
|
|
28
|
+
orgs: Record<string, OrgCredentialRecord>;
|
|
29
|
+
/**
|
|
30
|
+
* Legacy single-org tokens waiting for an org slug. At most one. Cleared
|
|
31
|
+
* once metaGetCurrentUser (or login --org) promotes them into `orgs`.
|
|
32
|
+
*/
|
|
33
|
+
pending?: OrgCredentialRecord;
|
|
34
|
+
};
|
|
35
|
+
export type OrgCredentialRecord = {
|
|
36
|
+
org?: string;
|
|
4
37
|
resource: string;
|
|
5
38
|
authorizationServerUrl: string;
|
|
6
39
|
clientId: string;
|
|
@@ -28,17 +61,74 @@ export type StoreResolution = {
|
|
|
28
61
|
createKeyring?: (mcpUrl: string) => SecretBackend;
|
|
29
62
|
fileStorePath?: (mcpUrl: string) => string;
|
|
30
63
|
};
|
|
64
|
+
export type LoadCredentialsOptions = {
|
|
65
|
+
/** Prefer this org slug (already normalized). */
|
|
66
|
+
org?: string;
|
|
67
|
+
backend?: SecretBackend;
|
|
68
|
+
resolution?: StoreResolution;
|
|
69
|
+
};
|
|
31
70
|
export declare function accountForMcpUrl(mcpUrl: string): string;
|
|
32
71
|
export declare function fileStorePath(mcpUrl: string, home?: string): string;
|
|
33
72
|
export declare function createFileBackend(path: string): SecretBackend;
|
|
34
73
|
export declare function createKeyringBackend(mcpUrl: string): SecretBackend;
|
|
35
74
|
export declare function resolveBackend(mcpUrl: string, preferred?: SecretBackend, resolution?: StoreResolution): SecretBackend;
|
|
75
|
+
/** Parse v1 single-org or v2 multi-org JSON from the credential backend. */
|
|
76
|
+
export declare function parseCredentialStore(raw: string, fallbackMcpUrl?: string): MultiOrgCredentialStore;
|
|
77
|
+
/**
|
|
78
|
+
* Silent offline migration: wrap a v1 single-org payload as a multi-org store.
|
|
79
|
+
* When `org` is already known, it becomes the active org; otherwise tokens sit
|
|
80
|
+
* in `pending` until metaGetCurrentUser (or login) supplies the slug.
|
|
81
|
+
*/
|
|
82
|
+
export declare function migrateV1ToMultiOrg(credentials: StoredCredentials): MultiOrgCredentialStore;
|
|
83
|
+
/** @deprecated Prefer parseCredentialStore; kept for tests and callers that expect v1. */
|
|
36
84
|
export declare function parseCredentials(raw: string): StoredCredentials;
|
|
37
|
-
export declare function
|
|
38
|
-
export declare function
|
|
85
|
+
export declare function loadCredentialStore(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): MultiOrgCredentialStore | null;
|
|
86
|
+
export declare function saveCredentialStore(snapshot: MultiOrgCredentialStore, backend?: SecretBackend, resolution?: StoreResolution): {
|
|
87
|
+
backend: SecretBackend;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Resolve one org's credentials. Precedence for which org: explicit `org`
|
|
91
|
+
* option, else the store's active org, else the sole pending legacy session.
|
|
92
|
+
*/
|
|
93
|
+
export declare function loadCredentials(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution, options?: {
|
|
94
|
+
org?: string;
|
|
95
|
+
}): StoredCredentials | null;
|
|
96
|
+
/** Legacy pending session only (not the active named org). */
|
|
97
|
+
export declare function loadPendingCredentials(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): StoredCredentials | null;
|
|
98
|
+
export declare function pickCredentialsFromStore(snapshot: MultiOrgCredentialStore, org?: string): StoredCredentials | null;
|
|
99
|
+
/**
|
|
100
|
+
* Upsert one org's credentials. Replaces that org's prior tokens when the slug
|
|
101
|
+
* already exists; leaves other orgs untouched.
|
|
102
|
+
*
|
|
103
|
+
* `activate` (default true) makes the saved org active — used by `kody login`.
|
|
104
|
+
* Pass `activate: false` for token refresh so a one-shot `--org` / `KODY_ORG`
|
|
105
|
+
* refresh does not steal the active org from `kody org use`.
|
|
106
|
+
*/
|
|
107
|
+
export declare function saveCredentials(credentials: StoredCredentials, backend?: SecretBackend, resolution?: StoreResolution, options?: {
|
|
108
|
+
activate?: boolean;
|
|
109
|
+
}): {
|
|
39
110
|
backend: SecretBackend;
|
|
40
111
|
};
|
|
41
|
-
|
|
112
|
+
/**
|
|
113
|
+
* Promote pending legacy tokens into `orgs[slug]`.
|
|
114
|
+
* Never overwrites an existing named login (a fresh `kody login` wins), and
|
|
115
|
+
* never steals `activeOrg` away from an already-active named org.
|
|
116
|
+
*/
|
|
117
|
+
export declare function promotePendingOrg(mcpUrl: string, org: string, backend?: SecretBackend, resolution?: StoreResolution): MultiOrgCredentialStore | null;
|
|
118
|
+
export declare function setActiveOrg(mcpUrl: string, org: string, backend?: SecretBackend, resolution?: StoreResolution): MultiOrgCredentialStore;
|
|
119
|
+
export declare function listOrgSlugs(snapshot: MultiOrgCredentialStore): Array<string>;
|
|
120
|
+
export type ListedOrg = {
|
|
121
|
+
slug: string;
|
|
122
|
+
active: boolean;
|
|
123
|
+
/** True when this row is the unresolved legacy session (no slug yet). */
|
|
124
|
+
pending?: boolean;
|
|
125
|
+
};
|
|
126
|
+
/** Local-only listing for help / `org list` (no network). */
|
|
127
|
+
export declare function listStoredOrgs(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution): Array<ListedOrg>;
|
|
128
|
+
export declare function deleteCredentials(mcpUrl?: string, backend?: SecretBackend, resolution?: StoreResolution, options?: {
|
|
129
|
+
org?: string;
|
|
130
|
+
}): {
|
|
42
131
|
deleted: boolean;
|
|
43
132
|
backend: SecretBackend;
|
|
133
|
+
remaining: number;
|
|
44
134
|
};
|