@tyvm/knowhow 0.0.148 → 0.0.149
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/package.json +1 -1
- package/src/agents/base/base.ts +18 -9
- package/src/agents/tools/startAgentTask.ts +5 -2
- package/src/auth/keyAuth.ts +10 -4
- package/src/auth/registerIdentity.ts +67 -0
- package/src/chat/modules/AgentModule.ts +39 -7
- package/src/clients/index.ts +34 -1
- package/src/commands/agent.ts +1 -0
- package/src/commands/agents.ts +4 -1
- package/src/commands/misc.ts +17 -2
- package/src/commands/processes.ts +71 -6
- package/src/processes/managedProcessShim.ts +17 -5
- package/src/processors/Base64ImageDetector.ts +28 -4
- package/src/processors/JsonCompressor.ts +14 -0
- package/src/processors/TokenCompressor.ts +17 -14
- package/src/services/AgentService.ts +2 -2
- package/src/services/modules/computerUse.ts +3 -1
- package/tests/clients/AIClient.test.ts +98 -15
- package/tests/processes/managedProcessShim.test.ts +59 -0
- package/tests/processors/Base64ImageDetector.test.ts +21 -0
- package/tests/processors/TokenCompressor.test.ts +18 -0
- package/tests/unit/auth/registerIdentity.test.ts +93 -0
- package/ts_build/package.json +1 -1
- package/ts_build/src/agents/base/base.js +14 -9
- package/ts_build/src/agents/base/base.js.map +1 -1
- package/ts_build/src/agents/tools/startAgentTask.js +2 -2
- package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
- package/ts_build/src/auth/keyAuth.js +10 -3
- package/ts_build/src/auth/keyAuth.js.map +1 -1
- package/ts_build/src/auth/registerIdentity.d.ts +7 -0
- package/ts_build/src/auth/registerIdentity.js +62 -0
- package/ts_build/src/auth/registerIdentity.js.map +1 -0
- package/ts_build/src/chat/modules/AgentModule.d.ts +2 -0
- package/ts_build/src/chat/modules/AgentModule.js +27 -7
- package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
- package/ts_build/src/clients/index.js +19 -1
- package/ts_build/src/clients/index.js.map +1 -1
- package/ts_build/src/commands/agent.js +1 -0
- package/ts_build/src/commands/agent.js.map +1 -1
- package/ts_build/src/commands/agents.js +1 -1
- package/ts_build/src/commands/agents.js.map +1 -1
- package/ts_build/src/commands/misc.js +12 -1
- package/ts_build/src/commands/misc.js.map +1 -1
- package/ts_build/src/commands/processes.js +75 -6
- package/ts_build/src/commands/processes.js.map +1 -1
- package/ts_build/src/processes/managedProcessShim.js +13 -7
- package/ts_build/src/processes/managedProcessShim.js.map +1 -1
- package/ts_build/src/processors/Base64ImageDetector.d.ts +1 -0
- package/ts_build/src/processors/Base64ImageDetector.js +19 -2
- package/ts_build/src/processors/Base64ImageDetector.js.map +1 -1
- package/ts_build/src/processors/JsonCompressor.js +7 -0
- package/ts_build/src/processors/JsonCompressor.js.map +1 -1
- package/ts_build/src/processors/TokenCompressor.d.ts +1 -1
- package/ts_build/src/processors/TokenCompressor.js +9 -8
- package/ts_build/src/processors/TokenCompressor.js.map +1 -1
- package/ts_build/src/services/AgentService.d.ts +1 -1
- package/ts_build/src/services/AgentService.js.map +1 -1
- package/ts_build/src/services/modules/computerUse.d.ts +3 -1
- package/ts_build/tests/clients/AIClient.test.js +73 -11
- package/ts_build/tests/clients/AIClient.test.js.map +1 -1
- package/ts_build/tests/processes/managedProcessShim.test.d.ts +1 -0
- package/ts_build/tests/processes/managedProcessShim.test.js +92 -0
- package/ts_build/tests/processes/managedProcessShim.test.js.map +1 -0
- package/ts_build/tests/processors/Base64ImageDetector.test.js +18 -0
- package/ts_build/tests/processors/Base64ImageDetector.test.js.map +1 -1
- package/ts_build/tests/processors/TokenCompressor.test.js +15 -0
- package/ts_build/tests/processors/TokenCompressor.test.js.map +1 -1
- package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +1 -0
- package/ts_build/tests/unit/auth/registerIdentity.test.js +86 -0
- package/ts_build/tests/unit/auth/registerIdentity.test.js.map +1 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const os_1 = __importDefault(require("os"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const registerPublicKey = jest.fn();
|
|
10
|
+
const exchangePublicKeyJwt = jest.fn();
|
|
11
|
+
const storeJwt = jest.fn();
|
|
12
|
+
const getOrCreatePublicKey = jest.fn();
|
|
13
|
+
const getConfig = jest.fn();
|
|
14
|
+
const updateConfig = jest.fn();
|
|
15
|
+
jest.mock("../../../src/auth/keyAuth", () => ({ registerPublicKey, exchangePublicKeyJwt, storeJwt }));
|
|
16
|
+
jest.mock("../../../src/auth/keyManager", () => ({ getOrCreatePublicKey }));
|
|
17
|
+
jest.mock("../../../src/config", () => ({ getConfig, updateConfig }));
|
|
18
|
+
const registerIdentity_1 = require("../../../src/auth/registerIdentity");
|
|
19
|
+
function makeJwt(payload) {
|
|
20
|
+
return `${Buffer.from("{}").toString("base64url")}.${Buffer.from(JSON.stringify(payload)).toString("base64url")}.sig`;
|
|
21
|
+
}
|
|
22
|
+
describe("registerIdentity", () => {
|
|
23
|
+
const originalCwd = process.cwd();
|
|
24
|
+
let workDir;
|
|
25
|
+
const sourceJwt = makeJwt({ org: "org-test" });
|
|
26
|
+
const publicKeyBase64 = Buffer.alloc(32, 5).toString("base64");
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
jest.clearAllMocks();
|
|
29
|
+
jest.spyOn(console, "log").mockImplementation(() => undefined);
|
|
30
|
+
workDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), "knowhow-register-identity-"));
|
|
31
|
+
fs_1.default.mkdirSync(path_1.default.join(workDir, ".knowhow"), { recursive: true });
|
|
32
|
+
fs_1.default.writeFileSync(path_1.default.join(workDir, ".knowhow", ".jwt"), sourceJwt);
|
|
33
|
+
process.chdir(workDir);
|
|
34
|
+
getOrCreatePublicKey.mockReturnValue({
|
|
35
|
+
publicKeyBase64,
|
|
36
|
+
fingerprint: "SHA256:test",
|
|
37
|
+
privateKeyPath: path_1.default.join(workDir, ".knowhow", "keys", "id_ed25519"),
|
|
38
|
+
});
|
|
39
|
+
registerPublicKey.mockResolvedValue(undefined);
|
|
40
|
+
exchangePublicKeyJwt.mockResolvedValue("identity.jwt.token");
|
|
41
|
+
getConfig.mockResolvedValue({ modelProviders: [] });
|
|
42
|
+
updateConfig.mockResolvedValue(undefined);
|
|
43
|
+
});
|
|
44
|
+
afterEach(() => {
|
|
45
|
+
process.chdir(originalCwd);
|
|
46
|
+
fs_1.default.rmSync(workDir, { recursive: true, force: true });
|
|
47
|
+
jest.restoreAllMocks();
|
|
48
|
+
});
|
|
49
|
+
it("registers from the project JWT and stores the exchanged JWT", async () => {
|
|
50
|
+
await (0, registerIdentity_1.registerIdentity)({ apiUrl: "https://api.example" });
|
|
51
|
+
expect(registerPublicKey).toHaveBeenCalledWith(sourceJwt, publicKeyBase64, "https://api.example");
|
|
52
|
+
expect(exchangePublicKeyJwt).toHaveBeenCalledWith("org-test", "https://api.example", undefined);
|
|
53
|
+
expect(storeJwt).toHaveBeenCalledWith("identity.jwt.token");
|
|
54
|
+
expect(updateConfig).toHaveBeenCalledWith(expect.objectContaining({
|
|
55
|
+
orgId: "org-test",
|
|
56
|
+
modelProviders: [{ provider: "knowhow" }],
|
|
57
|
+
cliIdentityPath: expect.stringContaining("id_ed25519"),
|
|
58
|
+
}));
|
|
59
|
+
});
|
|
60
|
+
it("uses an explicitly selected identity", async () => {
|
|
61
|
+
await (0, registerIdentity_1.registerIdentity)({ identityPath: "/keys/id", apiUrl: "https://api.example" });
|
|
62
|
+
expect(getOrCreatePublicKey).toHaveBeenCalledWith("/keys/id");
|
|
63
|
+
expect(exchangePublicKeyJwt).toHaveBeenCalledWith("org-test", "https://api.example", "/keys/id");
|
|
64
|
+
});
|
|
65
|
+
it("requires a nonempty project JWT", async () => {
|
|
66
|
+
fs_1.default.writeFileSync(path_1.default.join(workDir, ".knowhow", ".jwt"), " ");
|
|
67
|
+
await expect((0, registerIdentity_1.registerIdentity)()).rejects.toThrow("JWT file is empty");
|
|
68
|
+
expect(registerPublicKey).not.toHaveBeenCalled();
|
|
69
|
+
});
|
|
70
|
+
it("does not replace the JWT when registration fails", async () => {
|
|
71
|
+
registerPublicKey.mockRejectedValue(new Error("registration failed"));
|
|
72
|
+
await expect((0, registerIdentity_1.registerIdentity)()).rejects.toThrow("registration failed");
|
|
73
|
+
expect(storeJwt).not.toHaveBeenCalled();
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("JWT organization extraction", () => {
|
|
77
|
+
it("decodes payload and accepts canonical org", () => {
|
|
78
|
+
expect((0, registerIdentity_1.decodeJwtPayload)(makeJwt({ org: "one" }))).toMatchObject({ org: "one" });
|
|
79
|
+
expect((0, registerIdentity_1.extractOrgIdFromJwt)(makeJwt({ org: "one" }))).toBe("one");
|
|
80
|
+
});
|
|
81
|
+
it("rejects malformed and organization-less JWTs", () => {
|
|
82
|
+
expect(() => (0, registerIdentity_1.decodeJwtPayload)("invalid")).toThrow("Invalid JWT format");
|
|
83
|
+
expect(() => (0, registerIdentity_1.extractOrgIdFromJwt)(makeJwt({ sub: "user" }))).toThrow("organization claim");
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
//# sourceMappingURL=registerIdentity.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registerIdentity.test.js","sourceRoot":"","sources":["../../../../tests/unit/auth/registerIdentity.test.ts"],"names":[],"mappings":"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"}
|