me2lon 0.0.0-stage → 0.1.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 (67) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -2
  3. package/dist/api.d.ts +35 -0
  4. package/dist/api.d.ts.map +1 -0
  5. package/dist/api.js +286 -0
  6. package/dist/api.js.map +1 -0
  7. package/dist/cli.d.ts +4 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +261 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/client.d.ts +23 -0
  12. package/dist/client.d.ts.map +1 -0
  13. package/dist/client.js +272 -0
  14. package/dist/client.js.map +1 -0
  15. package/dist/config.d.ts +19 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +173 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/errors.d.ts +14 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +31 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +8 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +8 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/presentation.d.ts +12 -0
  28. package/dist/presentation.d.ts.map +1 -0
  29. package/dist/presentation.js +50 -0
  30. package/dist/presentation.js.map +1 -0
  31. package/dist/safe-output.d.ts +20 -0
  32. package/dist/safe-output.d.ts.map +1 -0
  33. package/dist/safe-output.js +770 -0
  34. package/dist/safe-output.js.map +1 -0
  35. package/dist/setup.d.ts +14 -0
  36. package/dist/setup.d.ts.map +1 -0
  37. package/dist/setup.js +92 -0
  38. package/dist/setup.js.map +1 -0
  39. package/dist/skill.d.ts +2 -0
  40. package/dist/skill.d.ts.map +1 -0
  41. package/dist/skill.js +30 -0
  42. package/dist/skill.js.map +1 -0
  43. package/dist/types.d.ts +76 -0
  44. package/dist/types.d.ts.map +1 -0
  45. package/dist/types.js +8 -0
  46. package/dist/types.js.map +1 -0
  47. package/dist/workspace-source.d.ts +11 -0
  48. package/dist/workspace-source.d.ts.map +1 -0
  49. package/dist/workspace-source.js +387 -0
  50. package/dist/workspace-source.js.map +1 -0
  51. package/package.json +43 -4
  52. package/skill/LICENSE +21 -0
  53. package/skill/SKILL.md +18 -0
  54. package/src/api.ts +426 -0
  55. package/src/cli.ts +305 -0
  56. package/src/client.ts +413 -0
  57. package/src/config.ts +252 -0
  58. package/src/errors.ts +40 -0
  59. package/src/index.ts +37 -0
  60. package/src/presentation.ts +39 -0
  61. package/src/safe-output.ts +826 -0
  62. package/src/setup.ts +95 -0
  63. package/src/skill.ts +22 -0
  64. package/src/types.ts +85 -0
  65. package/src/workspace-source.ts +526 -0
  66. package/tsconfig.build.json +18 -0
  67. package/tsconfig.json +14 -0
package/src/index.ts ADDED
@@ -0,0 +1,37 @@
1
+ export {
2
+ Me2lonAgentApi,
3
+ idempotencyKey,
4
+ mutationAttemptId,
5
+ } from "./api.js";
6
+ export { Me2lonAgentClient, type PolicyProposalInput } from "./client.js";
7
+ export {
8
+ readConfigFile,
9
+ resolveRuntimeConfig,
10
+ type RuntimeConfigOverrides,
11
+ } from "./config.js";
12
+ export { Me2lonApiError, Me2lonClientError } from "./errors.js";
13
+ export {
14
+ assertNoForbiddenOutput,
15
+ projectCapabilities,
16
+ projectJob,
17
+ projectPolicy,
18
+ projectPolicyProposal,
19
+ projectPolicyUnits,
20
+ projectPolicyValidation,
21
+ safeJsonText,
22
+ } from "./safe-output.js";
23
+ export {
24
+ LOCAL_SOURCE_LIMITS,
25
+ SOURCE_SCHEMA_VERSION,
26
+ type AgentRuntimeConfig,
27
+ type BoundWorkspace,
28
+ type ConfigFileShape,
29
+ type DeleteChange,
30
+ type JsonValue,
31
+ type ReplaceChange,
32
+ type SafeToolResult,
33
+ type SourceChange,
34
+ type SourceLimits,
35
+ type WorkspaceSource,
36
+ } from "./types.js";
37
+ export { bindWorkspace, buildWorkspaceSource } from "./workspace-source.js";
@@ -0,0 +1,39 @@
1
+ import { Me2lonClientError } from "./errors.js";
2
+ import type { SafeToolResult, JsonValue } from './types.js';
3
+
4
+ export function humanOutput(value: JsonValue, depth = 0): string {
5
+ if (value === null) return 'none';
6
+ if (typeof value !== 'object') return String(value);
7
+ const entries = Array.isArray(value) ? value.map((item, i) => [String(i + 1), item] as const) : Object.entries(value);
8
+ return entries.map(([key, item]) => `${' '.repeat(depth)}${key}: ${item !== null && typeof item === 'object' ? '\n' + humanOutput(item, depth + 1) : String(item)}`).join('\n');
9
+ }
10
+
11
+ export async function waitForJob(initial: SafeToolResult, getJob: (id: string) => Promise<SafeToolResult>, options: {
12
+ timeoutMs: number; signal?: AbortSignal; notify: (message: string) => void;
13
+ intervalMs?: number;
14
+ }): Promise<{ result: SafeToolResult; exitCode: number }> {
15
+ let result = initial;
16
+ const id = result.id ?? result.jobId;
17
+ if (typeof id !== 'string') throw new Me2lonClientError("ME2LON_CLIENT_INPUT", 'The server did not return a job ID.');
18
+ const deadline = Date.now() + options.timeoutMs;
19
+ let previousProgress = "";
20
+ const resume = `Resume: me2lon get-job --job-id ${id} --wait`;
21
+ for (;;) {
22
+ if (result.jobStatus === 'succeeded') return { result, exitCode: 0 };
23
+ if (result.jobStatus === 'failed' || result.jobStatus === 'canceled') return { result, exitCode: 1 };
24
+ if (options.signal?.aborted) { options.notify(resume); return { result, exitCode: 130 }; }
25
+ if (Date.now() >= deadline) { options.notify(resume); return { result, exitCode: 124 }; }
26
+ if (result.jobStatus !== 'queued' && result.jobStatus !== 'running') throw new Me2lonClientError("ME2LON_CLIENT_INPUT", 'Unknown job lifecycle status.');
27
+ const progress = result.progress;
28
+ const stage = progress && typeof progress === 'object' && !Array.isArray(progress) ? progress.stage : undefined;
29
+ const completed = progress && typeof progress === 'object' && !Array.isArray(progress) ? progress.completedStages : undefined;
30
+ const message = `Job ${id}: ${result.jobStatus}${typeof stage === 'string' ? ` — ${stage}` : ''}${typeof completed === 'number' ? ` (${completed} stages completed)` : ''}`;
31
+ if (message !== previousProgress) { options.notify(message); previousProgress = message; }
32
+ await new Promise<void>((resolve) => {
33
+ const done = () => { clearTimeout(timer); options.signal?.removeEventListener('abort', done); resolve(); };
34
+ const timer = setTimeout(done, Math.min(options.intervalMs ?? 5000, deadline - Date.now()));
35
+ options.signal?.addEventListener('abort', done, { once: true });
36
+ });
37
+ if (!options.signal?.aborted && Date.now() < deadline) result = await getJob(id);
38
+ }
39
+ }