@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.
Files changed (70) hide show
  1. package/package.json +1 -1
  2. package/src/agents/base/base.ts +18 -9
  3. package/src/agents/tools/startAgentTask.ts +5 -2
  4. package/src/auth/keyAuth.ts +10 -4
  5. package/src/auth/registerIdentity.ts +67 -0
  6. package/src/chat/modules/AgentModule.ts +39 -7
  7. package/src/clients/index.ts +34 -1
  8. package/src/commands/agent.ts +1 -0
  9. package/src/commands/agents.ts +4 -1
  10. package/src/commands/misc.ts +17 -2
  11. package/src/commands/processes.ts +71 -6
  12. package/src/processes/managedProcessShim.ts +17 -5
  13. package/src/processors/Base64ImageDetector.ts +28 -4
  14. package/src/processors/JsonCompressor.ts +14 -0
  15. package/src/processors/TokenCompressor.ts +17 -14
  16. package/src/services/AgentService.ts +2 -2
  17. package/src/services/modules/computerUse.ts +3 -1
  18. package/tests/clients/AIClient.test.ts +98 -15
  19. package/tests/processes/managedProcessShim.test.ts +59 -0
  20. package/tests/processors/Base64ImageDetector.test.ts +21 -0
  21. package/tests/processors/TokenCompressor.test.ts +18 -0
  22. package/tests/unit/auth/registerIdentity.test.ts +93 -0
  23. package/ts_build/package.json +1 -1
  24. package/ts_build/src/agents/base/base.js +14 -9
  25. package/ts_build/src/agents/base/base.js.map +1 -1
  26. package/ts_build/src/agents/tools/startAgentTask.js +2 -2
  27. package/ts_build/src/agents/tools/startAgentTask.js.map +1 -1
  28. package/ts_build/src/auth/keyAuth.js +10 -3
  29. package/ts_build/src/auth/keyAuth.js.map +1 -1
  30. package/ts_build/src/auth/registerIdentity.d.ts +7 -0
  31. package/ts_build/src/auth/registerIdentity.js +62 -0
  32. package/ts_build/src/auth/registerIdentity.js.map +1 -0
  33. package/ts_build/src/chat/modules/AgentModule.d.ts +2 -0
  34. package/ts_build/src/chat/modules/AgentModule.js +27 -7
  35. package/ts_build/src/chat/modules/AgentModule.js.map +1 -1
  36. package/ts_build/src/clients/index.js +19 -1
  37. package/ts_build/src/clients/index.js.map +1 -1
  38. package/ts_build/src/commands/agent.js +1 -0
  39. package/ts_build/src/commands/agent.js.map +1 -1
  40. package/ts_build/src/commands/agents.js +1 -1
  41. package/ts_build/src/commands/agents.js.map +1 -1
  42. package/ts_build/src/commands/misc.js +12 -1
  43. package/ts_build/src/commands/misc.js.map +1 -1
  44. package/ts_build/src/commands/processes.js +75 -6
  45. package/ts_build/src/commands/processes.js.map +1 -1
  46. package/ts_build/src/processes/managedProcessShim.js +13 -7
  47. package/ts_build/src/processes/managedProcessShim.js.map +1 -1
  48. package/ts_build/src/processors/Base64ImageDetector.d.ts +1 -0
  49. package/ts_build/src/processors/Base64ImageDetector.js +19 -2
  50. package/ts_build/src/processors/Base64ImageDetector.js.map +1 -1
  51. package/ts_build/src/processors/JsonCompressor.js +7 -0
  52. package/ts_build/src/processors/JsonCompressor.js.map +1 -1
  53. package/ts_build/src/processors/TokenCompressor.d.ts +1 -1
  54. package/ts_build/src/processors/TokenCompressor.js +9 -8
  55. package/ts_build/src/processors/TokenCompressor.js.map +1 -1
  56. package/ts_build/src/services/AgentService.d.ts +1 -1
  57. package/ts_build/src/services/AgentService.js.map +1 -1
  58. package/ts_build/src/services/modules/computerUse.d.ts +3 -1
  59. package/ts_build/tests/clients/AIClient.test.js +73 -11
  60. package/ts_build/tests/clients/AIClient.test.js.map +1 -1
  61. package/ts_build/tests/processes/managedProcessShim.test.d.ts +1 -0
  62. package/ts_build/tests/processes/managedProcessShim.test.js +92 -0
  63. package/ts_build/tests/processes/managedProcessShim.test.js.map +1 -0
  64. package/ts_build/tests/processors/Base64ImageDetector.test.js +18 -0
  65. package/ts_build/tests/processors/Base64ImageDetector.test.js.map +1 -1
  66. package/ts_build/tests/processors/TokenCompressor.test.js +15 -0
  67. package/ts_build/tests/processors/TokenCompressor.test.js.map +1 -1
  68. package/ts_build/tests/unit/auth/registerIdentity.test.d.ts +1 -0
  69. package/ts_build/tests/unit/auth/registerIdentity.test.js +86 -0
  70. 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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"}