@pikku/core 0.12.3 → 0.12.4
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/CHANGELOG.md +6 -0
- package/dist/services/in-memory-workflow-service.d.ts +15 -2
- package/dist/services/in-memory-workflow-service.js +49 -0
- package/lcov.info +18891 -0
- package/package.json +1 -1
- package/src/crypto-utils.test.ts +0 -214
- package/src/crypto-utils.ts +0 -213
- package/src/errors/error-handler.ts +0 -62
- package/src/errors/error.test.ts +0 -195
- package/src/errors/errors.ts +0 -374
- package/src/errors/index.ts +0 -2
- package/src/factory-functions.test.ts +0 -109
- package/src/function/function-runner.test.ts +0 -536
- package/src/function/function-runner.ts +0 -365
- package/src/function/functions.types.ts +0 -304
- package/src/function/index.ts +0 -5
- package/src/handle-error.test.ts +0 -424
- package/src/handle-error.ts +0 -69
- package/src/index.ts +0 -118
- package/src/internal.ts +0 -6
- package/src/middleware/auth-apikey.test.ts +0 -363
- package/src/middleware/auth-apikey.ts +0 -47
- package/src/middleware/auth-bearer.test.ts +0 -450
- package/src/middleware/auth-bearer.ts +0 -72
- package/src/middleware/auth-cookie.test.ts +0 -528
- package/src/middleware/auth-cookie.ts +0 -80
- package/src/middleware/cors.test.ts +0 -424
- package/src/middleware/cors.ts +0 -104
- package/src/middleware/index.ts +0 -5
- package/src/middleware/remote-auth.test.ts +0 -488
- package/src/middleware/remote-auth.ts +0 -68
- package/src/middleware/timeout.ts +0 -15
- package/src/middleware-runner.test.ts +0 -418
- package/src/middleware-runner.ts +0 -234
- package/src/permissions.test.ts +0 -434
- package/src/permissions.ts +0 -319
- package/src/pikku-request.ts +0 -23
- package/src/pikku-response.ts +0 -5
- package/src/pikku-state.test.ts +0 -224
- package/src/pikku-state.ts +0 -216
- package/src/run-tests-script.test.ts +0 -49
- package/src/schema.test.ts +0 -249
- package/src/schema.ts +0 -151
- package/src/services/ai-agent-runner-service.ts +0 -41
- package/src/services/ai-run-state-service.ts +0 -20
- package/src/services/ai-storage-service.ts +0 -39
- package/src/services/content-service.ts +0 -76
- package/src/services/deployment-service.ts +0 -22
- package/src/services/gateway-service.ts +0 -20
- package/src/services/gopass-secrets.ts +0 -98
- package/src/services/in-memory-ai-run-state-service.ts +0 -73
- package/src/services/in-memory-trigger-service.ts +0 -64
- package/src/services/in-memory-workflow-service.test.ts +0 -351
- package/src/services/in-memory-workflow-service.ts +0 -438
- package/src/services/index.ts +0 -56
- package/src/services/jwt-service.ts +0 -30
- package/src/services/local-content.ts +0 -120
- package/src/services/local-gateway-service.ts +0 -62
- package/src/services/local-secrets.test.ts +0 -80
- package/src/services/local-secrets.ts +0 -94
- package/src/services/local-variables.test.ts +0 -61
- package/src/services/local-variables.ts +0 -39
- package/src/services/logger-console.test.ts +0 -118
- package/src/services/logger-console.ts +0 -98
- package/src/services/logger.ts +0 -57
- package/src/services/scheduler-service.ts +0 -86
- package/src/services/schema-service.ts +0 -33
- package/src/services/scoped-secret-service.test.ts +0 -74
- package/src/services/scoped-secret-service.ts +0 -41
- package/src/services/secret-service.ts +0 -38
- package/src/services/trigger-service.ts +0 -17
- package/src/services/typed-secret-service.test.ts +0 -93
- package/src/services/typed-secret-service.ts +0 -70
- package/src/services/typed-variables-service.test.ts +0 -73
- package/src/services/typed-variables-service.ts +0 -81
- package/src/services/user-session-service.test.ts +0 -113
- package/src/services/user-session-service.ts +0 -86
- package/src/services/variables-service.ts +0 -11
- package/src/services/workflow-service.ts +0 -95
- package/src/testing/index.ts +0 -2
- package/src/testing/service-tests.ts +0 -873
- package/src/time-utils.test.ts +0 -56
- package/src/time-utils.ts +0 -107
- package/src/types/core.types.ts +0 -478
- package/src/types/state.types.ts +0 -188
- package/src/utils/hash.test.ts +0 -68
- package/src/utils/hash.ts +0 -26
- package/src/utils.test.ts +0 -350
- package/src/utils.ts +0 -129
- package/src/version.test.ts +0 -80
- package/src/version.ts +0 -25
- package/src/wirings/ai-agent/agent-dynamic-workflow.ts +0 -469
- package/src/wirings/ai-agent/ai-agent-helpers.test.ts +0 -152
- package/src/wirings/ai-agent/ai-agent-helpers.ts +0 -76
- package/src/wirings/ai-agent/ai-agent-memory.ts +0 -310
- package/src/wirings/ai-agent/ai-agent-model-config.test.ts +0 -115
- package/src/wirings/ai-agent/ai-agent-model-config.ts +0 -43
- package/src/wirings/ai-agent/ai-agent-prepare.ts +0 -636
- package/src/wirings/ai-agent/ai-agent-registry.test.ts +0 -37
- package/src/wirings/ai-agent/ai-agent-registry.ts +0 -82
- package/src/wirings/ai-agent/ai-agent-runner.test.ts +0 -319
- package/src/wirings/ai-agent/ai-agent-runner.ts +0 -773
- package/src/wirings/ai-agent/ai-agent-stream.test.ts +0 -859
- package/src/wirings/ai-agent/ai-agent-stream.ts +0 -1153
- package/src/wirings/ai-agent/ai-agent.types.ts +0 -382
- package/src/wirings/ai-agent/index.ts +0 -37
- package/src/wirings/channel/channel-common.ts +0 -90
- package/src/wirings/channel/channel-handler.ts +0 -250
- package/src/wirings/channel/channel-middleware-runner.ts +0 -120
- package/src/wirings/channel/channel-runner.ts +0 -166
- package/src/wirings/channel/channel-store.ts +0 -29
- package/src/wirings/channel/channel.types.ts +0 -172
- package/src/wirings/channel/define-channel-routes.ts +0 -25
- package/src/wirings/channel/eventhub-service.ts +0 -34
- package/src/wirings/channel/eventhub-store.ts +0 -13
- package/src/wirings/channel/index.ts +0 -24
- package/src/wirings/channel/local/index.ts +0 -3
- package/src/wirings/channel/local/local-channel-handler.ts +0 -81
- package/src/wirings/channel/local/local-channel-runner.test.ts +0 -215
- package/src/wirings/channel/local/local-channel-runner.ts +0 -210
- package/src/wirings/channel/local/local-eventhub-service.test.ts +0 -95
- package/src/wirings/channel/local/local-eventhub-service.ts +0 -101
- package/src/wirings/channel/log-channels.ts +0 -20
- package/src/wirings/channel/pikku-abstract-channel-handler.test.ts +0 -54
- package/src/wirings/channel/pikku-abstract-channel-handler.ts +0 -45
- package/src/wirings/channel/serverless/index.ts +0 -5
- package/src/wirings/channel/serverless/serverless-channel-runner.ts +0 -289
- package/src/wirings/cli/channel/cli-channel-runner.ts +0 -136
- package/src/wirings/cli/channel/index.ts +0 -1
- package/src/wirings/cli/cli-runner.test.ts +0 -403
- package/src/wirings/cli/cli-runner.ts +0 -529
- package/src/wirings/cli/cli.types.ts +0 -358
- package/src/wirings/cli/command-parser.test.ts +0 -445
- package/src/wirings/cli/command-parser.ts +0 -504
- package/src/wirings/cli/define-cli-commands.ts +0 -24
- package/src/wirings/cli/index.ts +0 -19
- package/src/wirings/gateway/gateway-runner.test.ts +0 -474
- package/src/wirings/gateway/gateway-runner.ts +0 -411
- package/src/wirings/gateway/gateway.types.ts +0 -149
- package/src/wirings/gateway/index.ts +0 -13
- package/src/wirings/http/http-routes.test.ts +0 -322
- package/src/wirings/http/http-routes.ts +0 -197
- package/src/wirings/http/http-runner.test.ts +0 -144
- package/src/wirings/http/http-runner.ts +0 -588
- package/src/wirings/http/http.types.ts +0 -369
- package/src/wirings/http/index.ts +0 -28
- package/src/wirings/http/log-http-routes.ts +0 -22
- package/src/wirings/http/pikku-fetch-http-request.test.ts +0 -237
- package/src/wirings/http/pikku-fetch-http-request.ts +0 -170
- package/src/wirings/http/pikku-fetch-http-response.test.ts +0 -82
- package/src/wirings/http/pikku-fetch-http-response.ts +0 -147
- package/src/wirings/http/routers/http-router.ts +0 -13
- package/src/wirings/http/routers/path-to-regex.test.ts +0 -319
- package/src/wirings/http/routers/path-to-regex.ts +0 -126
- package/src/wirings/http/web-request.test.ts +0 -236
- package/src/wirings/http/web-request.ts +0 -104
- package/src/wirings/mcp/index.ts +0 -27
- package/src/wirings/mcp/mcp-endpoint-registry.test.ts +0 -389
- package/src/wirings/mcp/mcp-endpoint-registry.ts +0 -159
- package/src/wirings/mcp/mcp-runner.ts +0 -323
- package/src/wirings/mcp/mcp.types.ts +0 -216
- package/src/wirings/node/index.ts +0 -2
- package/src/wirings/node/node.types.ts +0 -23
- package/src/wirings/oauth2/index.ts +0 -3
- package/src/wirings/oauth2/oauth2-client.test.ts +0 -929
- package/src/wirings/oauth2/oauth2-client.ts +0 -335
- package/src/wirings/oauth2/oauth2.types.ts +0 -69
- package/src/wirings/oauth2/wire-oauth2-credential.ts +0 -23
- package/src/wirings/queue/index.ts +0 -31
- package/src/wirings/queue/queue-runner.test.ts +0 -710
- package/src/wirings/queue/queue-runner.ts +0 -192
- package/src/wirings/queue/queue.types.ts +0 -189
- package/src/wirings/queue/register-queue-helper.ts +0 -60
- package/src/wirings/queue/validate-worker-config.test.ts +0 -108
- package/src/wirings/queue/validate-worker-config.ts +0 -116
- package/src/wirings/rpc/index.ts +0 -4
- package/src/wirings/rpc/rpc-runner.ts +0 -460
- package/src/wirings/rpc/rpc-types.ts +0 -56
- package/src/wirings/rpc/wire-addon.ts +0 -21
- package/src/wirings/scheduler/index.ts +0 -11
- package/src/wirings/scheduler/log-schedulers.ts +0 -20
- package/src/wirings/scheduler/scheduler-runner.test.ts +0 -660
- package/src/wirings/scheduler/scheduler-runner.ts +0 -133
- package/src/wirings/scheduler/scheduler.types.ts +0 -53
- package/src/wirings/secret/index.ts +0 -9
- package/src/wirings/secret/secret.types.ts +0 -32
- package/src/wirings/secret/validate-secret-definitions.test.ts +0 -140
- package/src/wirings/secret/validate-secret-definitions.ts +0 -82
- package/src/wirings/trigger/index.ts +0 -10
- package/src/wirings/trigger/pikku-trigger-service.ts +0 -112
- package/src/wirings/trigger/trigger-runner.test.ts +0 -79
- package/src/wirings/trigger/trigger-runner.ts +0 -135
- package/src/wirings/trigger/trigger.types.ts +0 -178
- package/src/wirings/variable/index.ts +0 -8
- package/src/wirings/variable/validate-variable-definitions.test.ts +0 -91
- package/src/wirings/variable/validate-variable-definitions.ts +0 -69
- package/src/wirings/variable/variable.types.ts +0 -22
- package/src/wirings/workflow/dsl/index.ts +0 -31
- package/src/wirings/workflow/dsl/workflow-dsl.types.ts +0 -320
- package/src/wirings/workflow/dsl/workflow-runner.ts +0 -28
- package/src/wirings/workflow/graph/graph-node.ts +0 -222
- package/src/wirings/workflow/graph/graph-runner.test.ts +0 -487
- package/src/wirings/workflow/graph/graph-runner.ts +0 -816
- package/src/wirings/workflow/graph/graph-validation.test.ts +0 -170
- package/src/wirings/workflow/graph/graph-validation.ts +0 -237
- package/src/wirings/workflow/graph/index.ts +0 -19
- package/src/wirings/workflow/graph/template.test.ts +0 -49
- package/src/wirings/workflow/graph/template.ts +0 -42
- package/src/wirings/workflow/graph/wire-workflow-graph.ts +0 -29
- package/src/wirings/workflow/graph/workflow-graph.types.ts +0 -104
- package/src/wirings/workflow/index.ts +0 -82
- package/src/wirings/workflow/pikku-workflow-service.test.ts +0 -200
- package/src/wirings/workflow/pikku-workflow-service.ts +0 -1176
- package/src/wirings/workflow/workflow-helpers.test.ts +0 -129
- package/src/wirings/workflow/workflow-helpers.ts +0 -79
- package/src/wirings/workflow/workflow.types.ts +0 -274
- package/tsconfig.json +0 -14
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AgentRunState,
|
|
3
|
-
PendingApproval,
|
|
4
|
-
} from '../wirings/ai-agent/ai-agent.types.js'
|
|
5
|
-
|
|
6
|
-
export type CreateRunInput = Omit<AgentRunState, 'runId'>
|
|
7
|
-
|
|
8
|
-
export interface AIRunStateService {
|
|
9
|
-
createRun(run: CreateRunInput): Promise<string>
|
|
10
|
-
updateRun(runId: string, updates: Partial<AgentRunState>): Promise<void>
|
|
11
|
-
getRun(runId: string): Promise<AgentRunState | null>
|
|
12
|
-
getRunsByThread(threadId: string): Promise<AgentRunState[]>
|
|
13
|
-
resolveApproval(
|
|
14
|
-
toolCallId: string,
|
|
15
|
-
status: 'approved' | 'denied'
|
|
16
|
-
): Promise<void>
|
|
17
|
-
findRunByToolCallId(
|
|
18
|
-
toolCallId: string
|
|
19
|
-
): Promise<{ run: AgentRunState; approval: PendingApproval } | null>
|
|
20
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import type { AIThread, AIMessage } from '../wirings/ai-agent/ai-agent.types.js'
|
|
2
|
-
|
|
3
|
-
export interface AIStorageService {
|
|
4
|
-
createThread(
|
|
5
|
-
resourceId: string,
|
|
6
|
-
options?: {
|
|
7
|
-
threadId?: string
|
|
8
|
-
title?: string
|
|
9
|
-
metadata?: Record<string, unknown>
|
|
10
|
-
}
|
|
11
|
-
): Promise<AIThread>
|
|
12
|
-
|
|
13
|
-
getThread(threadId: string): Promise<AIThread>
|
|
14
|
-
|
|
15
|
-
getThreads(resourceId: string): Promise<AIThread[]>
|
|
16
|
-
|
|
17
|
-
deleteThread(threadId: string): Promise<void>
|
|
18
|
-
|
|
19
|
-
getMessages(
|
|
20
|
-
threadId: string,
|
|
21
|
-
options?: {
|
|
22
|
-
lastN?: number
|
|
23
|
-
cursor?: string
|
|
24
|
-
}
|
|
25
|
-
): Promise<AIMessage[]>
|
|
26
|
-
|
|
27
|
-
saveMessages(threadId: string, messages: AIMessage[]): Promise<void>
|
|
28
|
-
|
|
29
|
-
getWorkingMemory(
|
|
30
|
-
id: string,
|
|
31
|
-
scope: 'resource' | 'thread'
|
|
32
|
-
): Promise<Record<string, unknown> | null>
|
|
33
|
-
|
|
34
|
-
saveWorkingMemory(
|
|
35
|
-
id: string,
|
|
36
|
-
scope: 'resource' | 'thread',
|
|
37
|
-
data: Record<string, unknown>
|
|
38
|
-
): Promise<void>
|
|
39
|
-
}
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
export interface ContentService {
|
|
2
|
-
/**
|
|
3
|
-
* Signs a content key to generate a secure, time-limited access URL.
|
|
4
|
-
* @param contentKey - The key representing the content object.
|
|
5
|
-
* @param dateLessThan - The expiration time for the signed URL.
|
|
6
|
-
* @param dateGreaterThan - (Optional) Start time before which access is denied.
|
|
7
|
-
*/
|
|
8
|
-
signContentKey(
|
|
9
|
-
contentKey: string,
|
|
10
|
-
dateLessThan: Date,
|
|
11
|
-
dateGreaterThan?: Date
|
|
12
|
-
): Promise<string>
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* Signs an arbitrary URL to generate a secure, time-limited access URL.
|
|
16
|
-
* @param url - The full URL that needs signing.
|
|
17
|
-
* @param dateLessThan - The expiration time for the signed URL.
|
|
18
|
-
* @param dateGreaterThan - (Optional) Start time before which access is denied.
|
|
19
|
-
*/
|
|
20
|
-
signURL(
|
|
21
|
-
url: string,
|
|
22
|
-
dateLessThan: Date,
|
|
23
|
-
dateGreaterThan?: Date
|
|
24
|
-
): Promise<string>
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Generates a signed URL for uploading a file directly to storage.
|
|
28
|
-
* @param fileKey - The desired key/location of the uploaded file.
|
|
29
|
-
* @param contentType - The MIME type of the file.
|
|
30
|
-
* @returns A signed upload URL and the finalized asset key.
|
|
31
|
-
*/
|
|
32
|
-
getUploadURL(
|
|
33
|
-
fileKey: string,
|
|
34
|
-
contentType: string
|
|
35
|
-
): Promise<{ uploadUrl: string; assetKey: string }>
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Deletes a file from the storage backend.
|
|
39
|
-
* @param fileName - The name or key of the file to delete.
|
|
40
|
-
* @returns A boolean indicating success.
|
|
41
|
-
*/
|
|
42
|
-
deleteFile(fileName: string): Promise<boolean>
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Uploads a file stream to storage under a specified asset key.
|
|
46
|
-
* @param assetKey - The key where the file will be saved.
|
|
47
|
-
* @param stream - A readable stream of the file contents.
|
|
48
|
-
* @returns A boolean indicating success.
|
|
49
|
-
*/
|
|
50
|
-
writeFile(
|
|
51
|
-
assetKey: string,
|
|
52
|
-
stream: ReadableStream | NodeJS.ReadableStream
|
|
53
|
-
): Promise<boolean>
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Copies a file from a local absolute path into storage under a new asset key.
|
|
57
|
-
* @param assetKey - The destination key.
|
|
58
|
-
* @param fromAbsolutePath - The local absolute file path.
|
|
59
|
-
* @returns A boolean indicating success.
|
|
60
|
-
*/
|
|
61
|
-
copyFile(assetKey: string, fromAbsolutePath: string): Promise<boolean>
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Reads a file from storage as a readable stream.
|
|
65
|
-
* @param assetKey - The key of the file to read.
|
|
66
|
-
* @returns A readable file stream.
|
|
67
|
-
*/
|
|
68
|
-
readFile(assetKey: string): Promise<ReadableStream | NodeJS.ReadableStream>
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Reads an entire file from storage into a Buffer.
|
|
72
|
-
* @param assetKey - The key of the file to read.
|
|
73
|
-
* @returns The file contents as a Buffer.
|
|
74
|
-
*/
|
|
75
|
-
readFileAsBuffer(assetKey: string): Promise<Buffer>
|
|
76
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
export interface DeploymentServiceConfig {
|
|
2
|
-
heartbeatInterval?: number
|
|
3
|
-
heartbeatTtl?: number
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export interface DeploymentConfig {
|
|
7
|
-
deploymentId: string
|
|
8
|
-
endpoint: string
|
|
9
|
-
functions?: string[]
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface DeploymentInfo {
|
|
13
|
-
deploymentId: string
|
|
14
|
-
endpoint: string
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export interface DeploymentService {
|
|
18
|
-
init(): Promise<void>
|
|
19
|
-
start(config: DeploymentConfig): Promise<void>
|
|
20
|
-
stop(): Promise<void>
|
|
21
|
-
findFunction(name: string): Promise<DeploymentInfo[]>
|
|
22
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Abstract GatewayService interface.
|
|
3
|
-
*
|
|
4
|
-
* Implementations manage listener gateway lifecycle — initializing adapters
|
|
5
|
-
* and delivering messages to handler functions.
|
|
6
|
-
*
|
|
7
|
-
* A `LocalGatewayService` starts all listeners unconditionally;
|
|
8
|
-
* a distributed implementation could check leader election first.
|
|
9
|
-
*/
|
|
10
|
-
export interface GatewayService {
|
|
11
|
-
/**
|
|
12
|
-
* Start all listener gateways
|
|
13
|
-
*/
|
|
14
|
-
start(): Promise<void>
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Stop all listener gateways
|
|
18
|
-
*/
|
|
19
|
-
stop(): Promise<void>
|
|
20
|
-
}
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import { execFileSync } from 'child_process'
|
|
2
|
-
import type { SecretService } from './secret-service.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Service for retrieving secrets from gopass.
|
|
6
|
-
* Requires gopass to be installed and configured on the system.
|
|
7
|
-
*/
|
|
8
|
-
export class GopassSecretService implements SecretService {
|
|
9
|
-
/**
|
|
10
|
-
* Creates an instance of GopassSecretService.
|
|
11
|
-
* @param prefix - Optional prefix for all secret keys (e.g., 'pikku/' will look up 'pikku/mykey' for key 'mykey')
|
|
12
|
-
*/
|
|
13
|
-
constructor(private prefix: string = '') {}
|
|
14
|
-
|
|
15
|
-
private getFullKey(key: string): string {
|
|
16
|
-
if (!/^[\w.\-/]+$/.test(key)) {
|
|
17
|
-
throw new Error(`Invalid secret key format: ${key}`)
|
|
18
|
-
}
|
|
19
|
-
return this.prefix ? `${this.prefix}${key}` : key
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Retrieves a secret by key and parses it as JSON.
|
|
24
|
-
* @param key - The key of the secret to retrieve.
|
|
25
|
-
* @returns A promise that resolves to the parsed secret value.
|
|
26
|
-
* @throws {Error} If the secret is not found or gopass fails.
|
|
27
|
-
*/
|
|
28
|
-
public async getSecretJSON<R>(key: string): Promise<R> {
|
|
29
|
-
const value = await this.getSecret(key)
|
|
30
|
-
return JSON.parse(value)
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Retrieves a secret by key as a string.
|
|
35
|
-
* @param key - The key of the secret to retrieve.
|
|
36
|
-
* @returns A promise that resolves to the secret value.
|
|
37
|
-
* @throws {Error} If the secret is not found or gopass fails.
|
|
38
|
-
*/
|
|
39
|
-
public async getSecret(key: string): Promise<string> {
|
|
40
|
-
const fullKey = this.getFullKey(key)
|
|
41
|
-
try {
|
|
42
|
-
return execFileSync('gopass', ['show', '-o', fullKey], {
|
|
43
|
-
encoding: 'utf8',
|
|
44
|
-
}).trim()
|
|
45
|
-
} catch (error: any) {
|
|
46
|
-
throw new Error(`Secret Not Found: ${key}`, { cause: error })
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Checks if a secret exists without throwing.
|
|
52
|
-
* @param key - The key of the secret to check.
|
|
53
|
-
* @returns A promise that resolves to true if the secret exists.
|
|
54
|
-
*/
|
|
55
|
-
public async hasSecret(key: string): Promise<boolean> {
|
|
56
|
-
const fullKey = this.getFullKey(key)
|
|
57
|
-
try {
|
|
58
|
-
execFileSync('gopass', ['show', '-o', fullKey], { encoding: 'utf8' })
|
|
59
|
-
return true
|
|
60
|
-
} catch {
|
|
61
|
-
return false
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Stores a JSON value as a secret in gopass.
|
|
67
|
-
* @param key - The key to store the secret under.
|
|
68
|
-
* @param value - The JSON value to store.
|
|
69
|
-
* @returns A promise that resolves when the secret is stored.
|
|
70
|
-
*/
|
|
71
|
-
public async setSecretJSON(key: string, value: unknown): Promise<void> {
|
|
72
|
-
const fullKey = this.getFullKey(key)
|
|
73
|
-
const jsonValue = JSON.stringify(value)
|
|
74
|
-
try {
|
|
75
|
-
execFileSync('gopass', ['insert', '-f', fullKey], {
|
|
76
|
-
encoding: 'utf8',
|
|
77
|
-
input: jsonValue,
|
|
78
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
79
|
-
})
|
|
80
|
-
} catch (error: any) {
|
|
81
|
-
throw new Error(`Failed to set secret: ${key}`, { cause: error })
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Deletes a secret from gopass.
|
|
87
|
-
* @param key - The key of the secret to delete.
|
|
88
|
-
* @returns A promise that resolves when the secret is deleted.
|
|
89
|
-
*/
|
|
90
|
-
public async deleteSecret(key: string): Promise<void> {
|
|
91
|
-
const fullKey = this.getFullKey(key)
|
|
92
|
-
try {
|
|
93
|
-
execFileSync('gopass', ['rm', '-f', fullKey], { encoding: 'utf8' })
|
|
94
|
-
} catch {
|
|
95
|
-
// Ignore errors if secret doesn't exist
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
AIRunStateService,
|
|
3
|
-
CreateRunInput,
|
|
4
|
-
} from './ai-run-state-service.js'
|
|
5
|
-
import type {
|
|
6
|
-
AgentRunState,
|
|
7
|
-
PendingApproval,
|
|
8
|
-
} from '../wirings/ai-agent/ai-agent.types.js'
|
|
9
|
-
|
|
10
|
-
export class InMemoryAIRunStateService implements AIRunStateService {
|
|
11
|
-
private runs = new Map<string, AgentRunState>()
|
|
12
|
-
private counter = 0
|
|
13
|
-
|
|
14
|
-
async createRun(run: CreateRunInput): Promise<string> {
|
|
15
|
-
const runId = `run-${++this.counter}-${Date.now()}`
|
|
16
|
-
this.runs.set(runId, { ...run, runId })
|
|
17
|
-
return runId
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
async updateRun(
|
|
21
|
-
runId: string,
|
|
22
|
-
updates: Partial<AgentRunState>
|
|
23
|
-
): Promise<void> {
|
|
24
|
-
const run = this.runs.get(runId)
|
|
25
|
-
if (run) {
|
|
26
|
-
Object.assign(run, updates, { updatedAt: new Date() })
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async getRun(runId: string): Promise<AgentRunState | null> {
|
|
31
|
-
return this.runs.get(runId) ?? null
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
async getRunsByThread(threadId: string): Promise<AgentRunState[]> {
|
|
35
|
-
return [...this.runs.values()].filter((r) => r.threadId === threadId)
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
async resolveApproval(
|
|
39
|
-
toolCallId: string,
|
|
40
|
-
status: 'approved' | 'denied'
|
|
41
|
-
): Promise<void> {
|
|
42
|
-
for (const run of this.runs.values()) {
|
|
43
|
-
if (run.pendingApprovals) {
|
|
44
|
-
const approval = run.pendingApprovals.find(
|
|
45
|
-
(a) => a.toolCallId === toolCallId
|
|
46
|
-
)
|
|
47
|
-
if (approval) {
|
|
48
|
-
run.pendingApprovals = run.pendingApprovals.filter(
|
|
49
|
-
(a) => a.toolCallId !== toolCallId
|
|
50
|
-
)
|
|
51
|
-
run.updatedAt = new Date()
|
|
52
|
-
return
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async findRunByToolCallId(
|
|
59
|
-
toolCallId: string
|
|
60
|
-
): Promise<{ run: AgentRunState; approval: PendingApproval } | null> {
|
|
61
|
-
for (const run of this.runs.values()) {
|
|
62
|
-
if (run.pendingApprovals) {
|
|
63
|
-
const approval = run.pendingApprovals.find(
|
|
64
|
-
(a) => a.toolCallId === toolCallId
|
|
65
|
-
)
|
|
66
|
-
if (approval) {
|
|
67
|
-
return { run, approval }
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return null
|
|
72
|
-
}
|
|
73
|
-
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { PikkuTriggerService } from '../wirings/trigger/pikku-trigger-service.js'
|
|
2
|
-
import { getSingletonServices } from '../pikku-state.js'
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* In-memory TriggerService implementation.
|
|
6
|
-
*
|
|
7
|
-
* Reads both `wireTrigger` declarations and `wireTriggerSource` registrations
|
|
8
|
-
* from pikkuState. Only starts triggers that have both a declaration and a source.
|
|
9
|
-
* On fire, invokes target via `ContextAwareRPCService`.
|
|
10
|
-
*
|
|
11
|
-
* Single owner — one process runs triggers, no distributed claiming.
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
14
|
-
* ```typescript
|
|
15
|
-
* const triggerService = new InMemoryTriggerService()
|
|
16
|
-
* await triggerService.start()
|
|
17
|
-
*
|
|
18
|
-
* // On shutdown
|
|
19
|
-
* await triggerService.stop()
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export class InMemoryTriggerService extends PikkuTriggerService {
|
|
23
|
-
async start(): Promise<void> {
|
|
24
|
-
const singletonServices = getSingletonServices()
|
|
25
|
-
|
|
26
|
-
const triggerTargets = this.getTriggerTargets()
|
|
27
|
-
const triggerSources = this.getTriggerSources()
|
|
28
|
-
|
|
29
|
-
for (const [name, source] of triggerSources) {
|
|
30
|
-
if (this.activeTriggers.has(name)) {
|
|
31
|
-
continue
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
const targets = triggerTargets.get(name)
|
|
35
|
-
if (!targets || targets.length === 0) {
|
|
36
|
-
singletonServices.logger.info(
|
|
37
|
-
`Trigger source '${name}' has no targets, skipping`
|
|
38
|
-
)
|
|
39
|
-
continue
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
try {
|
|
43
|
-
const triggerInstance = await this.setupTriggerInstance(
|
|
44
|
-
name,
|
|
45
|
-
source.input,
|
|
46
|
-
(data) => this.onTriggerFire(name, targets, data)
|
|
47
|
-
)
|
|
48
|
-
|
|
49
|
-
this.activeTriggers.set(name, triggerInstance)
|
|
50
|
-
singletonServices.logger.info(`Started trigger: ${name}`)
|
|
51
|
-
} catch (error) {
|
|
52
|
-
singletonServices.logger.error(
|
|
53
|
-
`Failed to start trigger ${name}: ${error}`
|
|
54
|
-
)
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (this.activeTriggers.size === 0) {
|
|
59
|
-
singletonServices.logger.info(
|
|
60
|
-
'No triggers started (no matching sources and targets found)'
|
|
61
|
-
)
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|