@goondan/cli 0.0.3-alpha1

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 (124) hide show
  1. package/dist/bin.d.ts +2 -0
  2. package/dist/bin.js +148 -0
  3. package/dist/bin.js.map +1 -0
  4. package/dist/commands/context.d.ts +8 -0
  5. package/dist/commands/context.js +2 -0
  6. package/dist/commands/context.js.map +1 -0
  7. package/dist/commands/doctor.d.ts +12 -0
  8. package/dist/commands/doctor.js +7 -0
  9. package/dist/commands/doctor.js.map +1 -0
  10. package/dist/commands/init.d.ts +12 -0
  11. package/dist/commands/init.js +29 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/instance-interactive.d.ts +19 -0
  14. package/dist/commands/instance-interactive.js +259 -0
  15. package/dist/commands/instance-interactive.js.map +1 -0
  16. package/dist/commands/instance.d.ts +30 -0
  17. package/dist/commands/instance.js +36 -0
  18. package/dist/commands/instance.js.map +1 -0
  19. package/dist/commands/logs.d.ts +12 -0
  20. package/dist/commands/logs.js +23 -0
  21. package/dist/commands/logs.js.map +1 -0
  22. package/dist/commands/package.d.ts +30 -0
  23. package/dist/commands/package.js +51 -0
  24. package/dist/commands/package.js.map +1 -0
  25. package/dist/commands/restart.d.ts +12 -0
  26. package/dist/commands/restart.js +14 -0
  27. package/dist/commands/restart.js.map +1 -0
  28. package/dist/commands/run.d.ts +12 -0
  29. package/dist/commands/run.js +33 -0
  30. package/dist/commands/run.js.map +1 -0
  31. package/dist/commands/validate.d.ts +12 -0
  32. package/dist/commands/validate.js +22 -0
  33. package/dist/commands/validate.js.map +1 -0
  34. package/dist/constants.d.ts +2 -0
  35. package/dist/constants.js +3 -0
  36. package/dist/constants.js.map +1 -0
  37. package/dist/errors.d.ts +22 -0
  38. package/dist/errors.js +93 -0
  39. package/dist/errors.js.map +1 -0
  40. package/dist/formatter.d.ts +7 -0
  41. package/dist/formatter.js +141 -0
  42. package/dist/formatter.js.map +1 -0
  43. package/dist/help.d.ts +1 -0
  44. package/dist/help.js +25 -0
  45. package/dist/help.js.map +1 -0
  46. package/dist/index.d.ts +6 -0
  47. package/dist/index.js +9 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/options.d.ts +13 -0
  50. package/dist/options.js +57 -0
  51. package/dist/options.js.map +1 -0
  52. package/dist/parser.d.ts +85 -0
  53. package/dist/parser.js +123 -0
  54. package/dist/parser.js.map +1 -0
  55. package/dist/router.d.ts +2 -0
  56. package/dist/router.js +130 -0
  57. package/dist/router.js.map +1 -0
  58. package/dist/services/config.d.ts +13 -0
  59. package/dist/services/config.js +141 -0
  60. package/dist/services/config.js.map +1 -0
  61. package/dist/services/conversation-state.d.ts +20 -0
  62. package/dist/services/conversation-state.js +198 -0
  63. package/dist/services/conversation-state.js.map +1 -0
  64. package/dist/services/defaults.d.ts +2 -0
  65. package/dist/services/defaults.js +92 -0
  66. package/dist/services/defaults.js.map +1 -0
  67. package/dist/services/doctor.d.ts +8 -0
  68. package/dist/services/doctor.js +160 -0
  69. package/dist/services/doctor.js.map +1 -0
  70. package/dist/services/env.d.ts +6 -0
  71. package/dist/services/env.js +76 -0
  72. package/dist/services/env.js.map +1 -0
  73. package/dist/services/init.d.ts +4 -0
  74. package/dist/services/init.js +174 -0
  75. package/dist/services/init.js.map +1 -0
  76. package/dist/services/instances.d.ts +7 -0
  77. package/dist/services/instances.js +393 -0
  78. package/dist/services/instances.js.map +1 -0
  79. package/dist/services/logs.d.ts +6 -0
  80. package/dist/services/logs.js +131 -0
  81. package/dist/services/logs.js.map +1 -0
  82. package/dist/services/package.d.ts +11 -0
  83. package/dist/services/package.js +630 -0
  84. package/dist/services/package.js.map +1 -0
  85. package/dist/services/path.d.ts +5 -0
  86. package/dist/services/path.js +25 -0
  87. package/dist/services/path.js.map +1 -0
  88. package/dist/services/registry.d.ts +12 -0
  89. package/dist/services/registry.js +219 -0
  90. package/dist/services/registry.js.map +1 -0
  91. package/dist/services/runtime-restart-signal.d.ts +5 -0
  92. package/dist/services/runtime-restart-signal.js +18 -0
  93. package/dist/services/runtime-restart-signal.js.map +1 -0
  94. package/dist/services/runtime-restart.d.ts +11 -0
  95. package/dist/services/runtime-restart.js +151 -0
  96. package/dist/services/runtime-restart.js.map +1 -0
  97. package/dist/services/runtime-routing.d.ts +40 -0
  98. package/dist/services/runtime-routing.js +154 -0
  99. package/dist/services/runtime-routing.js.map +1 -0
  100. package/dist/services/runtime-runner-connector-child.d.ts +1 -0
  101. package/dist/services/runtime-runner-connector-child.js +188 -0
  102. package/dist/services/runtime-runner-connector-child.js.map +1 -0
  103. package/dist/services/runtime-runner-protocol.d.ts +12 -0
  104. package/dist/services/runtime-runner-protocol.js +14 -0
  105. package/dist/services/runtime-runner-protocol.js.map +1 -0
  106. package/dist/services/runtime-runner.d.ts +1 -0
  107. package/dist/services/runtime-runner.js +2595 -0
  108. package/dist/services/runtime-runner.js.map +1 -0
  109. package/dist/services/runtime.d.ts +10 -0
  110. package/dist/services/runtime.js +569 -0
  111. package/dist/services/runtime.js.map +1 -0
  112. package/dist/services/turn-policy.d.ts +7 -0
  113. package/dist/services/turn-policy.js +13 -0
  114. package/dist/services/turn-policy.js.map +1 -0
  115. package/dist/services/validator.d.ts +6 -0
  116. package/dist/services/validator.js +126 -0
  117. package/dist/services/validator.js.map +1 -0
  118. package/dist/types.d.ts +243 -0
  119. package/dist/types.js +2 -0
  120. package/dist/types.js.map +1 -0
  121. package/dist/utils.d.ts +7 -0
  122. package/dist/utils.js +72 -0
  123. package/dist/utils.js.map +1 -0
  124. package/package.json +30 -0
@@ -0,0 +1,154 @@
1
+ import path from 'node:path';
2
+ import { isJsonObject } from '@goondan/runtime';
3
+ function safeJsonStringify(value) {
4
+ try {
5
+ return JSON.stringify(value);
6
+ }
7
+ catch {
8
+ return String(value);
9
+ }
10
+ }
11
+ export function parseConnectorEventPayload(event) {
12
+ if (!isJsonObject(event)) {
13
+ return undefined;
14
+ }
15
+ const name = typeof event.name === 'string' ? event.name : undefined;
16
+ const instanceKey = typeof event.instanceKey === 'string' ? event.instanceKey : undefined;
17
+ if (!name || !instanceKey) {
18
+ return undefined;
19
+ }
20
+ let messageText = '';
21
+ const message = event.message;
22
+ if (isJsonObject(message)) {
23
+ const messageType = message.type;
24
+ if (messageType === 'text' && typeof message.text === 'string') {
25
+ messageText = message.text;
26
+ }
27
+ else if (messageType === 'image' && typeof message.url === 'string') {
28
+ messageText = `[image] ${message.url}`;
29
+ }
30
+ else if (messageType === 'file' && typeof message.url === 'string') {
31
+ const fileName = typeof message.name === 'string' ? message.name : 'file';
32
+ messageText = `[file:${fileName}] ${message.url}`;
33
+ }
34
+ }
35
+ const properties = {};
36
+ if (isJsonObject(event.properties)) {
37
+ for (const [key, value] of Object.entries(event.properties)) {
38
+ if (typeof value === 'string') {
39
+ properties[key] = value;
40
+ }
41
+ }
42
+ }
43
+ return {
44
+ name,
45
+ instanceKey,
46
+ messageText,
47
+ properties,
48
+ };
49
+ }
50
+ export function parseAgentToolEventPayload(event, fallbackInstanceKey, fallbackSourceName) {
51
+ if (!isJsonObject(event)) {
52
+ return undefined;
53
+ }
54
+ const id = typeof event.id === 'string' && event.id.length > 0 ? event.id : `agent-event-${Date.now()}`;
55
+ const type = typeof event.type === 'string' && event.type.length > 0 ? event.type : 'agent.request';
56
+ const instanceKey = typeof event.instanceKey === 'string' && event.instanceKey.length > 0
57
+ ? event.instanceKey
58
+ : fallbackInstanceKey;
59
+ const messageText = typeof event.input === 'string' ? event.input : '';
60
+ let sourceName = fallbackSourceName;
61
+ if (isJsonObject(event.source) && typeof event.source.name === 'string' && event.source.name.length > 0) {
62
+ sourceName = event.source.name;
63
+ }
64
+ const metadata = isJsonObject(event.metadata) ? event.metadata : undefined;
65
+ let correlationId;
66
+ if (isJsonObject(event.replyTo) && typeof event.replyTo.correlationId === 'string' && event.replyTo.correlationId.length > 0) {
67
+ correlationId = event.replyTo.correlationId;
68
+ }
69
+ return {
70
+ id,
71
+ type,
72
+ instanceKey,
73
+ messageText,
74
+ sourceName,
75
+ metadata,
76
+ correlationId,
77
+ };
78
+ }
79
+ export function formatRuntimeInboundUserText(input) {
80
+ const contextPayload = {
81
+ source: {
82
+ kind: input.sourceKind,
83
+ name: input.sourceName,
84
+ },
85
+ event: input.eventName,
86
+ instanceKey: input.instanceKey,
87
+ properties: input.properties ?? {},
88
+ metadata: input.metadata ?? {},
89
+ };
90
+ const contextHeader = safeJsonStringify(contextPayload);
91
+ if (input.messageText.length === 0) {
92
+ return ['[goondan_context]', contextHeader, '[/goondan_context]'].join('\n');
93
+ }
94
+ return ['[goondan_context]', contextHeader, '[/goondan_context]', input.messageText].join('\n');
95
+ }
96
+ export function resolveRuntimeWorkdir(baseWorkdir, cwd) {
97
+ if (!cwd || cwd.trim().length === 0) {
98
+ return baseWorkdir;
99
+ }
100
+ if (path.isAbsolute(cwd)) {
101
+ return cwd;
102
+ }
103
+ return path.join(baseWorkdir, cwd);
104
+ }
105
+ export function selectTargetAgentName(rules, defaultAgentName, event) {
106
+ const rule = selectMatchingIngressRule(rules, event);
107
+ if (rule?.agentName && rule.agentName.length > 0) {
108
+ return rule.agentName;
109
+ }
110
+ return defaultAgentName;
111
+ }
112
+ export function selectMatchingIngressRule(rules, event) {
113
+ for (const rule of rules) {
114
+ if (rule.eventName && rule.eventName !== event.name) {
115
+ continue;
116
+ }
117
+ if (rule.properties) {
118
+ let matched = true;
119
+ for (const [key, expected] of Object.entries(rule.properties)) {
120
+ if (event.properties[key] !== expected) {
121
+ matched = false;
122
+ break;
123
+ }
124
+ }
125
+ if (!matched) {
126
+ continue;
127
+ }
128
+ }
129
+ return rule;
130
+ }
131
+ return undefined;
132
+ }
133
+ export function resolveInboundInstanceKey(rule, event) {
134
+ if (!rule) {
135
+ return event.instanceKey;
136
+ }
137
+ const staticInstanceKey = rule.instanceKey;
138
+ if (typeof staticInstanceKey === 'string' && staticInstanceKey.trim().length > 0) {
139
+ return staticInstanceKey.trim();
140
+ }
141
+ const propertyName = rule.instanceKeyProperty;
142
+ if (typeof propertyName === 'string' && propertyName.trim().length > 0) {
143
+ const propertyValue = event.properties[propertyName.trim()];
144
+ if (typeof propertyValue === 'string' && propertyValue.trim().length > 0) {
145
+ const prefixValue = rule.instanceKeyPrefix;
146
+ if (typeof prefixValue === 'string' && prefixValue.trim().length > 0) {
147
+ return `${prefixValue.trim()}${propertyValue.trim()}`;
148
+ }
149
+ return propertyValue.trim();
150
+ }
151
+ }
152
+ return event.instanceKey;
153
+ }
154
+ //# sourceMappingURL=runtime-routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-routing.js","sourceRoot":"","sources":["../../src/services/runtime-routing.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAmB,MAAM,kBAAkB,CAAC;AAsCjE,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACvD,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QACjC,IAAI,WAAW,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC/D,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;QAC7B,CAAC;aAAM,IAAI,WAAW,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACtE,WAAW,GAAG,WAAW,OAAO,CAAC,GAAG,EAAE,CAAC;QACzC,CAAC;aAAM,IAAI,WAAW,KAAK,MAAM,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrE,MAAM,QAAQ,GAAG,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1E,WAAW,GAAG,SAAS,QAAQ,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC;QACpD,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,IAAI,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,UAAU,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI;QACJ,WAAW;QACX,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,KAAc,EACd,mBAA2B,EAC3B,kBAA0B;IAE1B,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACxG,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;IACpG,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;QACvF,CAAC,CAAC,KAAK,CAAC,WAAW;QACnB,CAAC,CAAC,mBAAmB,CAAC;IACxB,MAAM,WAAW,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAEvE,IAAI,UAAU,GAAG,kBAAkB,CAAC;IACpC,IAAI,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxG,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,IAAI,aAAiC,CAAC;IACtC,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,CAAC,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7H,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,EAAE;QACF,IAAI;QACJ,WAAW;QACX,WAAW;QACX,UAAU;QACV,QAAQ;QACR,aAAa;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,KAA4B;IACvE,MAAM,cAAc,GAAG;QACrB,MAAM,EAAE;YACN,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,IAAI,EAAE,KAAK,CAAC,UAAU;SACvB;QACD,KAAK,EAAE,KAAK,CAAC,SAAS;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;QAClC,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,EAAE;KAC/B,CAAC;IAEF,MAAM,aAAa,GAAG,iBAAiB,CAAC,cAAc,CAAC,CAAC;IACxD,IAAI,KAAK,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/E,CAAC;IAED,OAAO,CAAC,mBAAmB,EAAE,aAAa,EAAE,oBAAoB,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClG,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,WAAmB,EAAE,GAAY;IACrE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAAyB,EACzB,gBAAwB,EACxB,KAA2B;IAE3B,MAAM,IAAI,GAAG,yBAAyB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrD,IAAI,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjD,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,OAAO,gBAAgB,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,KAAyB,EACzB,KAA2B;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,OAAO,GAAG,IAAI,CAAC;YACnB,KAAK,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;oBACvC,OAAO,GAAG,KAAK,CAAC;oBAChB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,IAAkC,EAClC,KAA2B;IAE3B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,KAAK,CAAC,WAAW,CAAC;IAC3B,CAAC;IAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,WAAW,CAAC;IAC3C,IAAI,OAAO,iBAAiB,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACjF,OAAO,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAClC,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,mBAAmB,CAAC;IAC9C,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvE,MAAM,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5D,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzE,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC3C,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrE,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,CAAC;YACD,OAAO,aAAa,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,WAAW,CAAC;AAC3B,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,188 @@
1
+ import { Console } from 'node:console';
2
+ import { pathToFileURL } from 'node:url';
3
+ import { isJsonObject } from '@goondan/runtime';
4
+ let runningConnector;
5
+ let shutdownRequested = false;
6
+ function isStringRecord(value) {
7
+ if (!isJsonObject(value)) {
8
+ return false;
9
+ }
10
+ for (const item of Object.values(value)) {
11
+ if (typeof item !== 'string') {
12
+ return false;
13
+ }
14
+ }
15
+ return true;
16
+ }
17
+ function isConnectorChildStartMessage(message) {
18
+ if (!isJsonObject(message)) {
19
+ return false;
20
+ }
21
+ return (message.type === 'connector_start' &&
22
+ typeof message.connectorEntryPath === 'string' &&
23
+ typeof message.connectionName === 'string' &&
24
+ typeof message.connectorName === 'string' &&
25
+ isStringRecord(message.config) &&
26
+ isStringRecord(message.secrets));
27
+ }
28
+ function isConnectorChildShutdownMessage(message) {
29
+ if (!isJsonObject(message)) {
30
+ return false;
31
+ }
32
+ return message.type === 'connector_shutdown';
33
+ }
34
+ function isConnectorRunner(value) {
35
+ return typeof value === 'function';
36
+ }
37
+ function pendingProbe() {
38
+ return { state: 'pending' };
39
+ }
40
+ function resolvedProbe() {
41
+ return { state: 'resolved' };
42
+ }
43
+ function rejectedProbe(error) {
44
+ return { state: 'rejected', error };
45
+ }
46
+ function sendMessage(message) {
47
+ if (typeof process.send === 'function') {
48
+ process.send(message);
49
+ }
50
+ }
51
+ function unknownToErrorMessage(error) {
52
+ if (error instanceof Error) {
53
+ return error.message;
54
+ }
55
+ return String(error);
56
+ }
57
+ function createConnectorLogger(connectionName, connectorName) {
58
+ const prefix = `[goondan-runtime][${connectionName}/${connectorName}]`;
59
+ const logger = new Console({ stdout: process.stdout, stderr: process.stderr });
60
+ logger.debug = (...args) => {
61
+ console.debug(prefix, ...args);
62
+ };
63
+ logger.info = (...args) => {
64
+ console.info(prefix, ...args);
65
+ };
66
+ logger.warn = (...args) => {
67
+ console.warn(prefix, ...args);
68
+ };
69
+ logger.error = (...args) => {
70
+ console.error(prefix, ...args);
71
+ };
72
+ return logger;
73
+ }
74
+ async function importConnectorRunner(entryPath) {
75
+ const loaded = await import(pathToFileURL(entryPath).href);
76
+ if (!isJsonObject(loaded)) {
77
+ throw new Error(`Connector 모듈 로드 결과가 객체가 아닙니다: ${entryPath}`);
78
+ }
79
+ const defaultExport = loaded.default;
80
+ if (!isConnectorRunner(defaultExport)) {
81
+ throw new Error(`Connector 모듈 default export가 함수가 아닙니다: ${entryPath}`);
82
+ }
83
+ return defaultExport;
84
+ }
85
+ async function probeConnectorStartup(connectionName, connectorName, execution) {
86
+ const outcome = await Promise.race([
87
+ execution.then(() => resolvedProbe()).catch((error) => rejectedProbe(error)),
88
+ new Promise((resolve) => {
89
+ setTimeout(() => resolve(pendingProbe()), 0);
90
+ }),
91
+ ]);
92
+ if (outcome.state === 'pending') {
93
+ return;
94
+ }
95
+ if (outcome.state === 'resolved') {
96
+ throw new Error(`Connector/${connectorName} (connection=${connectionName})가 시작 직후 종료되었습니다.`);
97
+ }
98
+ throw new Error(`Connector/${connectorName} (connection=${connectionName}) 시작 실패: ${unknownToErrorMessage(outcome.error)}`);
99
+ }
100
+ function monitorConnectorExit(connectionName, connectorName, execution) {
101
+ void execution
102
+ .then(() => {
103
+ process.exit(0);
104
+ })
105
+ .catch((error) => {
106
+ console.error(`[goondan-runtime][${connectionName}/${connectorName}] connector child failed: ${unknownToErrorMessage(error)}`);
107
+ process.exit(1);
108
+ });
109
+ }
110
+ function sendStartedMessage() {
111
+ const message = {
112
+ type: 'connector_started',
113
+ };
114
+ sendMessage(message);
115
+ }
116
+ function sendStartErrorMessage(messageText) {
117
+ const message = {
118
+ type: 'connector_start_error',
119
+ message: messageText,
120
+ };
121
+ sendMessage(message);
122
+ }
123
+ function shutdownChild() {
124
+ shutdownRequested = true;
125
+ process.exit(0);
126
+ }
127
+ async function startConnector(message) {
128
+ if (!isConnectorChildStartMessage(message)) {
129
+ sendStartErrorMessage('connector_start 메시지 형식이 올바르지 않습니다.');
130
+ process.exit(1);
131
+ return;
132
+ }
133
+ if (runningConnector) {
134
+ sendStartErrorMessage('Connector child는 하나의 connector만 실행할 수 있습니다.');
135
+ process.exit(1);
136
+ return;
137
+ }
138
+ const logger = createConnectorLogger(message.connectionName, message.connectorName);
139
+ const context = {
140
+ emit: async (event) => {
141
+ const eventMessage = {
142
+ type: 'connector_event',
143
+ event,
144
+ };
145
+ sendMessage(eventMessage);
146
+ },
147
+ config: message.config,
148
+ secrets: message.secrets,
149
+ logger,
150
+ };
151
+ try {
152
+ const runConnector = await importConnectorRunner(message.connectorEntryPath);
153
+ const execution = runConnector(context);
154
+ await probeConnectorStartup(message.connectionName, message.connectorName, execution);
155
+ runningConnector = {
156
+ connectionName: message.connectionName,
157
+ connectorName: message.connectorName,
158
+ execution,
159
+ };
160
+ sendStartedMessage();
161
+ monitorConnectorExit(message.connectionName, message.connectorName, execution);
162
+ }
163
+ catch (error) {
164
+ sendStartErrorMessage(unknownToErrorMessage(error));
165
+ process.exit(1);
166
+ }
167
+ }
168
+ function onIpcMessage(message) {
169
+ if (isConnectorChildShutdownMessage(message)) {
170
+ shutdownChild();
171
+ return;
172
+ }
173
+ if (isConnectorChildStartMessage(message)) {
174
+ void startConnector(message);
175
+ }
176
+ }
177
+ process.on('message', onIpcMessage);
178
+ process.once('SIGINT', shutdownChild);
179
+ process.once('SIGTERM', shutdownChild);
180
+ if (!shutdownRequested) {
181
+ setTimeout(() => {
182
+ if (!runningConnector) {
183
+ sendStartErrorMessage('connector_start 메시지를 받지 못했습니다.');
184
+ process.exit(1);
185
+ }
186
+ }, 5_000);
187
+ }
188
+ //# sourceMappingURL=runtime-runner-connector-child.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-runner-connector-child.js","sourceRoot":"","sources":["../../src/services/runtime-runner-connector-child.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export interface RunnerReadyMessage {
2
+ type: 'ready';
3
+ instanceKey: string;
4
+ pid: number;
5
+ }
6
+ export interface RunnerStartErrorMessage {
7
+ type: 'start_error';
8
+ message: string;
9
+ }
10
+ export type RunnerMessage = RunnerReadyMessage | RunnerStartErrorMessage;
11
+ export declare function isRunnerReadyMessage(message: unknown): message is RunnerReadyMessage;
12
+ export declare function isRunnerStartErrorMessage(message: unknown): message is RunnerStartErrorMessage;
@@ -0,0 +1,14 @@
1
+ import { isObjectRecord } from '../utils.js';
2
+ export function isRunnerReadyMessage(message) {
3
+ if (!isObjectRecord(message)) {
4
+ return false;
5
+ }
6
+ return message.type === 'ready' && typeof message.instanceKey === 'string' && typeof message.pid === 'number';
7
+ }
8
+ export function isRunnerStartErrorMessage(message) {
9
+ if (!isObjectRecord(message)) {
10
+ return false;
11
+ }
12
+ return message.type === 'start_error' && typeof message.message === 'string';
13
+ }
14
+ //# sourceMappingURL=runtime-runner-protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-runner-protocol.js","sourceRoot":"","sources":["../../src/services/runtime-runner-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAe7C,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,KAAK,OAAO,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,GAAG,KAAK,QAAQ,CAAC;AAChH,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACxD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC;AAC/E,CAAC"}
@@ -0,0 +1 @@
1
+ export {};