@lazyingart/agintiflow 0.20.39 → 0.20.41

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/README.md CHANGED
@@ -50,7 +50,7 @@ aginti --list-profiles
50
50
  aginti --sandbox-status
51
51
  ```
52
52
 
53
- When AgInTiFlow is installed globally from npm, normal `aginti`, `aginti chat`, `aginti resume`, and `aginti web` startup checks npm for a newer `@lazyingart/agintiflow` release at a throttled interval. If a newer version is found in an interactive terminal, AgInTiFlow shows an Up/Down selector with `Update now`, `Skip this time`, and `Skip this version`; updating runs `npm install -g @lazyingart/agintiflow@latest` and restarts the CLI once. Source checkouts and non-TTY automation skip this behavior. Force a check with `aginti update`, skip one run with `--no-auto-update`, or disable it with `AGINTIFLOW_NO_AUTO_UPDATE=1`.
53
+ When AgInTiFlow is installed globally from npm, normal `aginti`, `aginti chat`, `aginti resume`, and `aginti web` startup revalidates npm for a newer `@lazyingart/agintiflow` release before the session starts. If a newer version is found in an interactive terminal, AgInTiFlow shows an Up/Down selector with `Update now`, `Skip this time`, and `Skip this version`; updating runs `npm install -g @lazyingart/agintiflow@latest` and restarts the CLI once. Source checkouts, non-TTY automation, and utility commands skip this behavior. Force a check with `aginti update`, skip one run with `--no-auto-update`, disable it with `AGINTIFLOW_NO_AUTO_UPDATE=1`, or throttle startup checks with `AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS`.
54
54
 
55
55
  On first interactive use, if no main model key is detected, `aginti` opens an auth wizard. Use Up/Down to choose DeepSeek, OpenAI, Qwen, or Venice, paste the key, and press Enter to save it to the project-local ignored file `.aginti/.env` with `0600` permissions. The wizard points to DeepSeek keys at `https://platform.deepseek.com/api_keys`, OpenAI keys at `https://platform.openai.com/api-keys`, and Venice at `https://venice.ai`. It then offers the optional auxiliary image key; press Esc to skip. You can rerun it even when keys already exist:
56
56
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lazyingart/agintiflow",
3
- "version": "0.20.39",
3
+ "version": "0.20.41",
4
4
  "type": "module",
5
5
  "description": "AgInTiFlow is a web-first coding agent and CLI with DeepSeek routing, sandboxed tools, model providers, canvas artifacts, and optional wrappers.",
6
6
  "license": "Apache-2.0",
package/public/app.js CHANGED
@@ -15,7 +15,7 @@ const supportedLanguages = [
15
15
  const translations = {
16
16
  en: {
17
17
  documentTitle: "AgInTiFlow",
18
- brandKicker: "AI automation product by AgInTi Inc.",
18
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
19
19
  languageLabel: "Language",
20
20
  intro:
21
21
  "Web-first agent platform with smart model routing, resumable runs, guarded tools, and optional external agent wrappers.",
@@ -174,7 +174,7 @@ const translations = {
174
174
  },
175
175
  ar: {
176
176
  documentTitle: "AgInTiFlow",
177
- brandKicker: "منتج أتمتة بالذكاء الاصطناعي من AgInTi Inc.",
177
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
178
178
  languageLabel: "اللغة",
179
179
  intro:
180
180
  "وكيل متصفح مع اختيار المزوّد، تشغيل قابل للاستئناف، إعدادات محفوظة، وأداة shell محمية اختيارية مع دعم Docker sandbox.",
@@ -221,7 +221,7 @@ const translations = {
221
221
  },
222
222
  es: {
223
223
  documentTitle: "AgInTiFlow",
224
- brandKicker: "Producto de automatización IA de AgInTi Inc.",
224
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
225
225
  languageLabel: "Idioma",
226
226
  intro:
227
227
  "Agente de navegador con selección de proveedor, ejecuciones reanudables, ajustes persistentes y shell protegido opcional con Docker sandbox.",
@@ -268,7 +268,7 @@ const translations = {
268
268
  },
269
269
  fr: {
270
270
  documentTitle: "AgInTiFlow",
271
- brandKicker: "Produit d'automatisation IA par AgInTi Inc.",
271
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
272
272
  languageLabel: "Langue",
273
273
  intro:
274
274
  "Agent navigateur avec choix du fournisseur, runs reprenables, réglages persistants et outil shell gardé optionnel avec Docker sandbox.",
@@ -315,7 +315,7 @@ const translations = {
315
315
  },
316
316
  ja: {
317
317
  documentTitle: "AgInTiFlow",
318
- brandKicker: "AgInTi Inc. のAI自動化プロダクト",
318
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
319
319
  languageLabel: "言語",
320
320
  intro:
321
321
  "プロバイダー選択、再開可能な実行、保存される設定、Docker sandbox対応の保護されたshellツールを備えたブラウザエージェントです。",
@@ -362,7 +362,7 @@ const translations = {
362
362
  },
363
363
  ko: {
364
364
  documentTitle: "AgInTiFlow",
365
- brandKicker: "AgInTi Inc.의 AI 자동화 제품",
365
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
366
366
  languageLabel: "언어",
367
367
  intro:
368
368
  "제공자 선택, 재개 가능한 실행, 저장되는 설정, Docker sandbox 지원 보호 shell 도구를 갖춘 브라우저 에이전트입니다.",
@@ -409,7 +409,7 @@ const translations = {
409
409
  },
410
410
  vi: {
411
411
  documentTitle: "AgInTiFlow",
412
- brandKicker: "Sản phẩm tự động hóa AI của AgInTi Inc.",
412
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
413
413
  languageLabel: "Ngôn ngữ",
414
414
  intro:
415
415
  "Agent trình duyệt có chọn provider, phiên chạy tiếp tục được, cài đặt được lưu, và shell tool được bảo vệ tùy chọn với Docker sandbox.",
@@ -456,7 +456,7 @@ const translations = {
456
456
  },
457
457
  "zh-Hans": {
458
458
  documentTitle: "AgInTiFlow",
459
- brandKicker: "AgInTi Inc. AI 自动化产品",
459
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
460
460
  languageLabel: "语言",
461
461
  intro:
462
462
  "浏览器智能体,支持模型供应商选择、可恢复运行、持久设置,以及可选的受保护 shell 工具和 Docker 沙箱。",
@@ -503,7 +503,7 @@ const translations = {
503
503
  },
504
504
  "zh-Hant": {
505
505
  documentTitle: "AgInTiFlow",
506
- brandKicker: "AgInTi Inc. AI 自動化產品",
506
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
507
507
  languageLabel: "語言",
508
508
  intro:
509
509
  "瀏覽器智能體,支援模型供應商選擇、可恢復執行、持久設定,以及可選的受保護 shell 工具與 Docker 沙箱。",
@@ -550,7 +550,7 @@ const translations = {
550
550
  },
551
551
  de: {
552
552
  documentTitle: "AgInTiFlow",
553
- brandKicker: "KI-Automationsprodukt von AgInTi Inc.",
553
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
554
554
  languageLabel: "Sprache",
555
555
  intro:
556
556
  "Browser-Agent mit Provider-Auswahl, fortsetzbaren Läufen, gespeicherten Einstellungen und optional geschütztem Shell-Tool mit Docker-Sandbox.",
@@ -597,7 +597,7 @@ const translations = {
597
597
  },
598
598
  ru: {
599
599
  documentTitle: "AgInTiFlow",
600
- brandKicker: "AI-автоматизация от AgInTi Inc.",
600
+ brandKicker: "Developed by AgInTi Lab, LazyingArt LLC",
601
601
  languageLabel: "Язык",
602
602
  intro:
603
603
  "Браузерный агент с выбором провайдера, возобновляемыми запусками, сохраненными настройками и опциональным защищенным shell tool с Docker sandbox.",
package/public/index.html CHANGED
@@ -14,7 +14,7 @@
14
14
  <img class="brand-logo" src="/logos/logo.png" alt="AgInTiFlow logo" />
15
15
  <div>
16
16
  <h1>AgInTiFlow</h1>
17
- <p class="brand-kicker" data-i18n="brandKicker">AI automation product by AgInTi Inc.</p>
17
+ <p class="brand-kicker" data-i18n="brandKicker">Developed by AgInTi Lab, LazyingArt LLC</p>
18
18
  </div>
19
19
  <label class="language-switch">
20
20
  <span data-i18n="languageLabel">Language</span>
@@ -52,7 +52,9 @@ assert(skipped.skipped === "source-checkout", "source checkout update guard fail
52
52
 
53
53
  const tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "agintiflow-auto-update-"));
54
54
  const previousHome = process.env.AGINTIFLOW_HOME;
55
+ const previousStartupInterval = process.env.AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS;
55
56
  process.env.AGINTIFLOW_HOME = tempHome;
57
+ process.env.AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS = String(24 * 60 * 60 * 1000);
56
58
  await fs.mkdir(tempHome, { recursive: true });
57
59
  await fs.writeFile(
58
60
  path.join(tempHome, "update-check.json"),
@@ -92,5 +94,7 @@ const repeatedSkip = await maybeAutoUpdate({
92
94
  assert(repeatedSkip.skipped === "skipped-version", "cached skipped version was not respected");
93
95
  if (previousHome === undefined) delete process.env.AGINTIFLOW_HOME;
94
96
  else process.env.AGINTIFLOW_HOME = previousHome;
97
+ if (previousStartupInterval === undefined) delete process.env.AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS;
98
+ else process.env.AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS = previousStartupInterval;
95
99
 
96
100
  console.log("auto-update smoke ok");
@@ -8,6 +8,7 @@ import { promisify } from "node:util";
8
8
  const execFileAsync = promisify(execFile);
9
9
  const DEFAULT_PACKAGE_NAME = "@lazyingart/agintiflow";
10
10
  const DEFAULT_CHECK_INTERVAL_MS = 6 * 60 * 60 * 1000;
11
+ const DEFAULT_STARTUP_CHECK_INTERVAL_MS = 0;
11
12
  const DEFAULT_FAILURE_RETRY_MS = 6 * 60 * 60 * 1000;
12
13
  const UPDATE_CHOICES = [
13
14
  {
@@ -97,6 +98,13 @@ export function shouldAutoUpdateCommand(argv = []) {
97
98
  return true;
98
99
  }
99
100
 
101
+ function isStartupUpdateCommand(argv = []) {
102
+ if (!shouldAutoUpdateCommand(argv)) return false;
103
+ const command = String(argv[0] || "").trim();
104
+ if (!command) return true;
105
+ return START_COMMANDS.has(command);
106
+ }
107
+
100
108
  function envDisablesAutoUpdate() {
101
109
  const noValues = [process.env.AGINTIFLOW_NO_AUTO_UPDATE, process.env.AGINTI_NO_AUTO_UPDATE].map((value) => String(value || "").toLowerCase());
102
110
  if (noValues.some((value) => ["1", "true", "yes", "on"].includes(value))) return true;
@@ -139,6 +147,13 @@ function checkIntervalMs() {
139
147
  return Number.isFinite(value) && value >= 0 ? value : DEFAULT_CHECK_INTERVAL_MS;
140
148
  }
141
149
 
150
+ function startupCheckIntervalMs() {
151
+ const raw = process.env.AGINTIFLOW_AUTO_UPDATE_STARTUP_INTERVAL_MS;
152
+ if (raw === undefined || raw === "") return DEFAULT_STARTUP_CHECK_INTERVAL_MS;
153
+ const value = Number(raw);
154
+ return Number.isFinite(value) && value >= 0 ? value : DEFAULT_STARTUP_CHECK_INTERVAL_MS;
155
+ }
156
+
142
157
  function failureRetryMs() {
143
158
  const raw = process.env.AGINTIFLOW_AUTO_UPDATE_FAILURE_RETRY_MS;
144
159
  if (raw === undefined || raw === "") return DEFAULT_FAILURE_RETRY_MS;
@@ -295,7 +310,8 @@ export async function maybeAutoUpdate({
295
310
  const cache = await readCache();
296
311
  let latest = String(cache.latest || "");
297
312
  const checkedAt = Number(cache.checkedAt || 0);
298
- const stale = force || currentMs - checkedAt >= checkIntervalMs();
313
+ const interval = !manual && !force && isStartupUpdateCommand(argv) ? startupCheckIntervalMs() : checkIntervalMs();
314
+ const stale = force || currentMs - checkedAt >= interval;
299
315
 
300
316
  if (stale || !latest) {
301
317
  try {
package/src/i18n.js CHANGED
@@ -114,6 +114,7 @@ const LANGUAGE_ALIASES = new Map(
114
114
  const TRANSLATIONS = {
115
115
  en: {
116
116
  launchSubtitle: "web-first agent workspace",
117
+ launchCredit: "Developed by AgInTi Lab, LazyingArt LLC",
117
118
  launchTagline: "browser + shell + files + docker + web search + scouts",
118
119
  interactiveIntro: "Interactive agent chat. Type /help for commands, /exit to quit.",
119
120
  promptEmpty: "type a request, /help, Enter to send, Ctrl+J for newline",
@@ -567,6 +567,7 @@ function launchTitleLines(contentWidth) {
567
567
 
568
568
  export function buildLaunchHeaderLines({ packageVersion = "", frame = 2, width = terminalWidth(), animated = true, language = cliLanguage } = {}) {
569
569
  const subtitle = t("launchSubtitle", language);
570
+ const credit = t("launchCredit", language);
570
571
  const tagline = t("launchTagline", language);
571
572
  const version = packageVersion ? `v${packageVersion}` : "";
572
573
  const terminalColumns = Math.max(Number(width) || 80, 50);
@@ -584,6 +585,7 @@ export function buildLaunchHeaderLines({ packageVersion = "", frame = 2, width =
584
585
  ...titleLines.map((line) => row(line)),
585
586
  versionLine ? row(versionLine) : "",
586
587
  row(centerLine(subtitle, contentWidth), ansi.dim),
588
+ row(centerLine(credit, contentWidth), ansi.dim),
587
589
  mid,
588
590
  row(centerLine(tagline, contentWidth), ansi.cyan),
589
591
  bottom,