cyrus-core 0.2.64-test.7 → 0.2.65-test.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/dist/agent-runner-types.d.ts +32 -10
- package/dist/agent-runner-types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/git-provider-token-store.d.ts +0 -39
- package/dist/git-provider-token-store.d.ts.map +0 -1
- package/dist/git-provider-token-store.js +0 -133
- package/dist/git-provider-token-store.js.map +0 -1
- package/dist/github-token-store.d.ts +0 -91
- package/dist/github-token-store.d.ts.map +0 -1
- package/dist/github-token-store.js +0 -168
- package/dist/github-token-store.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { HookCallbackMatcher, HookEvent, McpServerConfig, SDKMessage, SDKUserMessage, SdkPluginConfig } from "@anthropic-ai/claude-agent-sdk";
|
|
1
|
+
import type { BackgroundTaskSummary, HookCallbackMatcher, HookEvent, McpServerConfig, SDKMessage, SDKUserMessage, SdkPluginConfig, SessionCronSummary } from "@anthropic-ai/claude-agent-sdk";
|
|
2
2
|
import type { AskUserQuestionInput as SDKAskUserQuestionInput } from "@anthropic-ai/claude-agent-sdk/sdk-tools";
|
|
3
3
|
import type { ILogger } from "./logging/ILogger.js";
|
|
4
4
|
/**
|
|
@@ -7,6 +7,24 @@ import type { ILogger } from "./logging/ILogger.js";
|
|
|
7
7
|
* @see {@link https://platform.claude.com/docs/en/agent-sdk/typescript#ask-user-question}
|
|
8
8
|
*/
|
|
9
9
|
export type AskUserQuestionInput = SDKAskUserQuestionInput;
|
|
10
|
+
/**
|
|
11
|
+
* Work that will wake an agent session later, reported by the SDK's Stop
|
|
12
|
+
* hook (`session_crons` / `background_tasks` on `StopHookInput`). These are
|
|
13
|
+
* the only signals that distinguish "session is done" from "session is
|
|
14
|
+
* paused waiting to be woken" — the message stream itself (including the
|
|
15
|
+
* `result` message) carries no pending-work information. See the F1 test
|
|
16
|
+
* drive `2026-06-11-cypack-1310-schedulewakeup.md` for the evidence.
|
|
17
|
+
*/
|
|
18
|
+
export interface AgentPendingWork {
|
|
19
|
+
/**
|
|
20
|
+
* Session-scoped cron tasks (CronCreate, ScheduleWakeup, /loop) that will
|
|
21
|
+
* wake the session later. One-shot wakeups have `recurring: false` and a
|
|
22
|
+
* cron `schedule` encoding their single fire time.
|
|
23
|
+
*/
|
|
24
|
+
sessionCrons: SessionCronSummary[];
|
|
25
|
+
/** In-flight background work (running/pending + backgrounded tasks). */
|
|
26
|
+
backgroundTasks: BackgroundTaskSummary[];
|
|
27
|
+
}
|
|
10
28
|
/**
|
|
11
29
|
* Simplified option type for easier API consumption.
|
|
12
30
|
* Matches the structure within AskUserQuestionInput but without tuple constraints.
|
|
@@ -286,6 +304,16 @@ export interface IAgentRunner {
|
|
|
286
304
|
* `interrupt()` and `stop()`.
|
|
287
305
|
*/
|
|
288
306
|
isWarm?(): boolean;
|
|
307
|
+
/**
|
|
308
|
+
* Pending work that will wake this session later (scheduled wakeups,
|
|
309
|
+
* session crons, in-flight background tasks), as last reported by the
|
|
310
|
+
* SDK's Stop hook. Runners that support this return the latest snapshot;
|
|
311
|
+
* both arrays are empty when nothing is scheduled or in flight.
|
|
312
|
+
*
|
|
313
|
+
* Consult this when a `result` message arrives to decide whether the
|
|
314
|
+
* session is truly finished or merely paused until a wakeup fires.
|
|
315
|
+
*/
|
|
316
|
+
getPendingWork?(): AgentPendingWork;
|
|
289
317
|
/**
|
|
290
318
|
* Check if the session is currently running
|
|
291
319
|
*
|
|
@@ -394,13 +422,6 @@ export interface AgentRunnerConfig {
|
|
|
394
422
|
tools?: string[];
|
|
395
423
|
/** Cyrus home directory (required) */
|
|
396
424
|
cyrusHome: string;
|
|
397
|
-
/**
|
|
398
|
-
* Additional environment variables for the agent child process, merged on
|
|
399
|
-
* top of the inherited process env. Used for per-session credentials
|
|
400
|
-
* (e.g. org-matched GH_TOKEN) and sandbox CA cert paths. Currently only
|
|
401
|
-
* the Claude runner consumes this.
|
|
402
|
-
*/
|
|
403
|
-
additionalEnv?: Record<string, string>;
|
|
404
425
|
/**
|
|
405
426
|
* Custom directory path for Claude's auto-memory storage. Forwarded to the
|
|
406
427
|
* Claude SDK as settings.autoMemoryDirectory. When unset, the SDK falls
|
|
@@ -426,7 +447,8 @@ export interface AgentRunnerConfig {
|
|
|
426
447
|
* - `string[]`: enable only the listed skills.
|
|
427
448
|
*
|
|
428
449
|
* Used to enforce per-skill scope (repository / Linear team / Linear label).
|
|
429
|
-
*
|
|
450
|
+
* Claude passes this to its SDK; Codex uses it to stage only allowed skills
|
|
451
|
+
* into its native repository skill discovery layout.
|
|
430
452
|
*/
|
|
431
453
|
skills?: string[] | "all";
|
|
432
454
|
/**
|
|
@@ -497,5 +519,5 @@ export type AgentUserMessage = SDKUserMessage;
|
|
|
497
519
|
* from a single location (packages/core) without knowing the
|
|
498
520
|
* underlying provider SDK.
|
|
499
521
|
*/
|
|
500
|
-
export type { HookCallbackMatcher, HookEvent, McpServerConfig, SDKAssistantMessage, SDKAssistantMessageError, SDKMessage, SDKResultMessage, SDKUserMessage, } from "@anthropic-ai/claude-agent-sdk";
|
|
522
|
+
export type { BackgroundTaskSummary, HookCallbackMatcher, HookEvent, McpServerConfig, SDKAssistantMessage, SDKAssistantMessageError, SDKMessage, SDKResultMessage, SDKUserMessage, SessionCronSummary, } from "@anthropic-ai/claude-agent-sdk";
|
|
501
523
|
//# sourceMappingURL=agent-runner-types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-runner-types.d.ts","sourceRoot":"","sources":["../src/agent-runner-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,mBAAmB,EACnB,SAAS,EACT,eAAe,EACf,UAAU,EACV,cAAc,EACd,eAAe,EACf,MAAM,gCAAgC,CAAC;AAGxC,OAAO,KAAK,EAAE,oBAAoB,IAAI,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AAChH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AASpD;;;;GAIG;AACH,MAAM,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-runner-types.d.ts","sourceRoot":"","sources":["../src/agent-runner-types.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,17 +2,13 @@ export type { ErrorReporter, ErrorReporterContext, ErrorReporterLogAttributes, E
|
|
|
2
2
|
export { getGlobalErrorReporter, getGlobalErrorTags, NoopErrorReporter, resetGlobalErrorReporter, setGlobalErrorReporter, setGlobalErrorTags, } from "./error-reporting/index.js";
|
|
3
3
|
export type { ILogger, LogContext, LogEventAttributes, } from "./logging/index.js";
|
|
4
4
|
export { createLogger, LogLevel } from "./logging/index.js";
|
|
5
|
-
export type { AgentMessage, AgentRunnerConfig, AgentSessionInfo, AgentUserMessage, AskUserQuestion, AskUserQuestionAnswers, AskUserQuestionInput, AskUserQuestionOption, AskUserQuestionResult, HookCallbackMatcher, HookEvent, IAgentRunner, IMessageFormatter, McpServerConfig, OnAskUserQuestion, SDKAssistantMessage, SDKAssistantMessageError, SDKMessage, SDKResultMessage, SDKUserMessage, } from "./agent-runner-types.js";
|
|
5
|
+
export type { AgentMessage, AgentPendingWork, AgentRunnerConfig, AgentSessionInfo, AgentUserMessage, AskUserQuestion, AskUserQuestionAnswers, AskUserQuestionInput, AskUserQuestionOption, AskUserQuestionResult, BackgroundTaskSummary, HookCallbackMatcher, HookEvent, IAgentRunner, IMessageFormatter, McpServerConfig, OnAskUserQuestion, SDKAssistantMessage, SDKAssistantMessageError, SDKMessage, SDKResultMessage, SDKUserMessage, SessionCronSummary, } from "./agent-runner-types.js";
|
|
6
6
|
export type { AllowedToolsPlatform } from "./allowed-tools-defaults.js";
|
|
7
7
|
export { GITHUB_DEFAULT_ALLOWED_TOOLS, getDefaultAllowedTools, LINEAR_DEFAULT_ALLOWED_TOOLS, SLACK_DEFAULT_ALLOWED_TOOLS, } from "./allowed-tools-defaults.js";
|
|
8
8
|
export type { BaseBranchResolution, CyrusAgentSession, CyrusAgentSessionEntry, IssueContext, IssueMinimal, RepositoryContext, Workspace, } from "./CyrusAgentSession.js";
|
|
9
9
|
export type { EdgeConfig, EdgeConfigPayload, EdgeWorkerConfig, LinearWorkspaceConfig, NetworkPolicy, OAuthCallbackHandler, RepositoryConfig, RepositoryConfigPayload, RunnerType, SandboxConfig, UserAccessControlConfig, UserIdentifier, } from "./config-types.js";
|
|
10
10
|
export { EdgeConfigPayloadSchema, EdgeConfigSchema, LinearWorkspaceConfigSchema, migrateEdgeConfig, NetworkPolicySchema, RepositoryConfigPayloadSchema, RepositoryConfigSchema, RunnerTypeSchema, requireLinearWorkspaceId, resolvePath, SandboxConfigSchema, TRUSTED_DOMAINS, UserAccessControlConfigSchema, UserIdentifierSchema, } from "./config-types.js";
|
|
11
11
|
export { DEFAULT_BASE_BRANCH, DEFAULT_CONFIG_FILENAME, DEFAULT_PROXY_URL, DEFAULT_REPOS_DIR, DEFAULT_WORKTREES_DIR, getDefaultReposDir, getDefaultWorktreesDir, } from "./constants.js";
|
|
12
|
-
export type { GitProvider, GitProviderToken, GitProviderTokensFile, } from "./git-provider-token-store.js";
|
|
13
|
-
export { extractGitProviderRepoParts, GIT_PROVIDER_TOKENS_FILENAME, GitProviderTokenStore, } from "./git-provider-token-store.js";
|
|
14
|
-
export type { GitHubInstallationToken, GitHubTokensFile, } from "./github-token-store.js";
|
|
15
|
-
export { extractOwnerFromGitHubUrl, GITHUB_TOKENS_FILENAME, GitHubTokenStore, } from "./github-token-store.js";
|
|
16
12
|
export type { AgentActivity, AgentActivityContent, AgentActivityCreateInput, AgentActivityPayload, AgentActivitySDK, AgentEvent, AgentEventTransportConfig, AgentEventTransportEvents, AgentSession, AgentSessionCreatedWebhook, AgentSessionCreateOnCommentInput, AgentSessionCreateOnIssueInput, AgentSessionCreateResponse, AgentSessionPromptedWebhook, AgentSessionSDK, Comment, CommentCreateInput, CommentWithAttachments, Connection, FetchChildrenOptions, FileUploadRequest, FileUploadResponse, GuidanceRule, IAgentEventTransport, IIssueTrackerService, Issue, IssueDeletedWebhook, IssueRelation, IssueStateChangeWebhook, IssueUnassignedWebhook, IssueUpdateInput, IssueUpdateWebhook, IssueWithChildren, Label, PaginationOptions, Team, User, Webhook, WebhookAgentSession, WebhookComment, WebhookIssue, WorkflowState, } from "./issue-tracker/index.js";
|
|
17
13
|
export { AgentActivityContentType, AgentActivitySignal, AgentSessionStatus, AgentSessionType, CLIEventTransport, CLIIssueTrackerService, CLIRPCServer, isAgentSessionCreatedEvent, isAgentSessionCreatedWebhook, isAgentSessionPromptedEvent, isAgentSessionPromptedWebhook, isCommentMentionEvent, isIssueAssignedEvent, isIssueAssignedWebhook, isIssueCommentMentionWebhook, isIssueDeletedWebhook, isIssueNewCommentWebhook, isIssueStateChangeWebhook, isIssueStateIdUpdateWebhook, isIssueTitleOrDescriptionUpdateWebhook, isIssueUnassignedEvent, isIssueUnassignedWebhook, isNewCommentEvent, } from "./issue-tracker/index.js";
|
|
18
14
|
export type { ContentChanges, ContentUpdateMessage, GitHubPlatformRef, GitHubSessionStartPlatformData, GitHubUserPromptPlatformData, GitLabPlatformRef, GitLabSessionStartPlatformData, GitLabUserPromptPlatformData, GuidanceItem, IMessageTranslator, InternalMessage, InternalMessageBase, IssueStateChangeMessage, LinearContentUpdatePlatformData, LinearIssueStateChangePlatformData, LinearPlatformRef, LinearSessionStartPlatformData, LinearStopSignalPlatformData, LinearUnassignPlatformData, LinearUserPromptPlatformData, MessageAction, MessageAuthor, MessageSource, SessionStartMessage, SlackPlatformRef, SlackSessionStartPlatformData, SlackUserPromptPlatformData, StopSignalMessage, TranslationContext, TranslationResult, UnassignMessage, UserPromptMessage, } from "./messages/index.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,YAAY,EACX,aAAa,EACb,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACX,OAAO,EACP,UAAU,EACV,kBAAkB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAO5D,YAAY,EACX,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,UAAU,EACV,gBAAgB,EAChB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -7,8 +7,6 @@ export { EdgeConfigPayloadSchema,
|
|
|
7
7
|
EdgeConfigSchema, LinearWorkspaceConfigSchema, migrateEdgeConfig, NetworkPolicySchema, RepositoryConfigPayloadSchema, RepositoryConfigSchema, RunnerTypeSchema, requireLinearWorkspaceId, resolvePath, SandboxConfigSchema, TRUSTED_DOMAINS, UserAccessControlConfigSchema, UserIdentifierSchema, } from "./config-types.js";
|
|
8
8
|
// Constants
|
|
9
9
|
export { DEFAULT_BASE_BRANCH, DEFAULT_CONFIG_FILENAME, DEFAULT_PROXY_URL, DEFAULT_REPOS_DIR, DEFAULT_WORKTREES_DIR, getDefaultReposDir, getDefaultWorktreesDir, } from "./constants.js";
|
|
10
|
-
export { extractGitProviderRepoParts, GIT_PROVIDER_TOKENS_FILENAME, GitProviderTokenStore, } from "./git-provider-token-store.js";
|
|
11
|
-
export { extractOwnerFromGitHubUrl, GITHUB_TOKENS_FILENAME, GitHubTokenStore, } from "./github-token-store.js";
|
|
12
10
|
export { AgentActivityContentType, AgentActivitySignal, AgentSessionStatus, AgentSessionType, CLIEventTransport, CLIIssueTrackerService, CLIRPCServer, isAgentSessionCreatedEvent, isAgentSessionCreatedWebhook, isAgentSessionPromptedEvent, isAgentSessionPromptedWebhook, isCommentMentionEvent, isIssueAssignedEvent, isIssueAssignedWebhook, isIssueCommentMentionWebhook, isIssueDeletedWebhook, isIssueNewCommentWebhook, isIssueStateChangeWebhook, isIssueStateIdUpdateWebhook, isIssueTitleOrDescriptionUpdateWebhook, isIssueUnassignedEvent, isIssueUnassignedWebhook, isNewCommentEvent, } from "./issue-tracker/index.js";
|
|
13
11
|
export { hasGitHubSessionStartPlatformData, hasGitHubUserPromptPlatformData, hasGitLabSessionStartPlatformData, hasGitLabUserPromptPlatformData, hasLinearSessionStartPlatformData, hasLinearUserPromptPlatformData, hasSlackSessionStartPlatformData, hasSlackUserPromptPlatformData, isContentUpdateMessage, isGitHubMessage, isGitLabMessage, isIssueStateChangeMessage, isLinearMessage, isSessionStartMessage, isSlackMessage, isStopSignalMessage, isUnassignMessage, isUserPromptMessage, } from "./messages/index.js";
|
|
14
12
|
export { PERSISTENCE_VERSION, PersistenceManager, } from "./PersistenceManager.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,UAAU;AAUV,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,UAAU;AAUV,OAAO,EACN,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,4BAA4B,CAAC;AAMpC,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAmC5D,OAAO,EACN,4BAA4B,EAC5B,sBAAsB,EACtB,4BAA4B,EAC5B,2BAA2B,GAC3B,MAAM,6BAA6B,CAAC;AAyBrC,OAAO,EACN,uBAAuB;AACvB,qCAAqC;AACrC,gBAAgB,EAChB,2BAA2B,EAC3B,iBAAiB,EACjB,mBAAmB,EACnB,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,wBAAwB,EACxB,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,6BAA6B,EAC7B,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,YAAY;AACZ,OAAO,EACN,mBAAmB,EACnB,uBAAuB,EACvB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,GACtB,MAAM,gBAAgB,CAAC;AA8CxB,OAAO,EACN,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EACZ,0BAA0B,EAC1B,4BAA4B,EAC5B,2BAA2B,EAC3B,6BAA6B,EAC7B,qBAAqB,EACrB,oBAAoB,EACpB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,wBAAwB,EACxB,yBAAyB,EACzB,2BAA2B,EAC3B,sCAAsC,EACtC,sBAAsB,EACtB,wBAAwB,EACxB,iBAAiB,GACjB,MAAM,0BAA0B,CAAC;AAoClC,OAAO,EACN,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,EACjC,+BAA+B,EAC/B,iCAAiC,EACjC,+BAA+B,EAC/B,gCAAgC,EAChC,8BAA8B,EAC9B,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EACN,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAKvD,wBAAwB;AACxB,OAAO,EACN,6BAA6B,EAC7B,oBAAoB,EACpB,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,GAClB,MAAM,qBAAqB,CAAC;AAS7B,uEAAuE;AACvE,yFAAyF;AACzF,gGAAgG"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cyrus-core",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.65-test.0",
|
|
4
4
|
"description": "Core business logic for Cyrus",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"schemas"
|
|
11
11
|
],
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@anthropic-ai/claude-agent-sdk": "0.3.
|
|
13
|
+
"@anthropic-ai/claude-agent-sdk": "0.3.175",
|
|
14
14
|
"@linear/sdk": "^64.0.0",
|
|
15
15
|
"zod": "^4.3.6"
|
|
16
16
|
},
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
export type GitProvider = "github" | "gitlab";
|
|
2
|
-
export interface GitProviderToken {
|
|
3
|
-
provider: GitProvider;
|
|
4
|
-
/** Hostname that owns the token, e.g. github.com or gitlab.example.com */
|
|
5
|
-
host: string;
|
|
6
|
-
/** Owner/group namespace used for path matching when present */
|
|
7
|
-
namespace: string | null;
|
|
8
|
-
/** Optional provider connection identifier from cyrus-hosted */
|
|
9
|
-
connectionId?: string | null;
|
|
10
|
-
/** Access token used for HTTPS git/API calls */
|
|
11
|
-
token: string;
|
|
12
|
-
/** ISO timestamp when the token expires. Null means non-expiring PAT/bot token. */
|
|
13
|
-
expiresAt: string | null;
|
|
14
|
-
/** Username to return to git. GitLab accepts oauth2 for OAuth tokens. */
|
|
15
|
-
username?: string | null;
|
|
16
|
-
}
|
|
17
|
-
export interface GitProviderTokensFile {
|
|
18
|
-
version: 1;
|
|
19
|
-
updatedAt: string;
|
|
20
|
-
tokens: GitProviderToken[];
|
|
21
|
-
}
|
|
22
|
-
export declare const GIT_PROVIDER_TOKENS_FILENAME = "git-provider-tokens.json";
|
|
23
|
-
export declare function extractGitProviderRepoParts(url: string): {
|
|
24
|
-
host: string;
|
|
25
|
-
namespace: string | null;
|
|
26
|
-
} | null;
|
|
27
|
-
export declare class GitProviderTokenStore {
|
|
28
|
-
private cyrusHome;
|
|
29
|
-
private cachedTokens;
|
|
30
|
-
private cachedMtimeMs;
|
|
31
|
-
private cachedSize;
|
|
32
|
-
constructor(cyrusHome: string);
|
|
33
|
-
get filePath(): string;
|
|
34
|
-
save(tokens: GitProviderToken[]): void;
|
|
35
|
-
load(): GitProviderToken[];
|
|
36
|
-
private loadValid;
|
|
37
|
-
getTokenForRepoUrl(url: string, provider?: GitProvider): GitProviderToken | undefined;
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=git-provider-token-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-provider-token-store.d.ts","sourceRoot":"","sources":["../src/git-provider-token-store.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9C,MAAM,WAAW,gBAAgB;IAChC,QAAQ,EAAE,WAAW,CAAC;IACtB,0EAA0E;IAC1E,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,gEAAgE;IAChE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,mFAAmF;IACnF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yEAAyE;IACzE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACrC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,4BAA4B,6BAA6B,CAAC;AAmBvE,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,GAAG;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB,GAAG,IAAI,CA+BP;AAED,qBAAa,qBAAqB;IACjC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,SAAS,EAAE,MAAM;IAI7B,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,IAAI;IAiBtC,IAAI,IAAI,gBAAgB,EAAE;IAyC1B,OAAO,CAAC,SAAS;IAKjB,kBAAkB,CACjB,GAAG,EAAE,MAAM,EACX,QAAQ,CAAC,EAAE,WAAW,GACpB,gBAAgB,GAAG,SAAS;CAyB/B"}
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
export const GIT_PROVIDER_TOKENS_FILENAME = "git-provider-tokens.json";
|
|
4
|
-
function normalizeHost(host) {
|
|
5
|
-
return host.trim().toLowerCase();
|
|
6
|
-
}
|
|
7
|
-
function normalizeNamespace(namespace) {
|
|
8
|
-
const value = namespace?.trim().replace(/^\/+|\/+$/g, "");
|
|
9
|
-
return value ? value.toLowerCase() : null;
|
|
10
|
-
}
|
|
11
|
-
function isExpired(token, now) {
|
|
12
|
-
if (!token.expiresAt)
|
|
13
|
-
return false;
|
|
14
|
-
const expiresAt = Date.parse(token.expiresAt);
|
|
15
|
-
return Number.isNaN(expiresAt) || expiresAt <= now;
|
|
16
|
-
}
|
|
17
|
-
export function extractGitProviderRepoParts(url) {
|
|
18
|
-
if (!url || typeof url !== "string")
|
|
19
|
-
return null;
|
|
20
|
-
const trimmed = url.trim();
|
|
21
|
-
const scpMatch = trimmed.match(/^[\w.-]+@([^:]+):(.+)$/);
|
|
22
|
-
if (scpMatch?.[1] && scpMatch[2]) {
|
|
23
|
-
const segments = scpMatch[2].replace(/\.git$/i, "").split("/");
|
|
24
|
-
segments.pop();
|
|
25
|
-
return {
|
|
26
|
-
host: normalizeHost(scpMatch[1]),
|
|
27
|
-
namespace: normalizeNamespace(segments.join("/")),
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
|
|
31
|
-
? trimmed
|
|
32
|
-
: `https://${trimmed}`;
|
|
33
|
-
try {
|
|
34
|
-
const parsed = new URL(withScheme);
|
|
35
|
-
const segments = parsed.pathname
|
|
36
|
-
.replace(/\.git$/i, "")
|
|
37
|
-
.split("/")
|
|
38
|
-
.filter(Boolean);
|
|
39
|
-
segments.pop();
|
|
40
|
-
return {
|
|
41
|
-
host: normalizeHost(parsed.hostname),
|
|
42
|
-
namespace: normalizeNamespace(segments.join("/")),
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
export class GitProviderTokenStore {
|
|
50
|
-
cyrusHome;
|
|
51
|
-
cachedTokens = null;
|
|
52
|
-
cachedMtimeMs = null;
|
|
53
|
-
cachedSize = null;
|
|
54
|
-
constructor(cyrusHome) {
|
|
55
|
-
this.cyrusHome = cyrusHome;
|
|
56
|
-
}
|
|
57
|
-
get filePath() {
|
|
58
|
-
return join(this.cyrusHome, GIT_PROVIDER_TOKENS_FILENAME);
|
|
59
|
-
}
|
|
60
|
-
save(tokens) {
|
|
61
|
-
const file = {
|
|
62
|
-
version: 1,
|
|
63
|
-
updatedAt: new Date().toISOString(),
|
|
64
|
-
tokens,
|
|
65
|
-
};
|
|
66
|
-
const target = this.filePath;
|
|
67
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
68
|
-
const tmpPath = `${target}.tmp`;
|
|
69
|
-
writeFileSync(tmpPath, JSON.stringify(file, null, 2), { mode: 0o600 });
|
|
70
|
-
chmodSync(tmpPath, 0o600);
|
|
71
|
-
renameSync(tmpPath, target);
|
|
72
|
-
this.cachedTokens = null;
|
|
73
|
-
this.cachedMtimeMs = null;
|
|
74
|
-
this.cachedSize = null;
|
|
75
|
-
}
|
|
76
|
-
load() {
|
|
77
|
-
const target = this.filePath;
|
|
78
|
-
if (!existsSync(target)) {
|
|
79
|
-
this.cachedTokens = null;
|
|
80
|
-
this.cachedMtimeMs = null;
|
|
81
|
-
this.cachedSize = null;
|
|
82
|
-
return [];
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
const stat = statSync(target);
|
|
86
|
-
if (this.cachedTokens !== null &&
|
|
87
|
-
this.cachedMtimeMs === stat.mtimeMs &&
|
|
88
|
-
this.cachedSize === stat.size) {
|
|
89
|
-
return this.cachedTokens;
|
|
90
|
-
}
|
|
91
|
-
const parsed = JSON.parse(readFileSync(target, "utf-8"));
|
|
92
|
-
const tokens = Array.isArray(parsed.tokens)
|
|
93
|
-
? parsed.tokens.filter((t) => !!t &&
|
|
94
|
-
typeof t === "object" &&
|
|
95
|
-
(t.provider === "github" || t.provider === "gitlab") &&
|
|
96
|
-
typeof t.host === "string" &&
|
|
97
|
-
typeof t.token === "string")
|
|
98
|
-
: [];
|
|
99
|
-
this.cachedTokens = tokens;
|
|
100
|
-
this.cachedMtimeMs = stat.mtimeMs;
|
|
101
|
-
this.cachedSize = stat.size;
|
|
102
|
-
return tokens;
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
return [];
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
loadValid() {
|
|
109
|
-
const now = Date.now();
|
|
110
|
-
return this.load().filter((t) => !isExpired(t, now));
|
|
111
|
-
}
|
|
112
|
-
getTokenForRepoUrl(url, provider) {
|
|
113
|
-
const parts = extractGitProviderRepoParts(url);
|
|
114
|
-
if (!parts)
|
|
115
|
-
return undefined;
|
|
116
|
-
const host = normalizeHost(parts.host);
|
|
117
|
-
const namespace = normalizeNamespace(parts.namespace);
|
|
118
|
-
const candidates = this.loadValid().filter((t) => normalizeHost(t.host) === host &&
|
|
119
|
-
(!provider || t.provider === provider));
|
|
120
|
-
if (namespace) {
|
|
121
|
-
const match = candidates.find((t) => {
|
|
122
|
-
const tokenNamespace = normalizeNamespace(t.namespace);
|
|
123
|
-
return (tokenNamespace !== null &&
|
|
124
|
-
(namespace === tokenNamespace ||
|
|
125
|
-
namespace.startsWith(`${tokenNamespace}/`)));
|
|
126
|
-
});
|
|
127
|
-
if (match)
|
|
128
|
-
return match;
|
|
129
|
-
}
|
|
130
|
-
return candidates.length === 1 ? candidates[0] : undefined;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
//# sourceMappingURL=git-provider-token-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"git-provider-token-store.js","sourceRoot":"","sources":["../src/git-provider-token-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A short-lived GitHub App installation token pushed by cyrus-hosted.
|
|
3
|
-
* One entry per GitHub App installation (org or user account) the team
|
|
4
|
-
* has attached.
|
|
5
|
-
*/
|
|
6
|
-
export interface GitHubInstallationToken {
|
|
7
|
-
/** GitHub App installation ID this token was minted for */
|
|
8
|
-
installationId: string;
|
|
9
|
-
/** Org/user login the installation belongs to (e.g. "ceedaragents") */
|
|
10
|
-
organization: string | null;
|
|
11
|
-
/** GitHub account type of the installation target */
|
|
12
|
-
accountType: "Organization" | "User" | null;
|
|
13
|
-
/** Short-lived installation access token */
|
|
14
|
-
token: string;
|
|
15
|
-
/** ISO timestamp when the token expires */
|
|
16
|
-
expiresAt: string;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* On-disk shape of `<cyrusHome>/github-tokens.json`.
|
|
20
|
-
*/
|
|
21
|
-
export interface GitHubTokensFile {
|
|
22
|
-
version: 1;
|
|
23
|
-
updatedAt: string;
|
|
24
|
-
tokens: GitHubInstallationToken[];
|
|
25
|
-
}
|
|
26
|
-
/** Filename of the token store inside the Cyrus home directory */
|
|
27
|
-
export declare const GITHUB_TOKENS_FILENAME = "github-tokens.json";
|
|
28
|
-
/**
|
|
29
|
-
* Extract the owner (org or user login) from a GitHub repository URL.
|
|
30
|
-
* Supports:
|
|
31
|
-
* - https://github.com/owner/name and https://github.com/owner/name.git
|
|
32
|
-
* - git@github.com:owner/name.git
|
|
33
|
-
* - ssh://git@github.com/owner/name.git
|
|
34
|
-
* - github.com/owner/name (no scheme)
|
|
35
|
-
*
|
|
36
|
-
* Returns null for non-GitHub hosts or unparseable URLs.
|
|
37
|
-
*/
|
|
38
|
-
export declare function extractOwnerFromGitHubUrl(url: string): string | null;
|
|
39
|
-
/**
|
|
40
|
-
* Persistent store for per-installation GitHub App tokens, keyed by org.
|
|
41
|
-
*
|
|
42
|
-
* Tokens are pushed by cyrus-hosted via the `/api/update/github-tokens`
|
|
43
|
-
* ConfigUpdater route and consumed lazily by the EdgeWorker (token
|
|
44
|
-
* resolution, session env) and by the git credential helper script.
|
|
45
|
-
*
|
|
46
|
-
* Reads are cached on file mtime+size, so frequent lookups don't re-parse
|
|
47
|
-
* the JSON while still picking up writes from the ConfigUpdater handler
|
|
48
|
-
* (which runs in the same process but writes via this class too) or any
|
|
49
|
-
* external writer.
|
|
50
|
-
*/
|
|
51
|
-
export declare class GitHubTokenStore {
|
|
52
|
-
private cyrusHome;
|
|
53
|
-
private cachedTokens;
|
|
54
|
-
private cachedMtimeMs;
|
|
55
|
-
private cachedSize;
|
|
56
|
-
constructor(cyrusHome: string);
|
|
57
|
-
/** Absolute path of the token store file */
|
|
58
|
-
get filePath(): string;
|
|
59
|
-
/**
|
|
60
|
-
* Atomically persist the given tokens (write to a temp file, then rename)
|
|
61
|
-
* with owner-only permissions (0600).
|
|
62
|
-
*/
|
|
63
|
-
save(tokens: GitHubInstallationToken[]): void;
|
|
64
|
-
/**
|
|
65
|
-
* Load all tokens from disk (including expired ones). Returns an empty
|
|
66
|
-
* array when the file is missing or unreadable/corrupt.
|
|
67
|
-
*/
|
|
68
|
-
load(): GitHubInstallationToken[];
|
|
69
|
-
/**
|
|
70
|
-
* All non-expired tokens currently on disk.
|
|
71
|
-
*/
|
|
72
|
-
private loadValid;
|
|
73
|
-
/**
|
|
74
|
-
* Return the non-expired token for the given org (case-insensitive),
|
|
75
|
-
* or undefined when no installation matches.
|
|
76
|
-
*/
|
|
77
|
-
getTokenForOrg(org: string): string | undefined;
|
|
78
|
-
/**
|
|
79
|
-
* Return the non-expired token for the owner of the given GitHub
|
|
80
|
-
* repository URL (https or ssh form), or undefined when the URL is not
|
|
81
|
-
* a GitHub URL or no installation matches the owner.
|
|
82
|
-
*/
|
|
83
|
-
getTokenForRepoUrl(url: string): string | undefined;
|
|
84
|
-
/**
|
|
85
|
-
* When exactly one non-expired token exists, return it (covers
|
|
86
|
-
* single-installation teams where the org name may not match, e.g.
|
|
87
|
-
* user-account installs). Otherwise undefined.
|
|
88
|
-
*/
|
|
89
|
-
getFallbackToken(): string | undefined;
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=github-token-store.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-token-store.d.ts","sourceRoot":"","sources":["../src/github-token-store.ts"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACvC,2DAA2D;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qDAAqD;IACrD,WAAW,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5C,4CAA4C;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,OAAO,EAAE,CAAC,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAED,kEAAkE;AAClE,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAE3D;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBpE;AAWD;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAgB;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,YAAY,CAA0C;IAC9D,OAAO,CAAC,aAAa,CAAuB;IAC5C,OAAO,CAAC,UAAU,CAAuB;gBAE7B,SAAS,EAAE,MAAM;IAI7B,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,uBAAuB,EAAE,GAAG,IAAI;IAoB7C;;;OAGG;IACH,IAAI,IAAI,uBAAuB,EAAE;IAqCjC;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAW/C;;;;OAIG;IACH,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAMnD;;;;OAIG;IACH,gBAAgB,IAAI,MAAM,GAAG,SAAS;CAItC"}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, statSync, writeFileSync, } from "node:fs";
|
|
2
|
-
import { dirname, join } from "node:path";
|
|
3
|
-
/** Filename of the token store inside the Cyrus home directory */
|
|
4
|
-
export const GITHUB_TOKENS_FILENAME = "github-tokens.json";
|
|
5
|
-
/**
|
|
6
|
-
* Extract the owner (org or user login) from a GitHub repository URL.
|
|
7
|
-
* Supports:
|
|
8
|
-
* - https://github.com/owner/name and https://github.com/owner/name.git
|
|
9
|
-
* - git@github.com:owner/name.git
|
|
10
|
-
* - ssh://git@github.com/owner/name.git
|
|
11
|
-
* - github.com/owner/name (no scheme)
|
|
12
|
-
*
|
|
13
|
-
* Returns null for non-GitHub hosts or unparseable URLs.
|
|
14
|
-
*/
|
|
15
|
-
export function extractOwnerFromGitHubUrl(url) {
|
|
16
|
-
if (!url || typeof url !== "string")
|
|
17
|
-
return null;
|
|
18
|
-
const trimmed = url.trim();
|
|
19
|
-
// SCP-like SSH form: git@github.com:owner/name.git
|
|
20
|
-
const scpMatch = trimmed.match(/^[\w.-]+@github\.com:(.+)$/i);
|
|
21
|
-
if (scpMatch?.[1]) {
|
|
22
|
-
const owner = scpMatch[1].split("/")[0];
|
|
23
|
-
return owner ? owner : null;
|
|
24
|
-
}
|
|
25
|
-
// URL forms (https://, ssh://, or scheme-less)
|
|
26
|
-
const withScheme = /^[a-z][a-z0-9+.-]*:\/\//i.test(trimmed)
|
|
27
|
-
? trimmed
|
|
28
|
-
: `https://${trimmed}`;
|
|
29
|
-
try {
|
|
30
|
-
const parsed = new URL(withScheme);
|
|
31
|
-
if (parsed.hostname.toLowerCase() !== "github.com")
|
|
32
|
-
return null;
|
|
33
|
-
const segments = parsed.pathname.split("/").filter(Boolean);
|
|
34
|
-
const owner = segments[0];
|
|
35
|
-
return owner ? owner : null;
|
|
36
|
-
}
|
|
37
|
-
catch {
|
|
38
|
-
return null;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Returns true when the token is missing an expiry, the expiry is
|
|
43
|
-
* unparseable, or the expiry is in the past.
|
|
44
|
-
*/
|
|
45
|
-
function isExpired(token, now) {
|
|
46
|
-
const expiresAt = Date.parse(token.expiresAt);
|
|
47
|
-
return Number.isNaN(expiresAt) || expiresAt <= now;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Persistent store for per-installation GitHub App tokens, keyed by org.
|
|
51
|
-
*
|
|
52
|
-
* Tokens are pushed by cyrus-hosted via the `/api/update/github-tokens`
|
|
53
|
-
* ConfigUpdater route and consumed lazily by the EdgeWorker (token
|
|
54
|
-
* resolution, session env) and by the git credential helper script.
|
|
55
|
-
*
|
|
56
|
-
* Reads are cached on file mtime+size, so frequent lookups don't re-parse
|
|
57
|
-
* the JSON while still picking up writes from the ConfigUpdater handler
|
|
58
|
-
* (which runs in the same process but writes via this class too) or any
|
|
59
|
-
* external writer.
|
|
60
|
-
*/
|
|
61
|
-
export class GitHubTokenStore {
|
|
62
|
-
cyrusHome;
|
|
63
|
-
cachedTokens = null;
|
|
64
|
-
cachedMtimeMs = null;
|
|
65
|
-
cachedSize = null;
|
|
66
|
-
constructor(cyrusHome) {
|
|
67
|
-
this.cyrusHome = cyrusHome;
|
|
68
|
-
}
|
|
69
|
-
/** Absolute path of the token store file */
|
|
70
|
-
get filePath() {
|
|
71
|
-
return join(this.cyrusHome, GITHUB_TOKENS_FILENAME);
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Atomically persist the given tokens (write to a temp file, then rename)
|
|
75
|
-
* with owner-only permissions (0600).
|
|
76
|
-
*/
|
|
77
|
-
save(tokens) {
|
|
78
|
-
const file = {
|
|
79
|
-
version: 1,
|
|
80
|
-
updatedAt: new Date().toISOString(),
|
|
81
|
-
tokens,
|
|
82
|
-
};
|
|
83
|
-
const target = this.filePath;
|
|
84
|
-
mkdirSync(dirname(target), { recursive: true });
|
|
85
|
-
const tmpPath = `${target}.tmp`;
|
|
86
|
-
writeFileSync(tmpPath, JSON.stringify(file, null, 2), { mode: 0o600 });
|
|
87
|
-
// writeFileSync `mode` only applies on creation — enforce on overwrite too
|
|
88
|
-
chmodSync(tmpPath, 0o600);
|
|
89
|
-
renameSync(tmpPath, target);
|
|
90
|
-
// Invalidate the read cache so the next load reflects this write even
|
|
91
|
-
// if the rename lands within the same mtime granularity window.
|
|
92
|
-
this.cachedTokens = null;
|
|
93
|
-
this.cachedMtimeMs = null;
|
|
94
|
-
this.cachedSize = null;
|
|
95
|
-
}
|
|
96
|
-
/**
|
|
97
|
-
* Load all tokens from disk (including expired ones). Returns an empty
|
|
98
|
-
* array when the file is missing or unreadable/corrupt.
|
|
99
|
-
*/
|
|
100
|
-
load() {
|
|
101
|
-
const target = this.filePath;
|
|
102
|
-
if (!existsSync(target)) {
|
|
103
|
-
this.cachedTokens = null;
|
|
104
|
-
this.cachedMtimeMs = null;
|
|
105
|
-
this.cachedSize = null;
|
|
106
|
-
return [];
|
|
107
|
-
}
|
|
108
|
-
try {
|
|
109
|
-
const stat = statSync(target);
|
|
110
|
-
if (this.cachedTokens !== null &&
|
|
111
|
-
this.cachedMtimeMs === stat.mtimeMs &&
|
|
112
|
-
this.cachedSize === stat.size) {
|
|
113
|
-
return this.cachedTokens;
|
|
114
|
-
}
|
|
115
|
-
const parsed = JSON.parse(readFileSync(target, "utf-8"));
|
|
116
|
-
const tokens = Array.isArray(parsed.tokens)
|
|
117
|
-
? parsed.tokens.filter((t) => !!t && typeof t === "object" && typeof t.token === "string")
|
|
118
|
-
: [];
|
|
119
|
-
this.cachedTokens = tokens;
|
|
120
|
-
this.cachedMtimeMs = stat.mtimeMs;
|
|
121
|
-
this.cachedSize = stat.size;
|
|
122
|
-
return tokens;
|
|
123
|
-
}
|
|
124
|
-
catch {
|
|
125
|
-
return [];
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* All non-expired tokens currently on disk.
|
|
130
|
-
*/
|
|
131
|
-
loadValid() {
|
|
132
|
-
const now = Date.now();
|
|
133
|
-
return this.load().filter((t) => !isExpired(t, now));
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Return the non-expired token for the given org (case-insensitive),
|
|
137
|
-
* or undefined when no installation matches.
|
|
138
|
-
*/
|
|
139
|
-
getTokenForOrg(org) {
|
|
140
|
-
if (!org)
|
|
141
|
-
return undefined;
|
|
142
|
-
const lowered = org.toLowerCase();
|
|
143
|
-
const match = this.loadValid().find((t) => typeof t.organization === "string" &&
|
|
144
|
-
t.organization.toLowerCase() === lowered);
|
|
145
|
-
return match?.token;
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Return the non-expired token for the owner of the given GitHub
|
|
149
|
-
* repository URL (https or ssh form), or undefined when the URL is not
|
|
150
|
-
* a GitHub URL or no installation matches the owner.
|
|
151
|
-
*/
|
|
152
|
-
getTokenForRepoUrl(url) {
|
|
153
|
-
const owner = extractOwnerFromGitHubUrl(url);
|
|
154
|
-
if (!owner)
|
|
155
|
-
return undefined;
|
|
156
|
-
return this.getTokenForOrg(owner);
|
|
157
|
-
}
|
|
158
|
-
/**
|
|
159
|
-
* When exactly one non-expired token exists, return it (covers
|
|
160
|
-
* single-installation teams where the org name may not match, e.g.
|
|
161
|
-
* user-account installs). Otherwise undefined.
|
|
162
|
-
*/
|
|
163
|
-
getFallbackToken() {
|
|
164
|
-
const valid = this.loadValid();
|
|
165
|
-
return valid.length === 1 ? valid[0]?.token : undefined;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=github-token-store.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"github-token-store.js","sourceRoot":"","sources":["../src/github-token-store.ts"],"names":[],"mappings":"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"}
|