@wastedcode/memex 0.1.1 → 0.1.2
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/dist/cli/client.d.ts +2 -1
- package/dist/cli/client.js +5 -2
- package/dist/cli/client.js.map +1 -1
- package/dist/cli/commands/config.js +10 -5
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/login.js +14 -6
- package/dist/cli/commands/login.js.map +1 -1
- package/dist/cli/commands/setup-token.d.ts +2 -0
- package/dist/cli/commands/setup-token.js +41 -0
- package/dist/cli/commands/setup-token.js.map +1 -0
- package/dist/daemon/auth.d.ts +16 -6
- package/dist/daemon/auth.js +50 -22
- package/dist/daemon/auth.js.map +1 -1
- package/dist/daemon/routes.d.ts +2 -1
- package/dist/daemon/routes.js +23 -7
- package/dist/daemon/routes.js.map +1 -1
- package/dist/daemon/runner.js +4 -0
- package/dist/daemon/runner.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/daemon.js.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/errors.js +4 -2
- package/dist/lib/errors.js.map +1 -1
- package/dist/standalone/memex.mjs +143 -43
- package/dist/standalone/memex.mjs.map +4 -4
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -12,6 +12,7 @@ import { logsCommand } from './cli/commands/logs.js';
|
|
|
12
12
|
import { listCommand } from './cli/commands/list.js';
|
|
13
13
|
import { chownCommand } from './cli/commands/chown.js';
|
|
14
14
|
import { statusCommand } from './cli/commands/status.js';
|
|
15
|
+
import { setupTokenCommand } from './cli/commands/setup-token.js';
|
|
15
16
|
const program = new Command();
|
|
16
17
|
program
|
|
17
18
|
.name('memex')
|
|
@@ -29,6 +30,7 @@ program.addCommand(logsCommand);
|
|
|
29
30
|
program.addCommand(listCommand);
|
|
30
31
|
program.addCommand(chownCommand);
|
|
31
32
|
program.addCommand(statusCommand);
|
|
33
|
+
program.addCommand(setupTokenCommand);
|
|
32
34
|
program.parseAsync().catch((err) => {
|
|
33
35
|
console.error(err.message ?? err);
|
|
34
36
|
process.exit(1);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,mEAAmE,CAAC;KAChF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;AAEtC,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
package/dist/lib/errors.js
CHANGED
|
@@ -41,8 +41,10 @@ export class NoCredentialsError extends MemexError {
|
|
|
41
41
|
constructor(wikiId) {
|
|
42
42
|
super(`No credentials configured for wiki '${wikiId}'.\n` +
|
|
43
43
|
'Set credentials with:\n' +
|
|
44
|
-
` memex
|
|
45
|
-
` memex
|
|
44
|
+
` memex setup-token <token> (global, all wikis)\n` +
|
|
45
|
+
` memex login ${wikiId} --token <token> (per-wiki)\n` +
|
|
46
|
+
` memex login ${wikiId} (copy ~/.claude credentials)\n` +
|
|
47
|
+
'\nGenerate a token by running: claude setup-token', 'NO_CREDENTIALS', 400);
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
50
|
export class ForbiddenError extends MemexError {
|
package/dist/lib/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAG1B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,aAAqB,GAAG;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAc;QAG/B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,MAAc;QACxB,KAAK,CAAC,SAAS,MAAM,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,MAAc;QACxB,KAAK,CAAC,SAAS,MAAM,kBAAkB,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,KAAa;QACvB,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C;QACE,KAAK,CACH,4DAA4D;YAC5D,YAAY;YACZ,iDAAiD;YACjD,2DAA2D;YAC3D,mEAAmE,EACnE,kBAAkB,EAClB,GAAG,CACJ,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,MAAc;QACxB,KAAK,CACH,uCAAuC,MAAM,MAAM;YACnD,yBAAyB;YACzB,iBAAiB,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/lib/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAG1B;IACA;IAHT,YACE,OAAe,EACR,IAAY,EACZ,aAAqB,GAAG;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC;QAHR,SAAI,GAAJ,IAAI,CAAQ;QACZ,eAAU,GAAV,UAAU,CAAc;QAG/B,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,MAAc;QACxB,KAAK,CAAC,SAAS,MAAM,aAAa,EAAE,gBAAgB,EAAE,GAAG,CAAC,CAAC;IAC7D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,MAAc;QACxB,KAAK,CAAC,SAAS,MAAM,kBAAkB,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,UAAU;IAC9C,YAAY,KAAa;QACvB,KAAK,CAAC,QAAQ,KAAK,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,iBAAiB,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C;QACE,KAAK,CACH,4DAA4D;YAC5D,YAAY;YACZ,iDAAiD;YACjD,2DAA2D;YAC3D,mEAAmE,EACnE,kBAAkB,EAClB,GAAG,CACJ,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,UAAU;IAChD,YAAY,MAAc;QACxB,KAAK,CACH,uCAAuC,MAAM,MAAM;YACnD,yBAAyB;YACzB,iEAAiE;YACjE,iBAAiB,MAAM,kCAAkC;YACzD,iBAAiB,MAAM,oDAAoD;YAC3E,mDAAmD,EACnD,gBAAgB,EAChB,GAAG,CACJ,CAAC;IACJ,CAAC;CACF;AAED,MAAM,OAAO,cAAe,SAAQ,UAAU;IAC5C,YAAY,MAAc;QACxB,KAAK,CAAC,0BAA0B,MAAM,GAAG,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;CACF;AAED,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAC1C,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IACnD;QACE,KAAK,CACH,mCAAmC;YACnC,4BAA4B,EAC5B,oBAAoB,EACpB,GAAG,CACJ,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -253,8 +253,11 @@ var init_errors = __esm({
|
|
|
253
253
|
super(
|
|
254
254
|
`No credentials configured for wiki '${wikiId}'.
|
|
255
255
|
Set credentials with:
|
|
256
|
-
memex
|
|
257
|
-
memex
|
|
256
|
+
memex setup-token <token> (global, all wikis)
|
|
257
|
+
memex login ${wikiId} --token <token> (per-wiki)
|
|
258
|
+
memex login ${wikiId} (copy ~/.claude credentials)
|
|
259
|
+
|
|
260
|
+
Generate a token by running: claude setup-token`,
|
|
258
261
|
"NO_CREDENTIALS",
|
|
259
262
|
400
|
|
260
263
|
);
|
|
@@ -568,36 +571,37 @@ Chronological record of knowledge base activity.
|
|
|
568
571
|
// src/daemon/auth.ts
|
|
569
572
|
import { existsSync as existsSync3, readFileSync as readFileSync2, writeFileSync as writeFileSync2, mkdirSync as mkdirSync3 } from "node:fs";
|
|
570
573
|
import { join as join3 } from "node:path";
|
|
571
|
-
var AuthManager;
|
|
574
|
+
var GLOBAL_TOKEN_PATH, AuthManager;
|
|
572
575
|
var init_auth = __esm({
|
|
573
576
|
"src/daemon/auth.ts"() {
|
|
574
577
|
"use strict";
|
|
575
578
|
init_constants();
|
|
576
579
|
init_errors();
|
|
580
|
+
GLOBAL_TOKEN_PATH = join3(DATA_DIR, ".oauth-token");
|
|
577
581
|
AuthManager = class {
|
|
578
|
-
constructor(wikisDir = WIKIS_DIR
|
|
582
|
+
constructor(wikisDir = WIKIS_DIR) {
|
|
579
583
|
this.wikisDir = wikisDir;
|
|
580
|
-
this.
|
|
584
|
+
this.globalOAuthToken = this.loadGlobalToken();
|
|
581
585
|
}
|
|
582
586
|
wikisDir;
|
|
583
|
-
|
|
587
|
+
globalOAuthToken;
|
|
584
588
|
/**
|
|
585
589
|
* Resolve credentials for a wiki, returning environment variables
|
|
586
590
|
* to set on the claude child process.
|
|
587
591
|
*
|
|
588
592
|
* Priority:
|
|
589
|
-
* 1. Per-wiki
|
|
593
|
+
* 1. Per-wiki OAuth token file (.claude/oauth-token)
|
|
590
594
|
* 2. Per-wiki OAuth credentials (.claude/.credentials.json exists)
|
|
591
|
-
* 3. Global
|
|
595
|
+
* 3. Global OAuth token (from `memex setup-token`)
|
|
592
596
|
*/
|
|
593
597
|
resolveCredentials(wikiId) {
|
|
594
598
|
const claudeDir = this.configDir(wikiId);
|
|
595
|
-
const
|
|
596
|
-
if (existsSync3(
|
|
597
|
-
const
|
|
598
|
-
if (
|
|
599
|
+
const tokenPath = join3(claudeDir, "oauth-token");
|
|
600
|
+
if (existsSync3(tokenPath)) {
|
|
601
|
+
const token = readFileSync2(tokenPath, "utf-8").trim();
|
|
602
|
+
if (token) {
|
|
599
603
|
return {
|
|
600
|
-
|
|
604
|
+
CLAUDE_CODE_OAUTH_TOKEN: token,
|
|
601
605
|
CLAUDE_CONFIG_DIR: claudeDir
|
|
602
606
|
};
|
|
603
607
|
}
|
|
@@ -608,22 +612,38 @@ var init_auth = __esm({
|
|
|
608
612
|
CLAUDE_CONFIG_DIR: claudeDir
|
|
609
613
|
};
|
|
610
614
|
}
|
|
611
|
-
if (this.
|
|
615
|
+
if (this.globalOAuthToken) {
|
|
612
616
|
return {
|
|
613
|
-
|
|
617
|
+
CLAUDE_CODE_OAUTH_TOKEN: this.globalOAuthToken,
|
|
614
618
|
CLAUDE_CONFIG_DIR: claudeDir
|
|
615
619
|
};
|
|
616
620
|
}
|
|
617
621
|
throw new NoCredentialsError(wikiId);
|
|
618
622
|
}
|
|
619
623
|
/**
|
|
620
|
-
* Store
|
|
624
|
+
* Store and activate a global OAuth token (from `claude setup-token`).
|
|
625
|
+
* This is the daemon-wide fallback used when a wiki has no per-wiki credentials.
|
|
626
|
+
*/
|
|
627
|
+
setGlobalToken(token) {
|
|
628
|
+
const trimmed = token.trim();
|
|
629
|
+
mkdirSync3(DATA_DIR, { recursive: true });
|
|
630
|
+
writeFileSync2(GLOBAL_TOKEN_PATH, trimmed, { mode: 384 });
|
|
631
|
+
this.globalOAuthToken = trimmed;
|
|
632
|
+
}
|
|
633
|
+
/**
|
|
634
|
+
* Check if a global OAuth token is configured.
|
|
621
635
|
*/
|
|
622
|
-
|
|
636
|
+
hasGlobalToken() {
|
|
637
|
+
return !!this.globalOAuthToken;
|
|
638
|
+
}
|
|
639
|
+
/**
|
|
640
|
+
* Store an OAuth token for a specific wiki.
|
|
641
|
+
*/
|
|
642
|
+
setWikiToken(wikiId, token) {
|
|
623
643
|
const claudeDir = this.configDir(wikiId);
|
|
624
644
|
mkdirSync3(claudeDir, { recursive: true, mode: 448 });
|
|
625
|
-
const
|
|
626
|
-
writeFileSync2(
|
|
645
|
+
const tokenPath = join3(claudeDir, "oauth-token");
|
|
646
|
+
writeFileSync2(tokenPath, token.trim(), { mode: 384 });
|
|
627
647
|
}
|
|
628
648
|
/**
|
|
629
649
|
* Get the CLAUDE_CONFIG_DIR path for a wiki.
|
|
@@ -645,9 +665,17 @@ var init_auth = __esm({
|
|
|
645
665
|
*/
|
|
646
666
|
hasCredentials(wikiId) {
|
|
647
667
|
const claudeDir = this.configDir(wikiId);
|
|
648
|
-
const
|
|
668
|
+
const tokenPath = join3(claudeDir, "oauth-token");
|
|
649
669
|
const credsPath = join3(claudeDir, ".credentials.json");
|
|
650
|
-
return existsSync3(
|
|
670
|
+
return existsSync3(tokenPath) || existsSync3(credsPath) || !!this.globalOAuthToken;
|
|
671
|
+
}
|
|
672
|
+
// ── Private ────────────────────────────────────────────────────────────
|
|
673
|
+
loadGlobalToken() {
|
|
674
|
+
if (existsSync3(GLOBAL_TOKEN_PATH)) {
|
|
675
|
+
const token = readFileSync2(GLOBAL_TOKEN_PATH, "utf-8").trim();
|
|
676
|
+
if (token) return token;
|
|
677
|
+
}
|
|
678
|
+
return void 0;
|
|
651
679
|
}
|
|
652
680
|
};
|
|
653
681
|
}
|
|
@@ -968,6 +996,9 @@ var init_runner = __esm({
|
|
|
968
996
|
if (credEnv["CLAUDE_CONFIG_DIR"]) {
|
|
969
997
|
env["CLAUDE_CONFIG_DIR"] = `${WORKSPACE_MOUNT}/.claude`;
|
|
970
998
|
}
|
|
999
|
+
if (credEnv["CLAUDE_CODE_OAUTH_TOKEN"]) {
|
|
1000
|
+
env["CLAUDE_CODE_OAUTH_TOKEN"] = credEnv["CLAUDE_CODE_OAUTH_TOKEN"];
|
|
1001
|
+
}
|
|
971
1002
|
return new Promise((resolve) => {
|
|
972
1003
|
const child = spawn(wrapped.command, wrapped.args, {
|
|
973
1004
|
env,
|
|
@@ -1245,7 +1276,8 @@ var init_routes = __esm({
|
|
|
1245
1276
|
{ method: "DELETE", pattern: /^\/wikis\/(?<id>[^/]+)$/, handler: this.destroyWiki.bind(this) },
|
|
1246
1277
|
{ method: "PUT", pattern: /^\/wikis\/(?<id>[^/]+)\/config$/, handler: this.updateConfig.bind(this) },
|
|
1247
1278
|
{ method: "POST", pattern: /^\/wikis\/(?<id>[^/]+)\/chown$/, handler: this.chownWiki.bind(this) },
|
|
1248
|
-
{ method: "POST", pattern: /^\/
|
|
1279
|
+
{ method: "POST", pattern: /^\/auth\/token$/, handler: this.setGlobalToken.bind(this) },
|
|
1280
|
+
{ method: "POST", pattern: /^\/wikis\/(?<id>[^/]+)\/token$/, handler: this.setWikiToken.bind(this) },
|
|
1249
1281
|
{ method: "POST", pattern: /^\/wikis\/(?<id>[^/]+)\/credentials$/, handler: this.setCredentials.bind(this) },
|
|
1250
1282
|
{ method: "POST", pattern: /^\/wikis\/(?<id>[^/]+)\/jobs$/, handler: this.submitJob.bind(this) },
|
|
1251
1283
|
{ method: "GET", pattern: /^\/wikis\/(?<id>[^/]+)\/jobs\/(?<jobId>\d+)$/, handler: this.getJob.bind(this) },
|
|
@@ -1355,16 +1387,31 @@ var init_routes = __esm({
|
|
|
1355
1387
|
return { status: 200, body: { ok: true, data: wiki } };
|
|
1356
1388
|
}
|
|
1357
1389
|
// ── Auth ─────────────────────────────────────────────────────────────────
|
|
1358
|
-
async
|
|
1390
|
+
async setGlobalToken(_params, body, _ctx) {
|
|
1391
|
+
const b = requireBody(body);
|
|
1392
|
+
const token = b.token;
|
|
1393
|
+
if (!token || typeof token !== "string") {
|
|
1394
|
+
throw new ValidationError("token (string) is required");
|
|
1395
|
+
}
|
|
1396
|
+
if (!token.startsWith("sk-ant-oat01-")) {
|
|
1397
|
+
throw new ValidationError("Token must be a Claude OAuth token (sk-ant-oat01-...)");
|
|
1398
|
+
}
|
|
1399
|
+
this.auth.setGlobalToken(token);
|
|
1400
|
+
return { status: 200, body: { ok: true } };
|
|
1401
|
+
}
|
|
1402
|
+
async setWikiToken(params, body, ctx) {
|
|
1359
1403
|
const wikiId = params["id"];
|
|
1360
1404
|
this.requireWiki(wikiId, ctx.callerUid);
|
|
1361
1405
|
const b = requireBody(body);
|
|
1362
|
-
const
|
|
1363
|
-
if (!
|
|
1364
|
-
throw new ValidationError("
|
|
1406
|
+
const token = b.token;
|
|
1407
|
+
if (!token || typeof token !== "string") {
|
|
1408
|
+
throw new ValidationError("token (string) is required");
|
|
1365
1409
|
}
|
|
1366
|
-
|
|
1367
|
-
|
|
1410
|
+
if (!token.startsWith("sk-ant-oat01-")) {
|
|
1411
|
+
throw new ValidationError("Token must be a Claude OAuth token (sk-ant-oat01-...)");
|
|
1412
|
+
}
|
|
1413
|
+
this.auth.setWikiToken(wikiId, token);
|
|
1414
|
+
this.db.logAudit(wikiId, "wiki.oauth_token_set");
|
|
1368
1415
|
return { status: 200, body: { ok: true } };
|
|
1369
1416
|
}
|
|
1370
1417
|
async setCredentials(params, body, ctx) {
|
|
@@ -1659,7 +1706,7 @@ async function startDaemon() {
|
|
|
1659
1706
|
namespace.checkCapabilities();
|
|
1660
1707
|
namespace.ensureDirectories();
|
|
1661
1708
|
const scaffold = new WikiScaffold(WIKIS_DIR);
|
|
1662
|
-
const auth = new AuthManager(WIKIS_DIR
|
|
1709
|
+
const auth = new AuthManager(WIKIS_DIR);
|
|
1663
1710
|
const runner = new ClaudeRunner(namespace, auth, db, WIKIS_DIR);
|
|
1664
1711
|
const queue = new QueueManager(db, runner, AUTO_LINT_INTERVAL);
|
|
1665
1712
|
const routes = new RouteHandler(db, scaffold, namespace, queue, auth);
|
|
@@ -1699,7 +1746,7 @@ var init_daemon = __esm({
|
|
|
1699
1746
|
});
|
|
1700
1747
|
|
|
1701
1748
|
// src/index.ts
|
|
1702
|
-
import { Command as
|
|
1749
|
+
import { Command as Command14 } from "commander";
|
|
1703
1750
|
|
|
1704
1751
|
// src/cli/commands/serve.ts
|
|
1705
1752
|
import { Command } from "commander";
|
|
@@ -1844,8 +1891,11 @@ var MemexClient = class {
|
|
|
1844
1891
|
chownWiki(wikiId, uid) {
|
|
1845
1892
|
return this.request("POST", `/wikis/${wikiId}/chown`, { uid });
|
|
1846
1893
|
}
|
|
1847
|
-
|
|
1848
|
-
return this.request("POST",
|
|
1894
|
+
setGlobalToken(token) {
|
|
1895
|
+
return this.request("POST", "/auth/token", { token });
|
|
1896
|
+
}
|
|
1897
|
+
setWikiToken(wikiId, token) {
|
|
1898
|
+
return this.request("POST", `/wikis/${wikiId}/token`, { token });
|
|
1849
1899
|
}
|
|
1850
1900
|
setCredentials(wikiId, credentials) {
|
|
1851
1901
|
return this.request("POST", `/wikis/${wikiId}/credentials`, { credentials });
|
|
@@ -1958,7 +2008,7 @@ import { createInterface as createInterface2 } from "node:readline";
|
|
|
1958
2008
|
import { execFileSync as execFileSync2 } from "node:child_process";
|
|
1959
2009
|
init_constants();
|
|
1960
2010
|
import { join as join5 } from "node:path";
|
|
1961
|
-
var configCommand = new Command4("config").description("Configure a wiki").argument("<wikiId>", "Wiki to configure").option("--edit", "Open .claude.md in $EDITOR").option("--set-
|
|
2011
|
+
var configCommand = new Command4("config").description("Configure a wiki").argument("<wikiId>", "Wiki to configure").option("--edit", "Open .claude.md in $EDITOR").option("--set-token", "Set an OAuth token for this wiki (from `claude setup-token`)").option("--model <model>", "Set the default model (e.g., sonnet, opus, haiku)").option("--allowed-tools <tools>", "Set allowed tools (comma-separated, e.g., WebSearch,WebFetch)").option("--list-tools", "Show available tools and current configuration").action(async (wikiId, opts) => {
|
|
1962
2012
|
const client = new MemexClient();
|
|
1963
2013
|
const wikiResp = await client.getWiki(wikiId);
|
|
1964
2014
|
if (!wikiResp.ok) {
|
|
@@ -1977,14 +2027,20 @@ var configCommand = new Command4("config").description("Configure a wiki").argum
|
|
|
1977
2027
|
}
|
|
1978
2028
|
return;
|
|
1979
2029
|
}
|
|
1980
|
-
if (opts.
|
|
1981
|
-
const
|
|
1982
|
-
|
|
2030
|
+
if (opts.setToken) {
|
|
2031
|
+
const token = await promptSecret("OAuth token (from `claude setup-token`): ");
|
|
2032
|
+
if (!token.startsWith("sk-ant-oat01-")) {
|
|
2033
|
+
console.error(`Error: Token must start with 'sk-ant-oat01-'.`);
|
|
2034
|
+
console.error(`
|
|
2035
|
+
Generate one by running: claude setup-token`);
|
|
2036
|
+
process.exit(1);
|
|
2037
|
+
}
|
|
2038
|
+
const resp = await client.setWikiToken(wikiId, token);
|
|
1983
2039
|
if (!resp.ok) {
|
|
1984
2040
|
console.error(`Error: ${resp.error}`);
|
|
1985
2041
|
process.exit(1);
|
|
1986
2042
|
}
|
|
1987
|
-
console.log(`
|
|
2043
|
+
console.log(`OAuth token set for '${wikiId}'`);
|
|
1988
2044
|
return;
|
|
1989
2045
|
}
|
|
1990
2046
|
if (opts.listTools) {
|
|
@@ -2070,27 +2126,36 @@ import { readFileSync as readFileSync5, existsSync as existsSync6 } from "node:f
|
|
|
2070
2126
|
import { join as join6 } from "node:path";
|
|
2071
2127
|
import { homedir } from "node:os";
|
|
2072
2128
|
var DEFAULT_CREDS_PATH = join6(homedir(), ".claude", ".credentials.json");
|
|
2073
|
-
var loginCommand = new Command5("login").description("Copy Claude credentials into a wiki").argument("<wikiId>", "Wiki to authenticate").option("--credentials <path>", "Path to .credentials.json", DEFAULT_CREDS_PATH).option("--
|
|
2129
|
+
var loginCommand = new Command5("login").description("Copy Claude credentials into a wiki").argument("<wikiId>", "Wiki to authenticate").option("--credentials <path>", "Path to .credentials.json", DEFAULT_CREDS_PATH).option("--token <token>", "Use an OAuth token from `claude setup-token`").action(async (wikiId, opts) => {
|
|
2074
2130
|
const client = new MemexClient();
|
|
2075
2131
|
const wikiResp = await client.getWiki(wikiId);
|
|
2076
2132
|
if (!wikiResp.ok) {
|
|
2077
2133
|
console.error(`Error: ${wikiResp.error}`);
|
|
2078
2134
|
process.exit(1);
|
|
2079
2135
|
}
|
|
2080
|
-
if (opts.
|
|
2081
|
-
|
|
2136
|
+
if (opts.token) {
|
|
2137
|
+
if (!opts.token.startsWith("sk-ant-oat01-")) {
|
|
2138
|
+
console.error(`Error: Token must start with 'sk-ant-oat01-'.`);
|
|
2139
|
+
console.error(`
|
|
2140
|
+
Generate one by running: claude setup-token`);
|
|
2141
|
+
process.exit(1);
|
|
2142
|
+
}
|
|
2143
|
+
const resp2 = await client.setWikiToken(wikiId, opts.token);
|
|
2082
2144
|
if (!resp2.ok) {
|
|
2083
2145
|
console.error(`Error: ${resp2.error}`);
|
|
2084
2146
|
process.exit(1);
|
|
2085
2147
|
}
|
|
2086
|
-
console.log(`
|
|
2148
|
+
console.log(`OAuth token stored for wiki '${wikiId}'.`);
|
|
2087
2149
|
return;
|
|
2088
2150
|
}
|
|
2089
2151
|
const credsPath = opts.credentials;
|
|
2090
2152
|
if (!existsSync6(credsPath)) {
|
|
2091
2153
|
console.error(`Error: Credentials file not found: ${credsPath}`);
|
|
2092
2154
|
console.error(`
|
|
2093
|
-
|
|
2155
|
+
Options:`);
|
|
2156
|
+
console.error(` 1. Run 'claude auth login' first, then re-run this command`);
|
|
2157
|
+
console.error(` 2. Run 'claude setup-token' and use: memex login ${wikiId} --token <token>`);
|
|
2158
|
+
console.error(` 3. Set globally: memex setup-token <token>`);
|
|
2094
2159
|
process.exit(1);
|
|
2095
2160
|
}
|
|
2096
2161
|
const credentials = readFileSync5(credsPath, "utf-8");
|
|
@@ -2380,8 +2445,42 @@ function padRow2(id, type, status, created) {
|
|
|
2380
2445
|
return `${id.padEnd(8)} ${type.padEnd(10)} ${status.padEnd(12)} ${created}`;
|
|
2381
2446
|
}
|
|
2382
2447
|
|
|
2448
|
+
// src/cli/commands/setup-token.ts
|
|
2449
|
+
import { Command as Command13 } from "commander";
|
|
2450
|
+
var TOKEN_PREFIX = "sk-ant-oat01-";
|
|
2451
|
+
var setupTokenCommand = new Command13("setup-token").description("Store a long-lived OAuth token from `claude setup-token` for all wikis").argument("<token>", "OAuth token (sk-ant-oat01-...)").option("--wiki <wikiId>", "Store for a specific wiki only (instead of globally)").action(async (token, opts) => {
|
|
2452
|
+
if (!token.startsWith(TOKEN_PREFIX)) {
|
|
2453
|
+
console.error(`Error: Token must start with '${TOKEN_PREFIX}'.`);
|
|
2454
|
+
console.error(`
|
|
2455
|
+
Generate one by running: claude setup-token`);
|
|
2456
|
+
process.exit(1);
|
|
2457
|
+
}
|
|
2458
|
+
const client = new MemexClient();
|
|
2459
|
+
if (opts.wiki) {
|
|
2460
|
+
const wikiResp = await client.getWiki(opts.wiki);
|
|
2461
|
+
if (!wikiResp.ok) {
|
|
2462
|
+
console.error(`Error: ${wikiResp.error}`);
|
|
2463
|
+
process.exit(1);
|
|
2464
|
+
}
|
|
2465
|
+
const resp = await client.setWikiToken(opts.wiki, token);
|
|
2466
|
+
if (!resp.ok) {
|
|
2467
|
+
console.error(`Error: ${resp.error}`);
|
|
2468
|
+
process.exit(1);
|
|
2469
|
+
}
|
|
2470
|
+
console.log(`OAuth token stored for wiki '${opts.wiki}'.`);
|
|
2471
|
+
} else {
|
|
2472
|
+
const resp = await client.setGlobalToken(token);
|
|
2473
|
+
if (!resp.ok) {
|
|
2474
|
+
console.error(`Error: ${resp.error}`);
|
|
2475
|
+
process.exit(1);
|
|
2476
|
+
}
|
|
2477
|
+
console.log("Global OAuth token stored.");
|
|
2478
|
+
console.log("All wikis without per-wiki credentials will use this token.");
|
|
2479
|
+
}
|
|
2480
|
+
});
|
|
2481
|
+
|
|
2383
2482
|
// src/index.ts
|
|
2384
|
-
var program = new
|
|
2483
|
+
var program = new Command14();
|
|
2385
2484
|
program.name("memex").description("Isolated, queued claude -p runtime for persistent knowledge bases").version("0.1.0");
|
|
2386
2485
|
program.addCommand(serveCommand);
|
|
2387
2486
|
program.addCommand(createCommand);
|
|
@@ -2395,6 +2494,7 @@ program.addCommand(logsCommand);
|
|
|
2395
2494
|
program.addCommand(listCommand);
|
|
2396
2495
|
program.addCommand(chownCommand);
|
|
2397
2496
|
program.addCommand(statusCommand);
|
|
2497
|
+
program.addCommand(setupTokenCommand);
|
|
2398
2498
|
program.parseAsync().catch((err) => {
|
|
2399
2499
|
console.error(err.message ?? err);
|
|
2400
2500
|
process.exit(1);
|