attune-sdk 0.4.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.
Files changed (87) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +355 -0
  3. package/dist/action.d.ts +34 -0
  4. package/dist/action.d.ts.map +1 -0
  5. package/dist/action.js +62 -0
  6. package/dist/action.js.map +1 -0
  7. package/dist/api_client/client/client.gen.d.ts +3 -0
  8. package/dist/api_client/client/client.gen.d.ts.map +1 -0
  9. package/dist/api_client/client/client.gen.js +217 -0
  10. package/dist/api_client/client/client.gen.js.map +1 -0
  11. package/dist/api_client/client/index.d.ts +9 -0
  12. package/dist/api_client/client/index.d.ts.map +1 -0
  13. package/dist/api_client/client/index.js +7 -0
  14. package/dist/api_client/client/index.js.map +1 -0
  15. package/dist/api_client/client/types.gen.d.ts +121 -0
  16. package/dist/api_client/client/types.gen.d.ts.map +1 -0
  17. package/dist/api_client/client/types.gen.js +3 -0
  18. package/dist/api_client/client/types.gen.js.map +1 -0
  19. package/dist/api_client/client/utils.gen.d.ts +38 -0
  20. package/dist/api_client/client/utils.gen.d.ts.map +1 -0
  21. package/dist/api_client/client/utils.gen.js +229 -0
  22. package/dist/api_client/client/utils.gen.js.map +1 -0
  23. package/dist/api_client/client.gen.d.ts +13 -0
  24. package/dist/api_client/client.gen.d.ts.map +1 -0
  25. package/dist/api_client/client.gen.js +4 -0
  26. package/dist/api_client/client.gen.js.map +1 -0
  27. package/dist/api_client/core/auth.gen.d.ts +19 -0
  28. package/dist/api_client/core/auth.gen.d.ts.map +1 -0
  29. package/dist/api_client/core/auth.gen.js +15 -0
  30. package/dist/api_client/core/auth.gen.js.map +1 -0
  31. package/dist/api_client/core/bodySerializer.gen.d.ts +26 -0
  32. package/dist/api_client/core/bodySerializer.gen.d.ts.map +1 -0
  33. package/dist/api_client/core/bodySerializer.gen.js +58 -0
  34. package/dist/api_client/core/bodySerializer.gen.js.map +1 -0
  35. package/dist/api_client/core/params.gen.d.ts +44 -0
  36. package/dist/api_client/core/params.gen.d.ts.map +1 -0
  37. package/dist/api_client/core/params.gen.js +101 -0
  38. package/dist/api_client/core/params.gen.js.map +1 -0
  39. package/dist/api_client/core/pathSerializer.gen.d.ts +34 -0
  40. package/dist/api_client/core/pathSerializer.gen.d.ts.map +1 -0
  41. package/dist/api_client/core/pathSerializer.gen.js +107 -0
  42. package/dist/api_client/core/pathSerializer.gen.js.map +1 -0
  43. package/dist/api_client/core/queryKeySerializer.gen.d.ts +19 -0
  44. package/dist/api_client/core/queryKeySerializer.gen.d.ts.map +1 -0
  45. package/dist/api_client/core/queryKeySerializer.gen.js +93 -0
  46. package/dist/api_client/core/queryKeySerializer.gen.js.map +1 -0
  47. package/dist/api_client/core/serverSentEvents.gen.d.ts +72 -0
  48. package/dist/api_client/core/serverSentEvents.gen.d.ts.map +1 -0
  49. package/dist/api_client/core/serverSentEvents.gen.js +133 -0
  50. package/dist/api_client/core/serverSentEvents.gen.js.map +1 -0
  51. package/dist/api_client/core/types.gen.d.ts +79 -0
  52. package/dist/api_client/core/types.gen.d.ts.map +1 -0
  53. package/dist/api_client/core/types.gen.js +3 -0
  54. package/dist/api_client/core/types.gen.js.map +1 -0
  55. package/dist/api_client/core/utils.gen.d.ts +20 -0
  56. package/dist/api_client/core/utils.gen.d.ts.map +1 -0
  57. package/dist/api_client/core/utils.gen.js +88 -0
  58. package/dist/api_client/core/utils.gen.js.map +1 -0
  59. package/dist/api_client/index.d.ts +3 -0
  60. package/dist/api_client/index.d.ts.map +1 -0
  61. package/dist/api_client/index.js +3 -0
  62. package/dist/api_client/index.js.map +1 -0
  63. package/dist/api_client/sdk.gen.d.ts +1000 -0
  64. package/dist/api_client/sdk.gen.d.ts.map +1 -0
  65. package/dist/api_client/sdk.gen.js +2145 -0
  66. package/dist/api_client/sdk.gen.js.map +1 -0
  67. package/dist/api_client/types.gen.d.ts +19794 -0
  68. package/dist/api_client/types.gen.d.ts.map +1 -0
  69. package/dist/api_client/types.gen.js +3 -0
  70. package/dist/api_client/types.gen.js.map +1 -0
  71. package/dist/client.d.ts +42 -0
  72. package/dist/client.d.ts.map +1 -0
  73. package/dist/client.js +73 -0
  74. package/dist/client.js.map +1 -0
  75. package/dist/context.d.ts +112 -0
  76. package/dist/context.d.ts.map +1 -0
  77. package/dist/context.js +108 -0
  78. package/dist/context.js.map +1 -0
  79. package/dist/index.d.ts +43 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +38 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/sensor.d.ts +127 -0
  84. package/dist/sensor.d.ts.map +1 -0
  85. package/dist/sensor.js +880 -0
  86. package/dist/sensor.js.map +1 -0
  87. package/package.json +64 -0
@@ -0,0 +1,3 @@
1
+ // This file is auto-generated by @hey-api/openapi-ts
2
+ export {};
3
+ //# sourceMappingURL=types.gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.gen.js","sourceRoot":"","sources":["../../src/api_client/types.gen.ts"],"names":[],"mappings":"AAAA,qDAAqD"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Lightweight HTTP client for the Attune API.
3
+ *
4
+ * Uses the execution-scoped API token from the environment. Uses Node.js
5
+ * built-in fetch (available since Node 18).
6
+ *
7
+ * Usage:
8
+ * import { AttuneClient } from "attune-sdk/client";
9
+ *
10
+ * const client = new AttuneClient(); // auto-reads ATTUNE_API_URL and ATTUNE_API_TOKEN
11
+ * const artifacts = await client.get("/api/v1/artifacts", { params: { execution: "42" } });
12
+ */
13
+ export interface AttuneClientOptions {
14
+ apiUrl?: string;
15
+ apiToken?: string;
16
+ /**
17
+ * Optional token accessor. Use this for managed sensors where the runtime may
18
+ * rotate ATTUNE_API_TOKEN externally.
19
+ */
20
+ apiTokenProvider?: () => string | undefined;
21
+ timeout?: number;
22
+ }
23
+ export declare class AttuneClient {
24
+ readonly apiUrl: string;
25
+ private readonly tokenProvider;
26
+ private readonly timeout;
27
+ constructor(options?: AttuneClientOptions);
28
+ get apiToken(): string;
29
+ private headers;
30
+ private request;
31
+ get(path: string, options?: {
32
+ params?: Record<string, string>;
33
+ }): Promise<unknown>;
34
+ post(path: string, options?: {
35
+ json?: unknown;
36
+ }): Promise<unknown>;
37
+ put(path: string, options?: {
38
+ json?: unknown;
39
+ }): Promise<unknown>;
40
+ delete(path: string): Promise<unknown>;
41
+ }
42
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,mBAAwB;IAe7C,IAAI,QAAQ,IAAI,MAAM,CAErB;IAED,OAAO,CAAC,OAAO;YASD,OAAO;IAmBf,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlF,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAIjE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG7C"}
package/dist/client.js ADDED
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Lightweight HTTP client for the Attune API.
3
+ *
4
+ * Uses the execution-scoped API token from the environment. Uses Node.js
5
+ * built-in fetch (available since Node 18).
6
+ *
7
+ * Usage:
8
+ * import { AttuneClient } from "attune-sdk/client";
9
+ *
10
+ * const client = new AttuneClient(); // auto-reads ATTUNE_API_URL and ATTUNE_API_TOKEN
11
+ * const artifacts = await client.get("/api/v1/artifacts", { params: { execution: "42" } });
12
+ */
13
+ export class AttuneClient {
14
+ apiUrl;
15
+ tokenProvider;
16
+ timeout;
17
+ constructor(options = {}) {
18
+ this.apiUrl = (options.apiUrl ?? process.env.ATTUNE_API_URL ?? "http://localhost:8080").replace(/\/+$/, "");
19
+ if (options.apiTokenProvider) {
20
+ this.tokenProvider = () => options.apiTokenProvider?.() ?? "";
21
+ }
22
+ else if (options.apiToken !== undefined) {
23
+ const fixedToken = options.apiToken;
24
+ this.tokenProvider = () => fixedToken;
25
+ }
26
+ else {
27
+ this.tokenProvider = () => process.env.ATTUNE_API_TOKEN ?? "";
28
+ }
29
+ this.timeout = options.timeout ?? 30_000;
30
+ }
31
+ get apiToken() {
32
+ return this.tokenProvider();
33
+ }
34
+ headers() {
35
+ const h = { "Content-Type": "application/json" };
36
+ const token = this.tokenProvider();
37
+ if (token) {
38
+ h["Authorization"] = `Bearer ${token}`;
39
+ }
40
+ return h;
41
+ }
42
+ async request(method, path, options) {
43
+ let url = `${this.apiUrl}${path}`;
44
+ if (options?.params) {
45
+ const qs = new URLSearchParams(options.params).toString();
46
+ url += `?${qs}`;
47
+ }
48
+ const resp = await fetch(url, {
49
+ method,
50
+ headers: this.headers(),
51
+ body: options?.json !== undefined ? JSON.stringify(options.json) : undefined,
52
+ signal: AbortSignal.timeout(this.timeout),
53
+ });
54
+ if (!resp.ok) {
55
+ throw new Error(`HTTP ${resp.status}: ${resp.statusText}`);
56
+ }
57
+ const text = await resp.text();
58
+ return text ? JSON.parse(text) : null;
59
+ }
60
+ async get(path, options) {
61
+ return this.request("GET", path, options);
62
+ }
63
+ async post(path, options) {
64
+ return this.request("POST", path, options);
65
+ }
66
+ async put(path, options) {
67
+ return this.request("PUT", path, options);
68
+ }
69
+ async delete(path) {
70
+ return this.request("DELETE", path);
71
+ }
72
+ }
73
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Execution context — singletons providing access to environment variables and
3
+ * execution metadata.
4
+ *
5
+ * Action fields are computed once at import time. Sensor token access is
6
+ * re-read from the process environment for each request.
7
+ *
8
+ * Usage:
9
+ * import { context, sensorContext } from "attune-sdk";
10
+ * console.log(context.executionId);
11
+ * console.log(sensorContext.sensorRef);
12
+ *
13
+ * Access the generated API client from context:
14
+ * import { context } from "attune-sdk";
15
+ * import { listPacks } from "attune-sdk/api_client";
16
+ *
17
+ * const response = await listPacks({ client: context.client });
18
+ */
19
+ import { type Client } from "./api_client/client/index.js";
20
+ export type SensorTokenSource = "none" | "env";
21
+ export interface SensorTokenState {
22
+ /** The current token to use for API and notifier auth. */
23
+ readonly token: string;
24
+ /** Token expiry when provided by the runtime; null when unavailable. */
25
+ readonly expiresAt: Date | null;
26
+ /** Where this token state was resolved from. */
27
+ readonly source: SensorTokenSource;
28
+ }
29
+ export interface ActionContext {
30
+ /** The action reference (e.g., `mypack.deploy`). */
31
+ readonly actionRef: string;
32
+ /** The pack reference (e.g., `mypack`). */
33
+ readonly packRef: string;
34
+ /** The execution database ID. */
35
+ readonly executionId: string;
36
+ /** The Attune API base URL. */
37
+ readonly apiUrl: string;
38
+ /** The execution-scoped API token (if permission sets were granted). */
39
+ readonly apiToken: string | undefined;
40
+ /** Path to the shared artifact volume. */
41
+ readonly artifactsDir: string | undefined;
42
+ /** Path to the runtime environments root. */
43
+ readonly runtimeEnvsDir: string | undefined;
44
+ /** The rule reference (if triggered by a rule). */
45
+ readonly ruleRef: string | undefined;
46
+ /** The trigger reference (if triggered by an event). */
47
+ readonly triggerRef: string | undefined;
48
+ /** Whether an execution-scoped API token is available. */
49
+ readonly hasApiToken: boolean;
50
+ /**
51
+ * Lazily constructed authenticated API client for this execution.
52
+ *
53
+ * Uses the execution-scoped token and API URL from the context.
54
+ * The client instance is cached for the lifetime of the process.
55
+ *
56
+ * Usage:
57
+ * import { context } from "attune-sdk";
58
+ * import { listPacks } from "attune-sdk/api_client";
59
+ *
60
+ * const response = await listPacks({ client: context.client });
61
+ *
62
+ * @throws Error if no API token is available in this execution context.
63
+ */
64
+ readonly client: Client;
65
+ }
66
+ export interface SensorContext {
67
+ /** The sensor reference (e.g., `mypack.my_sensor`). */
68
+ readonly sensorRef: string;
69
+ /** The sensor database ID. */
70
+ readonly sensorId: string;
71
+ /** The Attune API base URL. */
72
+ readonly apiUrl: string;
73
+ /** Initial sensor-scoped API token snapshot at context creation time. */
74
+ readonly apiToken: string;
75
+ /** The notifier WebSocket URL for managed-sensor lifecycle updates. */
76
+ readonly notifierWsUrl: string | undefined;
77
+ /** The configured log level. */
78
+ readonly logLevel: string;
79
+ /** The pack reference derived from sensorRef. */
80
+ readonly packRef: string;
81
+ /** Explicit runtime config from ATTUNE_SENSOR_CONFIG_* environment variables. */
82
+ readonly config: Record<string, string>;
83
+ /**
84
+ * Returns the current sensor API token from the process environment.
85
+ */
86
+ readonly getApiToken: () => string;
87
+ /**
88
+ * Returns the latest token plus source/expiry metadata.
89
+ */
90
+ readonly getTokenState: () => SensorTokenState;
91
+ /**
92
+ * Lazily constructed authenticated API client for this sensor.
93
+ *
94
+ * Uses the sensor token accessor so each request sees rotated credentials.
95
+ * The client instance is cached for the lifetime of the process.
96
+ *
97
+ * Usage:
98
+ * import { sensorContext } from "attune-sdk";
99
+ * import { listSensors } from "attune-sdk/api_client";
100
+ *
101
+ * const response = await listSensors({ client: sensorContext.client });
102
+ */
103
+ readonly client: Client;
104
+ }
105
+ declare function buildActionContext(): ActionContext;
106
+ declare function buildSensorContext(): SensorContext;
107
+ /** Module-level action context singleton. Computed once at import time. */
108
+ export declare const actionContext: ActionContext;
109
+ /** Module-level sensor context singleton. Computed once at import time. */
110
+ export declare const sensorContext: SensorContext;
111
+ export { buildActionContext as _buildActionContext, buildSensorContext as _buildSensorContext };
112
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAgB,KAAK,MAAM,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,KAAK,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,QAAQ,CAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IAChC,gDAAgD;IAChD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2CAA2C;IAC3C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,wEAAwE;IACxE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,0CAA0C;IAC1C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1C,6CAA6C;IAC7C,QAAQ,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C,mDAAmD;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,wDAAwD;IACxD,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,0DAA0D;IAC1D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B;;;;;;;;;;;;;OAaG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8BAA8B;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,uEAAuE;IACvE,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,gCAAgC;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,aAAa,EAAE,MAAM,gBAAgB,CAAC;IAC/C;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAiCD,iBAAS,kBAAkB,IAAI,aAAa,CAmB3C;AAED,iBAAS,kBAAkB,IAAI,aAAa,CAyC3C;AAED,2EAA2E;AAC3E,eAAO,MAAM,aAAa,EAAE,aAAoC,CAAC;AAEjE,2EAA2E;AAC3E,eAAO,MAAM,aAAa,EAAE,aAAoC,CAAC;AAGjE,OAAO,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,kBAAkB,IAAI,mBAAmB,EAAE,CAAC"}
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Execution context — singletons providing access to environment variables and
3
+ * execution metadata.
4
+ *
5
+ * Action fields are computed once at import time. Sensor token access is
6
+ * re-read from the process environment for each request.
7
+ *
8
+ * Usage:
9
+ * import { context, sensorContext } from "attune-sdk";
10
+ * console.log(context.executionId);
11
+ * console.log(sensorContext.sensorRef);
12
+ *
13
+ * Access the generated API client from context:
14
+ * import { context } from "attune-sdk";
15
+ * import { listPacks } from "attune-sdk/api_client";
16
+ *
17
+ * const response = await listPacks({ client: context.client });
18
+ */
19
+ import { createClient } from "./api_client/client/index.js";
20
+ // --- Lazy client singletons ---
21
+ let _actionClient;
22
+ let _sensorClient;
23
+ function getActionClient(apiUrl, apiToken) {
24
+ if (!_actionClient) {
25
+ if (!apiToken) {
26
+ throw new Error("No API token available. The action must have execution permission " +
27
+ "sets configured to receive an API token.");
28
+ }
29
+ _actionClient = createClient({
30
+ baseUrl: apiUrl,
31
+ headers: { Authorization: `Bearer ${apiToken}` },
32
+ });
33
+ }
34
+ return _actionClient;
35
+ }
36
+ function getSensorClient(apiUrl, tokenProvider) {
37
+ if (!_sensorClient) {
38
+ _sensorClient = createClient({
39
+ baseUrl: apiUrl,
40
+ auth: () => tokenProvider() || undefined,
41
+ });
42
+ }
43
+ return _sensorClient;
44
+ }
45
+ function buildActionContext() {
46
+ const apiToken = process.env.ATTUNE_API_TOKEN || undefined;
47
+ const apiUrl = process.env.ATTUNE_API_URL ?? "http://localhost:8080";
48
+ return Object.freeze({
49
+ actionRef: process.env.ATTUNE_ACTION ?? "",
50
+ packRef: process.env.ATTUNE_PACK_REF ?? "",
51
+ executionId: process.env.ATTUNE_EXEC_ID ?? "",
52
+ apiUrl,
53
+ apiToken,
54
+ artifactsDir: process.env.ATTUNE_ARTIFACTS_DIR || undefined,
55
+ runtimeEnvsDir: process.env.ATTUNE_RUNTIME_ENVS_DIR || undefined,
56
+ ruleRef: process.env.ATTUNE_RULE || undefined,
57
+ triggerRef: process.env.ATTUNE_TRIGGER || undefined,
58
+ hasApiToken: Boolean(apiToken),
59
+ get client() {
60
+ return getActionClient(apiUrl, apiToken);
61
+ },
62
+ });
63
+ }
64
+ function buildSensorContext() {
65
+ const sensorRef = process.env.ATTUNE_SENSOR_REF ?? "";
66
+ const parts = sensorRef.split(".");
67
+ const packRef = parts.length >= 2 ? parts[0] : "";
68
+ const apiUrl = process.env.ATTUNE_API_URL ?? "http://localhost:8080";
69
+ const apiToken = process.env.ATTUNE_API_TOKEN ?? "";
70
+ const getTokenState = () => {
71
+ const envToken = process.env.ATTUNE_API_TOKEN ?? "";
72
+ return {
73
+ token: envToken,
74
+ expiresAt: null,
75
+ source: envToken ? "env" : "none",
76
+ };
77
+ };
78
+ const getApiToken = () => getTokenState().token;
79
+ const prefix = "ATTUNE_SENSOR_CONFIG_";
80
+ const config = {};
81
+ for (const [key, value] of Object.entries(process.env)) {
82
+ if (key.startsWith(prefix) && value !== undefined) {
83
+ config[key.slice(prefix.length).toLowerCase()] = value;
84
+ }
85
+ }
86
+ return Object.freeze({
87
+ sensorRef,
88
+ sensorId: process.env.ATTUNE_SENSOR_ID ?? "0",
89
+ apiUrl,
90
+ apiToken,
91
+ notifierWsUrl: process.env.ATTUNE_NOTIFIER_WS_URL || undefined,
92
+ logLevel: (process.env.ATTUNE_LOG_LEVEL ?? "info").toUpperCase(),
93
+ packRef,
94
+ config,
95
+ getApiToken,
96
+ getTokenState,
97
+ get client() {
98
+ return getSensorClient(apiUrl, getApiToken);
99
+ },
100
+ });
101
+ }
102
+ /** Module-level action context singleton. Computed once at import time. */
103
+ export const actionContext = buildActionContext();
104
+ /** Module-level sensor context singleton. Computed once at import time. */
105
+ export const sensorContext = buildSensorContext();
106
+ // Export builders for testing
107
+ export { buildActionContext as _buildActionContext, buildSensorContext as _buildSensorContext };
108
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Attune Node.js SDK — helpers for building actions and sensors.
3
+ *
4
+ * Quick start for actions:
5
+ *
6
+ * import { runAction } from "attune-sdk";
7
+ *
8
+ * function main(params: { name: string; count?: number }) {
9
+ * return { greeting: `Hello, ${params.name}!`.repeat(params.count ?? 1) };
10
+ * }
11
+ *
12
+ * runAction(main);
13
+ *
14
+ * Quick start for sensors:
15
+ *
16
+ * import { PollingSensor, runSensor, RuleState } from "attune-sdk";
17
+ *
18
+ * class MySensor extends PollingSensor {
19
+ * interval = 5000;
20
+ * async poll(rule: RuleState) {
21
+ * this.emit({ value: 42 }, { rule });
22
+ * }
23
+ * }
24
+ *
25
+ * runSensor(MySensor);
26
+ *
27
+ * Access execution context anywhere:
28
+ *
29
+ * import { context, sensorContext } from "attune-sdk";
30
+ * console.log(context.executionId); // action context
31
+ * console.log(sensorContext.sensorRef); // sensor context
32
+ */
33
+ export { runAction } from "./action.js";
34
+ export type { ActionFn, RunActionOptions } from "./action.js";
35
+ export { AttuneClient } from "./client.js";
36
+ export type { AttuneClientOptions } from "./client.js";
37
+ export { createClient } from "./api_client/client/index.js";
38
+ export type { Client, ClientOptions as ApiClientOptions } from "./api_client/client/index.js";
39
+ export { actionContext as context, actionContext, sensorContext, } from "./context.js";
40
+ export type { ActionContext, SensorContext } from "./context.js";
41
+ export { Sensor, PollingSensor, AsyncPollingSensor, runSensor, } from "./sensor.js";
42
+ export type { RuleState, EmitOptions } from "./sensor.js";
43
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAC5D,YAAY,EAAE,MAAM,EAAE,aAAa,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAE9F,OAAO,EACL,aAAa,IAAI,OAAO,EACxB,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAEjE,OAAO,EACL,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,SAAS,GACV,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Attune Node.js SDK — helpers for building actions and sensors.
3
+ *
4
+ * Quick start for actions:
5
+ *
6
+ * import { runAction } from "attune-sdk";
7
+ *
8
+ * function main(params: { name: string; count?: number }) {
9
+ * return { greeting: `Hello, ${params.name}!`.repeat(params.count ?? 1) };
10
+ * }
11
+ *
12
+ * runAction(main);
13
+ *
14
+ * Quick start for sensors:
15
+ *
16
+ * import { PollingSensor, runSensor, RuleState } from "attune-sdk";
17
+ *
18
+ * class MySensor extends PollingSensor {
19
+ * interval = 5000;
20
+ * async poll(rule: RuleState) {
21
+ * this.emit({ value: 42 }, { rule });
22
+ * }
23
+ * }
24
+ *
25
+ * runSensor(MySensor);
26
+ *
27
+ * Access execution context anywhere:
28
+ *
29
+ * import { context, sensorContext } from "attune-sdk";
30
+ * console.log(context.executionId); // action context
31
+ * console.log(sensorContext.sensorRef); // sensor context
32
+ */
33
+ export { runAction } from "./action.js";
34
+ export { AttuneClient } from "./client.js";
35
+ export { createClient } from "./api_client/client/index.js";
36
+ export { actionContext as context, actionContext, sensorContext, } from "./context.js";
37
+ export { Sensor, PollingSensor, AsyncPollingSensor, runSensor, } from "./sensor.js";
38
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAG5D,OAAO,EACL,aAAa,IAAI,OAAO,EACxB,aAAa,EACb,aAAa,GACd,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,MAAM,EACN,aAAa,EACb,kBAAkB,EAClB,SAAS,GACV,MAAM,aAAa,CAAC"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Sensor base classes — lifecycle management, rule change hooks, event emission,
3
+ * signal handling, and polling helpers.
4
+ *
5
+ * Architecture:
6
+ *
7
+ * Sensor (base — custom event loops)
8
+ * ├── PollingSensor (synchronous polling with setInterval per rule)
9
+ * └── AsyncPollingSensor (async polling with per-rule loops)
10
+ *
11
+ * Quick start — polling:
12
+ *
13
+ * import { PollingSensor, runSensor } from "attune-sdk";
14
+ *
15
+ * class TempSensor extends PollingSensor {
16
+ * interval = 5000;
17
+ * async poll(rule: RuleState) {
18
+ * const temp = readTemp(rule.triggerParams.device);
19
+ * if (temp > 100) this.emit({ temperature: temp }, { rule });
20
+ * }
21
+ * }
22
+ *
23
+ * runSensor(TempSensor);
24
+ */
25
+ import { type SensorContext } from "./context.js";
26
+ import WebSocket from "ws";
27
+ export interface RuleState {
28
+ ruleId: number;
29
+ ruleRef: string;
30
+ triggerRef: string;
31
+ triggerParams: Record<string, unknown>;
32
+ enabled: boolean;
33
+ }
34
+ declare class Logger {
35
+ private level;
36
+ private sensorRef;
37
+ constructor(sensorRef: string, level: string);
38
+ private write;
39
+ debug(message: string, extra?: Record<string, unknown>): void;
40
+ info(message: string, extra?: Record<string, unknown>): void;
41
+ warn(message: string, extra?: Record<string, unknown>): void;
42
+ error(message: string, extra?: Record<string, unknown>): void;
43
+ }
44
+ export interface EmitOptions {
45
+ rule?: RuleState;
46
+ triggerRef?: string;
47
+ targetRule?: boolean;
48
+ }
49
+ export declare class Sensor {
50
+ readonly context: SensorContext;
51
+ readonly logger: Logger;
52
+ protected _shutdownRequested: boolean;
53
+ protected _rules: Map<number, RuleState>;
54
+ constructor();
55
+ get isShuttingDown(): boolean;
56
+ get rules(): Map<number, RuleState>;
57
+ get config(): Record<string, string>;
58
+ private getCurrentTokenState;
59
+ private getHttpHeaders;
60
+ emit(payload: Record<string, unknown>, options?: EmitOptions): Promise<number | null>;
61
+ /** Called once before the main loop starts. Override to initialize resources. */
62
+ setup(): Promise<void>;
63
+ /** Called once during shutdown. Override to release resources. */
64
+ cleanup(): Promise<void>;
65
+ /** Main sensor loop. Override for custom event-driven sensors. */
66
+ run(): Promise<void>;
67
+ onRuleCreated(_rule: RuleState): void;
68
+ onRuleEnabled(rule: RuleState): void;
69
+ onRuleDisabled(_rule: RuleState): void;
70
+ onRuleDeleted(rule: RuleState): void;
71
+ onRuleUpdated(rule: RuleState, _oldParams: Record<string, unknown>): void;
72
+ _handleRuleMessage(message: Record<string, unknown>): Promise<void>;
73
+ private _fetchCurrentRule;
74
+ _handleNotifierEnvelope(data: WebSocket.RawData): Promise<void>;
75
+ _getManagedTriggerFilters(): string[];
76
+ _bootstrapRules(): void;
77
+ private _notifierConnection;
78
+ private _notifierLoop;
79
+ private _notifierMessageQueue;
80
+ _startNotifierConsumer(): Promise<boolean>;
81
+ private _notifierConsumeLoop;
82
+ private _connectNotifier;
83
+ private _installSignalHandlers;
84
+ shutdown(): void;
85
+ _runLifecycle(): Promise<number>;
86
+ }
87
+ export declare class PollingSensor extends Sensor {
88
+ /** Default polling interval in milliseconds. */
89
+ interval: number;
90
+ private _pollTimers;
91
+ private _running;
92
+ /** Called periodically for each active rule. Override to check for events. */
93
+ poll(_rule: RuleState): Promise<void>;
94
+ protected _getRuleInterval(rule: RuleState): number;
95
+ private _startPollTimer;
96
+ private _stopPollTimer;
97
+ onRuleCreated(rule: RuleState): void;
98
+ onRuleEnabled(rule: RuleState): void;
99
+ onRuleDisabled(rule: RuleState): void;
100
+ onRuleDeleted(rule: RuleState): void;
101
+ onRuleUpdated(rule: RuleState, _oldParams: Record<string, unknown>): void;
102
+ run(): Promise<void>;
103
+ cleanup(): Promise<void>;
104
+ }
105
+ export declare class AsyncPollingSensor extends Sensor {
106
+ /** Default polling interval in milliseconds. */
107
+ interval: number;
108
+ private _pollAbortControllers;
109
+ private _pollPromises;
110
+ private _running;
111
+ /** Called periodically for each active rule (async). Override to check for events. */
112
+ poll(_rule: RuleState): Promise<void>;
113
+ protected _getRuleInterval(rule: RuleState): number;
114
+ private _startPollTask;
115
+ private _pollLoop;
116
+ private _cancelPollTask;
117
+ onRuleCreated(rule: RuleState): void;
118
+ onRuleEnabled(rule: RuleState): void;
119
+ onRuleDisabled(rule: RuleState): void;
120
+ onRuleDeleted(rule: RuleState): void;
121
+ onRuleUpdated(rule: RuleState, _oldParams: Record<string, unknown>): void;
122
+ run(): Promise<void>;
123
+ cleanup(): Promise<void>;
124
+ }
125
+ export declare function runSensor(SensorClass: new () => Sensor): Promise<void>;
126
+ export {};
127
+ //# sourceMappingURL=sensor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sensor.d.ts","sourceRoot":"","sources":["../src/sensor.ts"],"names":[],"mappings":"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"}